diff --git a/3rdparty/CMakeLists.txt b/3rdparty/CMakeLists.txt index 9251b82d..51900e92 100644 --- a/3rdparty/CMakeLists.txt +++ b/3rdparty/CMakeLists.txt @@ -1,6 +1,7 @@ if(CMAKE_SYSTEM_NAME STREQUAL Emscripten) set(BOOST_INCLUDE_LIBRARIES random stacktrace math) set(BOOST_ENABLE_COMPATIBILITY_TARGETS 1) + add_compile_options(-fdeclspec) # math doesn't build otherwise add_subdirectory(boost EXCLUDE_FROM_ALL) # TODO: make this available via find_package so we wouldn't have to diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d921795..6f3ac262 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,18 @@ if(PSEMEK_BACKEND STREQUAL "ANDROID") set(PSEMEK_GL_LIBRARIES GLESv3 EGL) set(PSEMEK_PACKAGE_AS_LIBRARY ON CACHE INTERNAL "Build applications as shared libraries") list(APPEND PSEMEK_CXX_FLAGS -fPIC) +elseif(CMAKE_SYSTEM_NAME STREQUAL Emscripten) + set(PSEMEK_GL_API gles32) + set(PSEMEK_GL_LIBRARIES EGL) + set(PSEMEK_PACKAGE_AS_LIBRARY OFF CACHE INTERNAL "Build applications as shared libraries") + list(APPEND PSEMEK_DEFINITIONS "-DPSEMEK_GLES=1") + list(APPEND PSEMEK_CXX_FLAGS -sUSE_SDL=2) + # by default emcc doesn't produce catch clauses, but psemek is designed around exceptions + list(APPEND PSEMEK_CXX_FLAGS -sDISABLE_EXCEPTION_CATCHING=0) + if(CMAKE_BUILD_TYPE STREQUAL Debug) + list(APPEND PSEMEK_CXX_FLAGS -g) + endif() + set(CMAKE_EXECUTABLE_SUFFIX ".html" PARENT_SCOPE) # we want to build html, not js else() find_package(Threads REQUIRED) set(OpenGL_GL_PREFERENCE LEGACY) diff --git a/libs/gfx/api/gles32/source/gl.cpp b/libs/gfx/api/gles32/source/gl.cpp index b2561305..8d5f7cea 100644 --- a/libs/gfx/api/gles32/source/gl.cpp +++ b/libs/gfx/api/gles32/source/gl.cpp @@ -11,7 +11,7 @@ #include #elif defined(_WIN32) #include -#elif defined(__ANDROID__) +#elif defined(__ANDROID__) || defined(__EMSCRIPTEN__) #include #else #include @@ -80,7 +80,7 @@ namespace gl return reinterpret_cast(GetProcAddress(image, reinterpret_cast(name))); } - #elif defined(__ANDROID__) + #elif defined(__ANDROID__) || defined(__EMSCRIPTEN__) static void * get_proc_address(const char *func) { diff --git a/libs/log/source/log.cpp b/libs/log/source/log.cpp index a452eca2..448d1ea3 100644 --- a/libs/log/source/log.cpp +++ b/libs/log/source/log.cpp @@ -149,9 +149,11 @@ namespace psemek::log #if __APPLE__ ::pthread_setname_np(name.data()); #else +#if !(defined __EMSCRIPTEN__) || (defined __EMSCRIPTEN_PTHREADS__) ::pthread_setname_np(::pthread_self(), name.data()); #endif #endif +#endif #endif auto id = std::this_thread::get_id(); diff --git a/package/CMakeLists.txt b/package/CMakeLists.txt index 79c0a35d..24105ba7 100644 --- a/package/CMakeLists.txt +++ b/package/CMakeLists.txt @@ -17,7 +17,13 @@ if(PSEMEK_PACKAGE_MODE) set(PSEMEK_PACKAGE_SUFFIX ${PSEMEK_PACKAGE_SUFFIX_RAW} CACHE INTERNAL "Packaging suffix" FORCE) set(PSEMEK_PACKAGE_LINK_FLAGS_RAW) - if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")) + + if(CMAKE_SYSTEM_NAME STREQUAL Emscripten) + list(APPEND PSEMEK_PACKAGE_LINK_FLAGS_RAW "-sMIN_WEBGL_VERSION=2" "-sNO_DISABLE_EXCEPTION_CATCHING") + if(CMAKE_BUILD_TYPE STREQUAL Debug) + list(APPEND PSEMEK_PACKAGE_LINK_FLAGS_RAW "-g") + endif() + elseif((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")) list(APPEND PSEMEK_PACKAGE_LINK_FLAGS_RAW "-static-libgcc" "-static-libstdc++") endif() set(PSEMEK_PACKAGE_LINK_FLAGS ${PSEMEK_PACKAGE_LINK_FLAGS_RAW} CACHE INTERNAL "Packaging CXX flags" FORCE) @@ -67,7 +73,7 @@ function(psemek_add_executable_impl target is_application) ) endif() - if(UNIX AND (NOT APPLE) AND (NOT ANDROID)) + if(UNIX AND (NOT APPLE) AND (NOT ANDROID) AND (NOT (CMAKE_SYSTEM_NAME STREQUAL Emscripten))) add_custom_command(TARGET ${target} POST_BUILD COMMAND chrpath -r . $ )