diff --git a/Help/manual/cmake-toolchains.7.rst b/Help/manual/cmake-toolchains.7.rst index 9eee2191f2..cbd1f74b69 100644 --- a/Help/manual/cmake-toolchains.7.rst +++ b/Help/manual/cmake-toolchains.7.rst @@ -704,3 +704,22 @@ the next rules to make device + simulator configuration work: - Use :command:`find_package` only for libraries installed with :variable:`CMAKE_IOS_INSTALL_COMBINED` feature + +.. _`Cross Compiling for Emscripten`: + +Cross Compiling for Emscripten +------------------------------ + +.. versionadded:: 4.2 + +A toolchain file may configure cross-compiling for `Emscripten`_ by +setting the :variable:`CMAKE_SYSTEM_NAME` variable to ``Emscripten``. +For example, a toolchain file might contain: + +.. code-block:: cmake + + set(CMAKE_SYSTEM_NAME Emscripten) + set(CMAKE_C_COMPILER /path/to/emcc) + set(CMAKE_CXX_COMPILER /path/to/em++) + +.. _`Emscripten`: https://emscripten.org/ diff --git a/Help/release/dev/emscripten-platform.rst b/Help/release/dev/emscripten-platform.rst new file mode 100644 index 0000000000..4757227b2a --- /dev/null +++ b/Help/release/dev/emscripten-platform.rst @@ -0,0 +1,5 @@ +emscripten-platform +------------------- + +* CMake now supports :ref:`Cross Compiling for Emscripten` with simple + toolchain files. diff --git a/Modules/CMakeFindBinUtils.cmake b/Modules/CMakeFindBinUtils.cmake index 7314e04335..bdc89c0f12 100644 --- a/Modules/CMakeFindBinUtils.cmake +++ b/Modules/CMakeFindBinUtils.cmake @@ -219,6 +219,11 @@ else() list(PREPEND _CMAKE_LINKER_NAMES "armlink") endif() + if(EMSCRIPTEN) + list(PREPEND _CMAKE_AR_NAMES "emar") + list(PREPEND _CMAKE_RANLIB_NAMES "emranlib") + endif() + list(APPEND _CMAKE_TOOL_VARS AR RANLIB STRIP LINKER NM OBJDUMP OBJCOPY READELF DLLTOOL ADDR2LINE TAPI) endif() diff --git a/Modules/Platform/Emscripten-Clang-C.cmake b/Modules/Platform/Emscripten-Clang-C.cmake new file mode 100644 index 0000000000..1b6b2ab4cf --- /dev/null +++ b/Modules/Platform/Emscripten-Clang-C.cmake @@ -0,0 +1,3 @@ +include(Platform/Emscripten-Clang) + +__emscripten_clang(C) diff --git a/Modules/Platform/Emscripten-Clang-CXX.cmake b/Modules/Platform/Emscripten-Clang-CXX.cmake new file mode 100644 index 0000000000..32b913ee1f --- /dev/null +++ b/Modules/Platform/Emscripten-Clang-CXX.cmake @@ -0,0 +1,3 @@ +include(Platform/Emscripten-Clang) + +__emscripten_clang(CXX) diff --git a/Modules/Platform/Emscripten-Clang.cmake b/Modules/Platform/Emscripten-Clang.cmake new file mode 100644 index 0000000000..88cb197f80 --- /dev/null +++ b/Modules/Platform/Emscripten-Clang.cmake @@ -0,0 +1,17 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file LICENSE.rst or https://cmake.org/licensing for details. + +include_guard() + +macro(__emscripten_clang lang) + set(CMAKE_SHARED_LIBRARY_SONAME_${lang}_FLAG "-Wl,-soname,") + set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "-sSIDE_MODULE") + + 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 + " -c -o -fPIC") + set(CMAKE_${lang}_LINK_EXECUTABLE + " -o -sMAIN_MODULE") +endmacro() diff --git a/Modules/Platform/Emscripten-Initialize.cmake b/Modules/Platform/Emscripten-Initialize.cmake new file mode 100644 index 0000000000..3117e05e21 --- /dev/null +++ b/Modules/Platform/Emscripten-Initialize.cmake @@ -0,0 +1,2 @@ +set(EMSCRIPTEN 1) +set(UNIX 1) diff --git a/Modules/Platform/Emscripten.cmake b/Modules/Platform/Emscripten.cmake new file mode 100644 index 0000000000..8157d47b70 --- /dev/null +++ b/Modules/Platform/Emscripten.cmake @@ -0,0 +1,6 @@ +set(CMAKE_SHARED_LIBRARY_LINK_C_WITH_RUNTIME_PATH ON) + +set(CMAKE_SHARED_LIBRARY_SUFFIX ".wasm") +set(CMAKE_EXECUTABLE_SUFFIX ".js") + +set(CMAKE_DL_LIBS "") diff --git a/Modules/Platform/Linker/Emscripten-C.cmake b/Modules/Platform/Linker/Emscripten-C.cmake new file mode 100644 index 0000000000..dfef6a3d7b --- /dev/null +++ b/Modules/Platform/Linker/Emscripten-C.cmake @@ -0,0 +1,4 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file LICENSE.rst or https://cmake.org/licensing for details. + +include(Platform/Linker/Emscripten-LLD-C) diff --git a/Modules/Platform/Linker/Emscripten-CXX.cmake b/Modules/Platform/Linker/Emscripten-CXX.cmake new file mode 100644 index 0000000000..90bb8205da --- /dev/null +++ b/Modules/Platform/Linker/Emscripten-CXX.cmake @@ -0,0 +1,4 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file LICENSE.rst or https://cmake.org/licensing for details. + +include(Platform/Linker/Emscripten-LLD-CXX) diff --git a/Modules/Platform/Linker/Emscripten-LLD-C.cmake b/Modules/Platform/Linker/Emscripten-LLD-C.cmake new file mode 100644 index 0000000000..448d7cc548 --- /dev/null +++ b/Modules/Platform/Linker/Emscripten-LLD-C.cmake @@ -0,0 +1,6 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file LICENSE.rst or https://cmake.org/licensing for details. + +include(Platform/Linker/Emscripten-LLD) + +__emscripten_linker_lld(C) diff --git a/Modules/Platform/Linker/Emscripten-LLD-CXX.cmake b/Modules/Platform/Linker/Emscripten-LLD-CXX.cmake new file mode 100644 index 0000000000..63d71b4d86 --- /dev/null +++ b/Modules/Platform/Linker/Emscripten-LLD-CXX.cmake @@ -0,0 +1,6 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file LICENSE.rst or https://cmake.org/licensing for details. + +include(Platform/Linker/Emscripten-LLD) + +__emscripten_linker_lld(CXX) diff --git a/Modules/Platform/Linker/Emscripten-LLD.cmake b/Modules/Platform/Linker/Emscripten-LLD.cmake new file mode 100644 index 0000000000..4c02cf7ba4 --- /dev/null +++ b/Modules/Platform/Linker/Emscripten-LLD.cmake @@ -0,0 +1,11 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file LICENSE.rst or https://cmake.org/licensing for details. + +# This module is shared by multiple languages; use include blocker. +include_guard() + +macro(__emscripten_linker_lld lang) + set(CMAKE_${lang}_LINK_LIBRARY_USING_WHOLE_ARCHIVE "-Wl,--whole-archive" "" "-Wl,--no-whole-archive") + set(CMAKE_${lang}_LINK_LIBRARY_USING_WHOLE_ARCHIVE_SUPPORTED TRUE) + set(CMAKE_${lang}_LINK_LIBRARY_WHOLE_ARCHIVE_ATTRIBUTES LIBRARY_TYPE=STATIC DEDUPLICATION=YES OVERRIDE=DEFAULT) +endmacro() diff --git a/Source/cmCoreTryCompile.cxx b/Source/cmCoreTryCompile.cxx index eb8f616020..4a2f163a0a 100644 --- a/Source/cmCoreTryCompile.cxx +++ b/Source/cmCoreTryCompile.cxx @@ -1386,6 +1386,14 @@ void cmCoreTryCompile::FindOutputFile(std::string const& targetName) return; } + if (cmHasLiteralSuffix(outputFileLocation, ".js")) { + std::string wasmOutputLocation = cmStrCat( + outputFileLocation.substr(0, outputFileLocation.length() - 3), ".wasm"); + if (cmSystemTools::FileExists(wasmOutputLocation)) { + outputFileLocation = wasmOutputLocation; + } + } + this->OutputFile = cmSystemTools::CollapseFullPath(outputFileLocation); }