qt5base-lts/cmake/QtPublicWasmToolchainHelpers.cmake
Alexandru Croitor 2ed267c820 CMake: Show error in user projects if wasm toolchain file not found
Rather than fail with obscure can't find Qt packages errors when the
Webassembly CMake toolchain file can not be found, error out with a
clear error on how to ensure it is found.

Pick-to: 6.2
Task-number: QTBUG-96843
Change-Id: I0f34cdcde05efb25c93017f3fd365186335ed52c
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2021-09-27 18:29:44 +02:00

72 lines
2.9 KiB
CMake

# Assuming EMSDK == /path/emsdk
#
# Then we expect /path/emsdk/.emscripten file to contain the following line
# EMSCRIPTEN_ROOT = emsdk_path + '/upstream/emscripten'
#
# then we set out_var to '/upstream/emscripten', so it's not a full path
function(__qt_internal_get_emroot_path_suffix_from_emsdk_env out_var)
# Query EMSCRIPTEN_ROOT path.
file(READ "$ENV{EMSDK}/.emscripten" ver)
string(REGEX MATCH "EMSCRIPTEN_ROOT.*$" EMROOT "${ver}")
string(REGEX MATCH "'([^' ]*)'" EMROOT2 "${EMROOT}")
string(REPLACE "'" "" EMROOT_PATH "${EMROOT2}")
set(${out_var} "${EMROOT_PATH}" PARENT_SCOPE)
endfunction()
function(__qt_internal_get_emscripten_cmake_toolchain_file_path_from_emsdk_env emroot_path out_var)
set(wasm_toolchain_file "$ENV{EMSDK}/${emroot_path}/cmake/Modules/Platform/Emscripten.cmake")
set(${out_var} "${wasm_toolchain_file}" PARENT_SCOPE)
endfunction()
function(__qt_internal_query_emsdk_version emroot_path is_fatal out_var)
# get emscripten version
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
set(EXECUTE_COMMANDPATH "$ENV{EMSDK}/${emroot_path}/emcc.bat")
else()
set(EXECUTE_COMMANDPATH "$ENV{EMSDK}/${emroot_path}/emcc")
endif()
file(TO_NATIVE_PATH "${EXECUTE_COMMANDPATH}" EXECUTE_COMMAND)
execute_process(COMMAND ${EXECUTE_COMMAND} --version
OUTPUT_VARIABLE emOutput
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_VARIABLE emrun_error
RESULT_VARIABLE result)
message(DEBUG "emcc --version output: ${emOutput}")
if(NOT emOutput)
if(is_fatal)
message(FATAL_ERROR
"Couldn't determine Emscripten version from running ${EXECUTE_COMMAND} --version. "
"Error: ${emrun_error}")
endif()
set(${out_var} "" PARENT_SCOPE)
else()
string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" CMAKE_EMSDK_REGEX_VERSION "${emOutput}")
set(${out_var} "${CMAKE_EMSDK_REGEX_VERSION}" PARENT_SCOPE)
endif()
endfunction()
function(__qt_internal_get_emcc_recommended_version out_var)
# This version of Qt needs this version of emscripten.
set(QT_EMCC_RECOMMENDED_VERSION "2.0.14")
set(${out_var} "${QT_EMCC_RECOMMENDED_VERSION}" PARENT_SCOPE)
endfunction()
function(__qt_internal_show_error_no_emscripten_toolchain_file_found_when_building_qt)
message(FATAL_ERROR
"Cannot find the toolchain file Emscripten.cmake. "
"Please specify the toolchain file with -DCMAKE_TOOLCHAIN_FILE=<file> "
"or provide a path to a valid emscripten installation via the EMSDK "
"environment variable.")
endfunction()
function(__qt_internal_show_error_no_emscripten_toolchain_file_found_when_using_qt)
message(FATAL_ERROR
"Cannot find the toolchain file Emscripten.cmake. "
"Please specify the toolchain file with -DQT_CHAINLOAD_TOOLCHAIN_FILE=<file> "
"or provide a path to a valid emscripten installation via the EMSDK "
"environment variable.")
endfunction()