Browse Source

Merge topic 'emscripten-platform'

d361bf365e Emscripten: Drop hard-coded -sMAIN_MODULE and -sSIDE_MODULE flags
707f14d434 Emscripten: Restore support for indirect use of emsdk toolchain file
8580c6bd8d Tests: Teach RunCMake.Emscripten to tolerate emcc cache output

Acked-by: Kitware Robot <[email protected]>
Merge-request: !11206
Brad King 2 months ago
parent
commit
6b9bd675c9

+ 7 - 15
Modules/Platform/Emscripten-Clang.cmake

@@ -6,24 +6,16 @@ include_guard()
 macro(__emscripten_clang lang)
   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_OBJECTS 1)
   set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_INCLUDES 1)
   set(CMAKE_${lang}_COMPILE_OBJECT
     "<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()

+ 10 - 4
Modules/Platform/Emscripten.cmake

@@ -1,10 +1,16 @@
 # Emscripten provides a combined toolchain file and platform module
-# that predates CMake upstream support.  Avoid interfering with it.
-if(CMAKE_SYSTEM_VERSION EQUAL 1)
-  if(CMAKE_TOOLCHAIN_FILE MATCHES [[/Modules/Platform/Emscripten\.cmake$]])
-    include("${CMAKE_TOOLCHAIN_FILE}")
+# that predates CMake upstream support.  As a toolchain file it sets
+# CMAKE_SYSTEM_VERSION to 1 and points CMAKE_MODULE_PATH to itself.
+# Include it here to preserve its role as a platform module.
+if(CMAKE_SYSTEM_VERSION EQUAL 1 AND CMAKE_MODULE_PATH)
+  find_file(_EMSCRIPTEN_PLATFORM_MODULE NAMES "Platform/Emscripten.cmake"
+    NO_CACHE NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH PATHS ${CMAKE_MODULE_PATH})
+  if(_EMSCRIPTEN_PLATFORM_MODULE)
+    include("${_EMSCRIPTEN_PLATFORM_MODULE}")
+    unset(_EMSCRIPTEN_PLATFORM_MODULE)
     return()
   endif()
+  unset(_EMSCRIPTEN_PLATFORM_MODULE)
 endif()
 
 set(CMAKE_SHARED_LIBRARY_LINK_C_WITH_RUNTIME_PATH ON)

+ 2 - 0
Tests/RunCMake/Emscripten/C-WHOLE_ARCHIVE.cmake

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

+ 2 - 0
Tests/RunCMake/Emscripten/C-lib-shared.cmake

@@ -1,6 +1,8 @@
 enable_language(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)
 target_compile_definitions(exec-lib-c PRIVATE __USE_LIBFUN)
 target_link_libraries(exec-lib-c PRIVATE emscripten-test-lib)
+target_link_options(exec-lib-c PRIVATE -sMAIN_MODULE)

+ 2 - 0
Tests/RunCMake/Emscripten/RunCMakeTest.cmake

@@ -13,12 +13,14 @@ function(run_toolchain case)
   set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${case}-build)
   run_cmake_with_options(${case} ${ARGN})
   set(RunCMake_TEST_NO_CLEAN 1)
+  set(RunCMake_TEST_OUTPUT_MERGE 1)
   run_cmake_command(${case}-build ${CMAKE_COMMAND} --build .)
 endfunction()
 
 macro(run_cmake_target test subtest target)
   set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${test}-build)
   set(RunCMake_TEST_NO_CLEAN 1)
+  set(RunCMake_TEST_OUTPUT_MERGE 1)
   run_cmake_command(${test}-${subtest}-build ${CMAKE_COMMAND} --build . --target ${target} --config Release --verbose ${ARGN})
   unset(RunCMake_TEST_BINARY_DIR)
   unset(RunCMake_TEST_NO_CLEAN)