Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions cmake/system.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ set(WHOA_MAC_10_14 1014)
set(WHOA_MAC_10_15 1015)
set(WHOA_MAC_11_0 1100)
set(WHOA_LINUX_UNK 9999)
set(WHOA_WEB_UNK 9999)

if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
set(WHOA_SYSTEM_WIN 1)
Expand All @@ -36,6 +37,9 @@ elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
set(WHOA_SYSTEM_LINUX 1)
add_definitions(-DWHOA_SYSTEM_LINUX=1)
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
set(WHOA_SYSTEM_WEB 1)
add_definitions(-DWHOA_SYSTEM_WEB=1)
endif()

if(${WHOA_SYSTEM_WIN})
Expand Down Expand Up @@ -83,5 +87,9 @@ elseif(${WHOA_SYSTEM_MAC})
elseif(${WHOA_SYSTEM_LINUX})
set(WHOA_SYSTEM_VERSION ${WHOA_LINUX_UNK})

add_definitions(-DWHOA_SYSTEM_VERSION=${WHOA_SYSTEM_VERSION})
elseif(${WHOA_SYSTEM_WEB})
set(WHOA_SYSTEM_VERSION ${WHOA_WEB_UNK})

add_definitions(-DWHOA_SYSTEM_VERSION=${WHOA_SYSTEM_VERSION})
endif()
73 changes: 73 additions & 0 deletions cmake/toolchain-web.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# Toolchain file for WebAssembly/WebGPU using Emscripten
#
# Usage:
# cmake -DCMAKE_TOOLCHAIN_FILE=lib/system/cmake/toolchain-web.cmake ..
#
# Requires EMSDK environment variable to be set, or emcmake to be in PATH

set(CMAKE_SYSTEM_NAME Emscripten)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SIZEOF_VOID_P 4) # wasm32 uses 32-bit pointers
set(CMAKE_C_BYTE_ORDER LITTLE_ENDIAN)
set(CMAKE_CXX_BYTE_ORDER LITTLE_ENDIAN)

# Find Emscripten
if(DEFINED ENV{EMSDK})
set(EMSDK_PATH "$ENV{EMSDK}")
set(EMSCRIPTEN_ROOT "${EMSDK_PATH}/upstream/emscripten")
elseif(EXISTS "/usr/share/emscripten")
set(EMSCRIPTEN_ROOT "/usr/share/emscripten")
else()
message(FATAL_ERROR "Could not find Emscripten. Set EMSDK environment variable or install Emscripten.")
endif()

# Compilers
set(CMAKE_C_COMPILER "${EMSCRIPTEN_ROOT}/emcc")
set(CMAKE_CXX_COMPILER "${EMSCRIPTEN_ROOT}/em++")
set(CMAKE_AR "${EMSCRIPTEN_ROOT}/emar")
set(CMAKE_RANLIB "${EMSCRIPTEN_ROOT}/emranlib")

# Target environment
set(CMAKE_FIND_ROOT_PATH "${EMSCRIPTEN_ROOT}")
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)

# Output settings
set(CMAKE_EXECUTABLE_SUFFIX ".js")

# WebGPU support (requires Emscripten 3.1.35+)
set(WHOA_WEB_USE_WEBGPU ON CACHE BOOL "Enable WebGPU support")

# Emscripten linker flags
set(WHOA_WEB_LINK_FLAGS "")

# Memory and async support
string(APPEND WHOA_WEB_LINK_FLAGS " -sALLOW_MEMORY_GROWTH=1")

string(APPEND WHOA_WEB_LINK_FLAGS " -sASYNCIFY")
string(APPEND WHOA_WEB_LINK_FLAGS " -sASYNCIFY_DEBUG=0")
string(APPEND WHOA_WEB_LINK_FLAGS " -sEXIT_RUNTIME=0")

# Debug symbols and source maps
string(APPEND WHOA_WEB_LINK_FLAGS " -g")
string(APPEND WHOA_WEB_LINK_FLAGS " -gsource-map")
string(APPEND WHOA_WEB_LINK_FLAGS " --source-map-base ./")

# Filesystem support
string(APPEND WHOA_WEB_LINK_FLAGS " -sFORCE_FILESYSTEM=1")
string(APPEND WHOA_WEB_LINK_FLAGS " -sFETCH=1")

# WebGPU (uses browser's native implementation via emdawnwebgpu bindings)
if(WHOA_WEB_USE_WEBGPU)
set(WHOA_WEB_WEBGPU_PORT "--use-port=emdawnwebgpu")
string(APPEND WHOA_WEB_LINK_FLAGS " ${WHOA_WEB_WEBGPU_PORT}")
endif()

# Export settings
string(APPEND WHOA_WEB_LINK_FLAGS " -sEXPORTED_RUNTIME_METHODS=['ccall','cwrap']")

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WHOA_WEB_WEBGPU_PORT}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WHOA_WEB_WEBGPU_PORT}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${WHOA_WEB_LINK_FLAGS}")