From 69d218e58a9a2180c9fbc1d6d6d82aa10bc6b3c1 Mon Sep 17 00:00:00 2001 From: Leon Styhre Date: Thu, 13 Jan 2022 20:32:30 +0100 Subject: [PATCH] Added CMake configuration for Emscripten WebAssembly builds. --- CMakeLists.txt | 61 +++++++++++++++++++++++++++++++++++++++-- external/CMakeLists.txt | 4 +++ 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b280f9db9..e484a733b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,6 +60,14 @@ if(CLANG_TIDY) endif() endif() +#--------------------------------------------------------------------------------------------------- +# Emscripten WebAssembly build. + +if(EMSCRIPTEN) + set(GLES ON) + set(CMAKE_EXECUTABLE_SUFFIX ".html") +endif() + #--------------------------------------------------------------------------------------------------- # OpenGL setup. @@ -103,7 +111,7 @@ if(GLSYSTEM MATCHES "Desktop OpenGL") find_package(OpenGL REQUIRED) elseif(GLES1) find_package(OpenGLES REQUIRED) -elseif(GLES) +elseif(GLES AND NOT EMSCRIPTEN) find_package(OpenGLES2 REQUIRED) endif() @@ -118,7 +126,7 @@ elseif(WIN32) NOT EXISTS ${PROJECT_SOURCE_DIR}/external/pugixml/pugixml.dll) # MSVC message(FATAL_ERROR "-- You need to build the dependencies in ./external first") endif() -else() +elseif(NOT EMSCRIPTEN) find_package(CURL REQUIRED) find_package(FFmpeg REQUIRED) find_package(FreeImage REQUIRED) @@ -202,6 +210,15 @@ else() endif() endif() +if(EMSCRIPTEN) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s INITIAL_MEMORY=33554432 -s ALLOW_MEMORY_GROWTH=1 -s WASM=1 -s ASSERTIONS=1 -s EXIT_RUNTIME=1 -s USE_SDL=2 \ + -pthread -s PTHREAD_POOL_SIZE=4 -s DEMANGLE_SUPPORT=1 -s USE_WEBGL2=1 -s FULL_ES2=1 -s ERROR_ON_UNDEFINED_SYMBOLS=1 -s ASYNCIFY \ + --preload-file ${PROJECT_SOURCE_DIR}/resources@/home/web_user/.emulationstation/resources/ \ + --preload-file ${PROJECT_SOURCE_DIR}/themes/rbsimple-DE@/home/web_user/.emulationstation/themes/rbsimple-DE/ \ + --preload-file ${PROJECT_SOURCE_DIR}/ROMs@/home/web_user/ROMs/") +endif() + # Raspberry Pi model 3 and higher (ARM Cortex-A53 minimum). if(RPI_32) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -latomic -mcpu=cortex-a53 -mfpu=neon-fp-armv8") @@ -346,6 +363,13 @@ elseif(WIN32) ${CMAKE_CURRENT_SOURCE_DIR}/external/freetype/include ${CMAKE_CURRENT_SOURCE_DIR}/external/pugixml/src ${CMAKE_CURRENT_SOURCE_DIR}/external/SDL2-2.0.18) +elseif(EMSCRIPTEN) + set(COMMON_INCLUDE_DIRS ${COMMON_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR}/external/curl/include + ${CMAKE_CURRENT_SOURCE_DIR}/external/ffmpeg.wasm-core + ${CMAKE_CURRENT_SOURCE_DIR}/external/FreeImage-CMake/FreeImage/Source + ${CMAKE_CURRENT_SOURCE_DIR}/external/freetype/include + ${CMAKE_CURRENT_SOURCE_DIR}/external/pugixml/src) else() set(COMMON_INCLUDE_DIRS ${COMMON_INCLUDE_DIRS} ${FFMPEG_INCLUDE_DIRS} @@ -423,6 +447,39 @@ elseif(WIN32) mingw32 Winmm.dll) endif() +elseif(EMSCRIPTEN) + set(COMMON_LIBRARIES ${COMMON_LIBRARIES} + # FFmpeg core libraries. + ${PROJECT_SOURCE_DIR}/libavcodec.a + ${PROJECT_SOURCE_DIR}/libavfilter.a + ${PROJECT_SOURCE_DIR}/libavformat.a + ${PROJECT_SOURCE_DIR}/libavutil.a + ${PROJECT_SOURCE_DIR}/libpostproc.a + ${PROJECT_SOURCE_DIR}/libswresample.a + ${PROJECT_SOURCE_DIR}/libswscale.a + # FFmpeg third party libraries. + ${PROJECT_SOURCE_DIR}/libx264.a + ${PROJECT_SOURCE_DIR}/libx265.a + ${PROJECT_SOURCE_DIR}/libass.a + ${PROJECT_SOURCE_DIR}/libfdk-aac.a + ${PROJECT_SOURCE_DIR}/libfribidi.a + ${PROJECT_SOURCE_DIR}/libharfbuzz.a + ${PROJECT_SOURCE_DIR}/libmp3lame.a + ${PROJECT_SOURCE_DIR}/libogg.a + ${PROJECT_SOURCE_DIR}/libopus.a + ${PROJECT_SOURCE_DIR}/libtheoradec.a + ${PROJECT_SOURCE_DIR}/libtheoraenc.a + ${PROJECT_SOURCE_DIR}/libvorbis.a + ${PROJECT_SOURCE_DIR}/libvorbisenc.a + ${PROJECT_SOURCE_DIR}/libvorbisfile.a + ${PROJECT_SOURCE_DIR}/libvpx.a + ${PROJECT_SOURCE_DIR}/libwavpack.a + ${PROJECT_SOURCE_DIR}/libz.a + # Other dependencies. + ${PROJECT_SOURCE_DIR}/libcurl.a + ${PROJECT_SOURCE_DIR}/libFreeImage.a + ${PROJECT_SOURCE_DIR}/libfreetype.a + ${PROJECT_SOURCE_DIR}/libpugixml.a) else() set(COMMON_LIBRARIES ${CURL_LIBRARIES} ${FFMPEG_LIBRARIES} diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt index 391f46b17..a3faf99c9 100644 --- a/external/CMakeLists.txt +++ b/external/CMakeLists.txt @@ -22,4 +22,8 @@ option(LOTTIE_MODULE OFF) unset(CMAKE_CXX_FLAGS) unset(CMAKE_EXE_LINKER_FLAGS) +if(EMSCRIPTEN) + set(CMAKE_CXX_FLAGS "-pthread") +endif() + add_subdirectory("rlottie" EXCLUDE_FROM_ALL)