| include(RunCMake) |
| |
| # Locate Emscripten toolchain |
| if(RunCMake_GENERATOR MATCHES "Makefile|Ninja") |
| file(GLOB _emscripten_toolchains |
| "${CMake_TEST_Emscripten_TOOLCHAINS}/emcc" ) |
| if(_emscripten_toolchains STREQUAL "") |
| message(FATAL_ERROR "Could not find any Emscripten toolchains at: ${CMake_TEST_Emscripten_TOOLCHAINS}.") |
| endif() |
| endif() |
| |
| 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) |
| endmacro() |
| |
| foreach(_emscripten_toolchain IN LISTS _emscripten_toolchains) |
| message(STATUS "Found Emscripten toolchain: ${_emscripten_toolchain}") |
| cmake_path(GET _emscripten_toolchain PARENT_PATH BIN_DIR) |
| |
| if (WIN32) |
| set(EMCC_SUFFIX ".bat") |
| else() |
| set(EMCC_SUFFIX "") |
| endif() |
| |
| set(c_comp ${BIN_DIR}/emcc${EMCC_SUFFIX}) |
| set(cxx_comp ${BIN_DIR}/em++${EMCC_SUFFIX}) |
| set(comp_ar ${BIN_DIR}/emar${EMCC_SUFFIX}) |
| |
| # Compiler inspection. |
| run_cmake_with_options(C-enable |
| -DCMAKE_SYSTEM_NAME=Emscripten |
| -DCMAKE_C_COMPILER=${c_comp} |
| ) |
| |
| # Create an executable from .c sources only. |
| run_toolchain(C-exe |
| -DCMAKE_SYSTEM_NAME=Emscripten |
| -DCMAKE_C_COMPILER=${c_comp} |
| ) |
| |
| # Create an executable from .c and .cxx sources. |
| run_toolchain(CXX-exe |
| -DCMAKE_SYSTEM_NAME=Emscripten |
| -DCMAKE_C_COMPILER=${c_comp} |
| -DCMAKE_CXX_COMPILER=${cxx_comp} |
| ) |
| |
| # Create a static library and executable from .c sources. |
| run_toolchain(C-lib-static |
| -DCMAKE_SYSTEM_NAME=Emscripten |
| -DCMAKE_C_COMPILER=${c_comp} |
| ) |
| |
| # Create a shared library and executable from .c sources. |
| run_toolchain(C-lib-shared |
| -DCMAKE_SYSTEM_NAME=Emscripten |
| -DCMAKE_C_COMPILER=${c_comp} |
| ) |
| |
| run_toolchain(C-lib-circular |
| -DCMAKE_SYSTEM_NAME=Emscripten |
| -DCMAKE_C_COMPILER=${c_comp} |
| ) |
| |
| run_cmake_with_options(C-WHOLE_ARCHIVE |
| -DCMAKE_SYSTEM_NAME=Emscripten |
| -DCMAKE_C_COMPILER=${c_comp} |
| ) |
| run_cmake_target(C-WHOLE_ARCHIVE link-exe main) |
| run_cmake_target(C-WHOLE_ARCHIVE circular-exe main_circular) |
| |
| run_cmake_with_options(C-CheckTypeSize |
| -DCMAKE_SYSTEM_NAME=Emscripten |
| -DCMAKE_C_COMPILER=${c_comp} |
| ) |
| |
| if(CMake_TEST_Emscripten_NODE) |
| run_cmake_with_options(C-try_run |
| -DCMAKE_SYSTEM_NAME=Emscripten |
| -DCMAKE_CROSSCOMPILING_EMULATOR=${CMake_TEST_Emscripten_NODE} |
| -DCMAKE_C_COMPILER=${c_comp} |
| ) |
| endif() |
| endforeach() |