qt5base-lts/cmake/QtPublicWasmToolchainHelpers.cmake
Lorn Potter b515fa56a3 wasm: add Emscripten version check for apps
This will tell developers if they are using the wrong version which may
not build or might cause other issues.

Pick-to: 6.4
Fixes: QTBUG-105922
Change-Id: Ic5c4549d5637182dce380e415f131e33a4da416f
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
2022-09-01 11:17:30 +10:00

100 lines
4.3 KiB
CMake

# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
# 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 "3.1.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()
function(__qt_internal_get_qt_build_emsdk_version out_var)
if(EXISTS "${QT6_INSTALL_PREFIX}/src/corelib/global/qconfig.h")
file(READ "${QT6_INSTALL_PREFIX}/src/corelib/global/qconfig.h" ver)
else()
file(READ "${QT6_INSTALL_PREFIX}/include/QtCore/qconfig.h" ver)
endif()
string(REGEX MATCH "#define QT_EMCC_VERSION.\"[0-9]+\\.[0-9]+\\.[0-9]+\"" emOutput ${ver})
string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" build_emcc_version "${emOutput}")
set(${out_var} "${build_emcc_version}" PARENT_SCOPE)
endfunction()
function(_qt_test_emscripten_version)
__qt_internal_get_emcc_recommended_version(_recommended_emver)
__qt_internal_get_emroot_path_suffix_from_emsdk_env(emroot_path)
__qt_internal_query_emsdk_version("${emroot_path}" TRUE current_emsdk_ver)
__qt_internal_get_qt_build_emsdk_version(qt_build_emcc_version)
if(NOT "${qt_build_emcc_version}" STREQUAL "${current_emsdk_ver}")
message("Qt Wasm built with Emscripten version: ${qt_build_emcc_version}")
message("You are using Emscripten version: ${current_emsdk_ver}")
message("The recommended version of Emscripten for this Qt is: ${_recommended_emver}")
message("This may not work correctly")
endif()
endfunction()