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) 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) 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}) # Create an executable from .c sources only. run_toolchain(emscripten-c -DCMAKE_SYSTEM_NAME=Emscripten -DCMAKE_C_COMPILER=${c_comp} ) # Create an executable from .c and .cxx sources. run_toolchain(emscripten-cxx -DCMAKE_SYSTEM_NAME=Emscripten -DCMAKE_C_COMPILER=${c_comp} -DCMAKE_CXX_COMPILER=${cxx_comp} ) # Create a library and executable from .c sources. run_toolchain(emscripten-lib -DCMAKE_SYSTEM_NAME=Emscripten -DCMAKE_C_COMPILER=${c_comp} ) run_cmake_with_options(emscripten-WHOLE_ARCHIVE -DCMAKE_SYSTEM_NAME=Emscripten -DCMAKE_C_COMPILER=${c_comp} ) run_cmake_target(emscripten-WHOLE_ARCHIVE link-exe main) run_cmake_target(emscripten-WHOLE_ARCHIVE circular-exe main_circular) endforeach()