1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-14 10:47:59 +08:00

Emscripten: Drop hard-coded -sMAIN_MODULE and -sSIDE_MODULE flags

These flags are only needed for builds involving shared libraries,
and can cause undesirable behavior when they are not needed.
They also have variants with values like `=2`.  For now, just require
projects to add the flags when needed so they have full control.
In the future we may be able to add an abstraction to control them,
and automatically enable them when linking to shared libraries
or creating them.

Fixes: #27232
Issue: #27240
This commit is contained in:
Brad King
2025-09-18 10:49:00 -04:00
parent 707f14d434
commit d361bf365e
3 changed files with 11 additions and 15 deletions

View File

@@ -6,24 +6,16 @@ include_guard()
macro(__emscripten_clang lang) macro(__emscripten_clang lang)
set(CMAKE_SHARED_LIBRARY_SONAME_${lang}_FLAG "-Wl,-soname,") set(CMAKE_SHARED_LIBRARY_SONAME_${lang}_FLAG "-Wl,-soname,")
# FIXME(#27240): We do not add -sMAIN_MODULE to CMAKE_${lang}_LINK_EXECUTABLE
# because it is not always needed, and can break things if added unnecessarily.
# We also do not add -sMAIN_MODULE to CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS
# to preserve legacy behavior in which projects added it as needed.
# In the future we may add both flags with suitable controls.
set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "")
set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_LIBRARIES 1) set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_LIBRARIES 1)
set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_OBJECTS 1) set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_OBJECTS 1)
set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_INCLUDES 1) set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_INCLUDES 1)
set(CMAKE_${lang}_COMPILE_OBJECT set(CMAKE_${lang}_COMPILE_OBJECT
"<CMAKE_${lang}_COMPILER> -c <SOURCE> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -fPIC") "<CMAKE_${lang}_COMPILER> -c <SOURCE> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -fPIC")
get_property(_TARGET_SUPPORTS_SHARED_LIBS GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS)
if(_TARGET_SUPPORTS_SHARED_LIBS)
# Emscripten requires '-sMAIN_MODULE' and '-sSIDE_MODULE' to distinguish
# linking executables from linking shared libraries. Place them early
# so that project-specified link flags can override them.
set(CMAKE_${lang}_LINK_EXECUTABLE
"<CMAKE_${lang}_COMPILER> -sMAIN_MODULE <FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "-sSIDE_MODULE")
else()
# Emscripten provides a combined toolchain file and platform module that
# predates CMake upstream support. It turns off support for shared libraries.
# Avoid linking with '-sMAIN_MODULE' or '-sSIDE_MODULE' in that case.
set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "")
endif()
endmacro() endmacro()

View File

@@ -6,9 +6,11 @@ target_compile_definitions(base PUBLIC STATIC_BASE)
add_library(lib SHARED lib.c) add_library(lib SHARED lib.c)
target_link_libraries(lib PRIVATE "$<LINK_LIBRARY:WHOLE_ARCHIVE,base>") target_link_libraries(lib PRIVATE "$<LINK_LIBRARY:WHOLE_ARCHIVE,base>")
target_link_options(lib PRIVATE -sSIDE_MODULE)
add_executable(main main.c) add_executable(main main.c)
target_link_libraries(main PRIVATE lib) target_link_libraries(main PRIVATE lib)
target_link_options(main PRIVATE -sMAIN_MODULE)
add_library(circular1 STATIC circular1.c) add_library(circular1 STATIC circular1.c)
add_library(circular2 STATIC circular2.c) add_library(circular2 STATIC circular2.c)

View File

@@ -1,6 +1,8 @@
enable_language(C) enable_language(C)
add_library(emscripten-test-lib SHARED libmod.c) add_library(emscripten-test-lib SHARED libmod.c)
target_link_options(emscripten-test-lib PRIVATE -sSIDE_MODULE)
add_executable(exec-lib-c module.c) add_executable(exec-lib-c module.c)
target_compile_definitions(exec-lib-c PRIVATE __USE_LIBFUN) target_compile_definitions(exec-lib-c PRIVATE __USE_LIBFUN)
target_link_libraries(exec-lib-c PRIVATE emscripten-test-lib) target_link_libraries(exec-lib-c PRIVATE emscripten-test-lib)
target_link_options(exec-lib-c PRIVATE -sMAIN_MODULE)