# Copyright (C) 2024 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause cmake_minimum_required(VERSION 3.16) # Query the var name from the CMake cache or the environment or use a default value. function(qt_internal_get_cmake_or_env_or_default out_var var_name_to_check default_value) if(${var_name_to_check}) set(value "${var_name_to_check}") elseif(DEFINED ENV{${var_name_to_check}}) set(value "$ENV{${var_name_to_check}}") else() set(value "${default_value}") endif() set(${out_var} "${value}" PARENT_SCOPE) endfunction() # Prepares paths for the cloning of the sources, the build and the installation. function(qt_internal_prepare_build_paths) set(current_dir "${CMAKE_CURRENT_BINARY_DIR}") qt_internal_get_cmake_or_env_or_default(working_dir QT_CI_DOC_TOOLS_WORKING_DIR "${current_dir}/qdoc_build") qt_internal_get_cmake_or_env_or_default(qt_src_dir QT_CI_DOC_TOOLS_SRC_DIR "${working_dir}/qt5") qt_internal_get_cmake_or_env_or_default(qt_build_dir QT_CI_DOC_TOOLS_BUILD__DIR "${working_dir}/build") qt_internal_get_cmake_or_env_or_default(qt_installed_dir QT_CI_DOC_TOOLS_INSTALL_DIR "${working_dir}/install") set(QT_DOC_TOOLS_WORKING_DIR "${working_dir}" PARENT_SCOPE) set(QT_DOC_TOOLS_SRC_DIR "${qt_src_dir}" PARENT_SCOPE) set(QT_DOC_TOOLS_BUILD_DIR "${qt_build_dir}" PARENT_SCOPE) set(QT_DOC_TOOLS_INSTALL_DIR "${qt_installed_dir}" PARENT_SCOPE) endfunction() # Gets the remote git base URL for qt repositories. function(qt_internal_get_repo_base_url out_var) # This Coin CI git daemon IP is set in all CI jobs. # Prefer using it when available, to avoid general network issues. # Sample value: QT_COIN_GIT_DAEMON=10.215.0.212:9418 qt_internal_get_cmake_or_env_or_default(coin_git_ip_port QT_COIN_GIT_DAEMON "") # Allow opting out of using the coin git daemon. qt_internal_get_cmake_or_env_or_default(skip_coin_git QT_DOC_TOOLS_SKIP_COIN_GIT_DAEMON FALSE) # Allow override of the default remote. qt_internal_get_cmake_or_env_or_default(git_remote QT_CI_DOC_TOOLS_GIT_REMOTE "") if(coin_git_ip_port AND NOT skip_coin_git) set(value "git://${coin_git_ip_port}/qt-project") elseif(git_remote) set(value "${git_remote}") else() set(value "https://code.qt.io/") endif() set(${out_var} "${value}" PARENT_SCOPE) endfunction() # Clones qt5.git into the specified src directory. function(qt_internal_clone_qt5) file(MAKE_DIRECTORY "${QT_DOC_TOOLS_SRC_DIR}") qt_internal_get_repo_base_url(http://code.qt.io/remote_url) execute_process( COMMAND git clone "${remote_url}/qt/qt5.git" "${QT_DOC_TOOLS_SRC_DIR}" COMMAND_ECHO STDOUT WORKING_DIRECTORY "${QT_DOC_TOOLS_WORKING_DIR}" RESULT_VARIABLE result ERROR_VARIABLE proc_err OUTPUT_STRIP_TRAILING_WHITESPACE ) if(result) message(WARNING "Cloning qt5.git sources failed. Output: ${result}") endif() # Allow pinning the qt5.git sha1 or any other git ref, based on a cmake var or env var. qt_internal_get_cmake_or_env_or_default(super_repo_ref QT_CI_DOC_TOOLS_TOP_LEVEL_PIN_GIT_REF "dev") # Allow using the branch that the Coin CI sets, as an opt-in. qt_internal_get_cmake_or_env_or_default(use_ci_branch QT_CI_DOC_TOOLS_USE_CI_TOP_LEVEL_BRANCH "OFF") qt_internal_get_cmake_or_env_or_default(ci_branch TESTED_MODULE_BRANCH_COIN "") if(use_ci_branch AND ci_branch) set(super_repo_ref "${ci_branch}") endif() execute_process( COMMAND git checkout "${super_repo_ref}" COMMAND_ECHO STDOUT WORKING_DIRECTORY "${QT_DOC_TOOLS_SRC_DIR}" RESULT_VARIABLE result OUTPUT_STRIP_TRAILING_WHITESPACE ) if(result) message(FATAL_ERROR "Checking out qt5.git '${super_repo_ref}' ref failed. Output: ${result}") endif() endfunction() # Checks out qttools to the dev branch (or other specified ref) and syncs its submodule # dependencies according to qttools dependencies.yaml file. function(qt_internal_sync_to_qttools) execute_process( COMMAND git submodule update --init --recursive --progress --depth 1 qttools # TODO: Remove these once the sync-to script is taught to automatically clone these. qtbase qtshadertools qtdeclarative qtsvg qtimageformats qtactiveqt qtlanguageserver COMMAND_ECHO STDOUT WORKING_DIRECTORY "${QT_DOC_TOOLS_SRC_DIR}" RESULT_VARIABLE result OUTPUT_STRIP_TRAILING_WHITESPACE ) if(result) message(FATAL_ERROR "Cloning qttools submodule failed. Output: ${result}") endif() # Allow pinning the qttools sha1 or any other git ref, based on a cmake var or env var. qt_internal_get_cmake_or_env_or_default(qttools_sync_to_ref QT_CI_DOC_TOOLS_PIN_GIT_REF "dev") execute_process( COMMAND ${CMAKE_COMMAND} -DSYNC_TO_MODULE=qttools "-DSYNC_TO_BRANCH=${qttools_sync_to_ref}" -DSHOW_PROGRESS=1 -DVERBOSE=1 -P cmake/QtSynchronizeRepo.cmake --log-level=DEBUG COMMAND_ECHO STDOUT WORKING_DIRECTORY "${QT_DOC_TOOLS_SRC_DIR}" RESULT_VARIABLE result OUTPUT_STRIP_TRAILING_WHITESPACE ) if(result) message(FATAL_ERROR "Syncing qttools submodule dependencies failed: Output: ${result}") endif() endfunction() # Configures a top-level static qt build for the checked out qt5.git sources. function(qt_internal_configure_qt) file(MAKE_DIRECTORY "${QT_DOC_TOOLS_BUILD_DIR}") file(MAKE_DIRECTORY "${QT_DOC_TOOLS_INSTALL_DIR}") # Get the common CI args, to set the sccache args, etc. qt_internal_get_cmake_or_env_or_default(ci_common_cmake_args COMMON_CMAKE_ARGS "") if(ci_common_cmake_args) separate_arguments(ci_common_cmake_args NATIVE_COMMAND ${ci_common_cmake_args}) endif() execute_process( COMMAND "${QT_DOC_TOOLS_SRC_DIR}/configure" -release -static -prefix "${QT_DOC_TOOLS_INSTALL_DIR}" # Skip optional dependencies we don't need to build. -skip qtactiveqt,qtimageformats,qtlanguageserver,qtsvg -- -DWARNINGS_ARE_ERRORS=OFF # When 6.x.y version bumps are not merged in DAG-dependency order, this avoids # blocking integrations due to mismatch of qtools package version and any of its # dependencies. -DQT_NO_PACKAGE_VERSION_INCOMPATIBLE_WARNING=ON --log-level STATUS --fresh -GNinja ${ci_common_cmake_args} COMMAND_ECHO STDOUT WORKING_DIRECTORY "${QT_DOC_TOOLS_BUILD_DIR}" RESULT_VARIABLE result OUTPUT_STRIP_TRAILING_WHITESPACE ) if(result) message(FATAL_ERROR "Configuring top-level qt5.git build failed. Output: ${result}") endif() endfunction() # Builds the main doc tools in a configured qt5.git build. function(qt_internal_build_tools) execute_process( COMMAND cmake --build . --verbose --parallel --target qdoc qtattributionsscanner qdbusxml2cpp qdbuscpp2xml qvkgen COMMAND_ECHO STDOUT WORKING_DIRECTORY "${QT_DOC_TOOLS_BUILD_DIR}" RESULT_VARIABLE result OUTPUT_STRIP_TRAILING_WHITESPACE ) if(result) message(FATAL_ERROR "Failed to build doc tools. Output: ${result}") endif() endfunction() # Installs the built doc tools. function(qt_internal_install_tools) execute_process( COMMAND cmake --build . --target # TODO: Replace with ninja install_doc_tools_stripped once it lands. qttools/src/qdoc/qdoc/install/strip qttools/src/qtattributionsscanner/install/strip qtbase/src/tools/qdbusxml2cpp/install/strip qtbase/src/tools/qdbuscpp2xml/install/strip qtbase/src/tools/qvkgen/install/strip COMMAND_ECHO STDOUT WORKING_DIRECTORY "${QT_DOC_TOOLS_BUILD_DIR}" RESULT_VARIABLE result OUTPUT_STRIP_TRAILING_WHITESPACE ) if(result) message(FATAL_ERROR "Failed to install doc tools. Output: ${result}") endif() endfunction() function(qt_internal_run_script) qt_internal_prepare_build_paths() qt_internal_clone_qt5() qt_internal_sync_to_qttools() qt_internal_configure_qt() qt_internal_build_tools() qt_internal_install_tools() endfunction() qt_internal_run_script()