Skip to content

Commit 5b69863

Browse files
jdfJonathan Feinbergclaude
authored
[wasm32-emscripten] Apply VCPKG_C(XX)_FLAGS via a wrapper toolchain (#52925)
Co-authored-by: Jonathan Feinberg <[email protected]> Co-authored-by: Claude Fable 5 <[email protected]>
1 parent abc9508 commit 5b69863

2 files changed

Lines changed: 51 additions & 1 deletion

File tree

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
if(NOT _VCPKG_EMSCRIPTEN_TOOLCHAIN)
2+
set(_VCPKG_EMSCRIPTEN_TOOLCHAIN 1)
3+
4+
list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES
5+
VCPKG_CRT_LINKAGE VCPKG_TARGET_ARCHITECTURE
6+
VCPKG_C_FLAGS VCPKG_CXX_FLAGS
7+
VCPKG_C_FLAGS_DEBUG VCPKG_CXX_FLAGS_DEBUG
8+
VCPKG_C_FLAGS_RELEASE VCPKG_CXX_FLAGS_RELEASE
9+
VCPKG_LINKER_FLAGS VCPKG_LINKER_FLAGS_RELEASE VCPKG_LINKER_FLAGS_DEBUG
10+
)
11+
12+
if(NOT DEFINED ENV{EMSCRIPTEN_ROOT})
13+
find_path(EMSCRIPTEN_ROOT "emcc")
14+
else()
15+
set(EMSCRIPTEN_ROOT "$ENV{EMSCRIPTEN_ROOT}")
16+
endif()
17+
18+
if(NOT EMSCRIPTEN_ROOT)
19+
if(NOT DEFINED ENV{EMSDK})
20+
message(FATAL_ERROR "The emcc compiler not found in PATH")
21+
endif()
22+
set(EMSCRIPTEN_ROOT "$ENV{EMSDK}/upstream/emscripten")
23+
endif()
24+
25+
if(NOT EXISTS "${EMSCRIPTEN_ROOT}/cmake/Modules/Platform/Emscripten.cmake")
26+
message(FATAL_ERROR "Emscripten.cmake toolchain file not found")
27+
endif()
28+
29+
include("${EMSCRIPTEN_ROOT}/cmake/Modules/Platform/Emscripten.cmake")
30+
31+
string(APPEND CMAKE_C_FLAGS_INIT " ${VCPKG_C_FLAGS} ")
32+
string(APPEND CMAKE_CXX_FLAGS_INIT " ${VCPKG_CXX_FLAGS} ")
33+
string(APPEND CMAKE_C_FLAGS_DEBUG_INIT " ${VCPKG_C_FLAGS_DEBUG} ")
34+
string(APPEND CMAKE_CXX_FLAGS_DEBUG_INIT " ${VCPKG_CXX_FLAGS_DEBUG} ")
35+
string(APPEND CMAKE_C_FLAGS_RELEASE_INIT " ${VCPKG_C_FLAGS_RELEASE} ")
36+
string(APPEND CMAKE_CXX_FLAGS_RELEASE_INIT " ${VCPKG_CXX_FLAGS_RELEASE} ")
37+
38+
string(APPEND CMAKE_MODULE_LINKER_FLAGS_INIT " ${VCPKG_LINKER_FLAGS} ")
39+
string(APPEND CMAKE_SHARED_LINKER_FLAGS_INIT " ${VCPKG_LINKER_FLAGS} ")
40+
string(APPEND CMAKE_EXE_LINKER_FLAGS_INIT " ${VCPKG_LINKER_FLAGS} ")
41+
string(APPEND CMAKE_MODULE_LINKER_FLAGS_DEBUG_INIT " ${VCPKG_LINKER_FLAGS_DEBUG} ")
42+
string(APPEND CMAKE_SHARED_LINKER_FLAGS_DEBUG_INIT " ${VCPKG_LINKER_FLAGS_DEBUG} ")
43+
string(APPEND CMAKE_EXE_LINKER_FLAGS_DEBUG_INIT " ${VCPKG_LINKER_FLAGS_DEBUG} ")
44+
string(APPEND CMAKE_MODULE_LINKER_FLAGS_RELEASE_INIT " ${VCPKG_LINKER_FLAGS_RELEASE} ")
45+
string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE_INIT " ${VCPKG_LINKER_FLAGS_RELEASE} ")
46+
string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE_INIT " ${VCPKG_LINKER_FLAGS_RELEASE} ")
47+
endif()

‎triplets/community/wasm32-emscripten.cmake‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,7 @@ set(VCPKG_TARGET_ARCHITECTURE wasm32)
2121
set(VCPKG_CRT_LINKAGE dynamic)
2222
set(VCPKG_LIBRARY_LINKAGE static)
2323
set(VCPKG_CMAKE_SYSTEM_NAME Emscripten)
24-
set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${EMSCRIPTEN_ROOT}/cmake/Modules/Platform/Emscripten.cmake")
24+
# Chainload vcpkg's wrapper toolchain rather than Emscripten.cmake directly:
25+
# the wrapper includes Emscripten.cmake and then applies VCPKG_C(XX)_FLAGS
26+
# and VCPKG_LINKER_FLAGS, which would otherwise be silently dropped.
27+
set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${VCPKG_ROOT_DIR}/scripts/toolchains/emscripten.cmake")

0 commit comments

Comments
 (0)