# Emscripten toolchain for SCOLDEPS WebAssembly builds cmake_minimum_required(VERSION 3.6) # Define Emscripten platform set(EMSCRIPTEN True) set(CMAKE_SYSTEM_NAME Emscripten) set(CMAKE_SYSTEM_VERSION 1) set(CMAKE_SYSTEM_PROCESSOR wasm) # Include Emscripten's platform module include("$ENV{SCOL_DEPENDENCIES_PATH}/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake") # Set installation prefix set(SCOL_INSTALL_PREFIX "emscripten") # Specify Emscripten compilers and tools set(CMAKE_C_COMPILER emcc) set(CMAKE_CXX_COMPILER em++) set(CMAKE_AR emar CACHE FILEPATH "Archiver") set(CMAKE_RANLIB emranlib CACHE FILEPATH "Ranlib") set(CMAKE_LINKER emcc CACHE FILEPATH "Linker") set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # Set find root path to Emscripten's sysroot set(CMAKE_FIND_ROOT_PATH $ENV{SCOL_DEPENDENCIES_PATH}/emsdk/upstream/emscripten/cache/sysroot) list(APPEND CMAKE_FIND_ROOT_PATH $ENV{SCOL_DEPENDENCIES_PATH}/emsdk/upstream/emscripten/cache/sysroot/lib $ENV{SCOL_DEPENDENCIES_PATH}/emsdk/upstream/emscripten/cache/sysroot/usr/lib $ENV{SCOL_DEPENDENCIES_PATH}/emsdk/upstream/emscripten/cache/sysroot/include ) # Restrict find_xxx() to Emscripten sysroot set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) # Configure pkg-config for Emscripten set(ENV{PKG_CONFIG_PATH} "$ENV{SCOL_DEPENDENCIES_PATH}/emsdk/upstream/emscripten/cache/sysroot/lib/pkgconfig") # Compiler flags with explicit sysroot include set(CMAKE_C_FLAGS "-O3 -fsigned-char -s USE_PTHREADS=1 -s WASM=1 -s FULL_ES3=1 -s ALLOW_MEMORY_GROWTH=1 -Wno-error=maybe-uninitialized -Wno-error=uninitialized" CACHE STRING "C flags") set(CMAKE_CXX_FLAGS "-O3 -fsigned-char -s USE_PTHREADS=1 -s WASM=1 -s FULL_ES3=1 -s ALLOW_MEMORY_GROWTH=1 -Wno-error=maybe-uninitialized -Wno-error=uninitialized -std=c++11" CACHE STRING "C++ flags") # Build type specific flags set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "C Release flags") set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "C++ Release flags") set(CMAKE_C_FLAGS_DEBUG "-O0 -g -DDEBUG -D_DEBUG" CACHE STRING "C Debug flags") set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -DDEBUG -D_DEBUG" CACHE STRING "C++ Debug flags") # Linker flags with ports # -s USE_ZLIB=1 -s USE_LIBPNG=1 -s USE_FREETYPE=1 set(CMAKE_EXE_LINKER_FLAGS "-s EXPORTED_FUNCTIONS=_main,_malloc,_free -s EXPORTED_RUNTIME_METHODS=ccall,cwrap -s MODULARIZE=1 -s EXPORT_NAME=Module" CACHE STRING "Executable linker flags") set(CMAKE_SHARED_LINKER_FLAGS "-s EXPORTED_FUNCTIONS=_malloc,_free -s MODULARIZE=1" CACHE STRING "Shared library linker flags") # Library and executable suffixes set(CMAKE_EXECUTABLE_SUFFIX ".mjs" CACHE STRING "Executable suffix") set(CMAKE_STATIC_LIBRARY_SUFFIX ".a" CACHE STRING "Static library suffix") set(CMAKE_SHARED_LIBRARY_SUFFIX ".wasm" CACHE STRING "Shared library suffix") set(CMAKE_FIND_LIBRARY_SUFFIXES .a .wasm) # Prefer static libraries set(CMAKE_FIND_LIBRARY_PREFIXES "" "lib") # Define platform macros add_definitions(-DEMSCRIPTEN -D__EMSCRIPTEN__) # Skip RPATH for WebAssembly set(CMAKE_SKIP_RPATH 1) # Ensure static libraries are not forced to bitcode set(EMSCRIPTEN_GENERATE_BITCODE_STATIC_LIBRARIES OFF CACHE BOOL "Generate bitcode for static libraries" FORCE) # Enable verbose output for debugging set(CMAKE_VERBOSE_MAKEFILE ON CACHE BOOL "Verbose output" FORCE)