2022-07-05 11:26:52 +00:00
|
|
|
# Copyright (C) 2022 The Qt Company Ltd.
|
2022-08-19 13:21:34 +00:00
|
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
2022-07-05 11:26:52 +00:00
|
|
|
|
2020-11-30 07:46:49 +00:00
|
|
|
# Need an explicit call at the top level. This is the absolute minimum version
|
|
|
|
# needed to configure the project with any combination of enabled features.
|
|
|
|
# The call to qt_build_repo_begin() will upgrade policies further.
|
2021-07-06 15:55:30 +00:00
|
|
|
#
|
|
|
|
# The absolute minimum version for building Qt is 3.16 because for metatype.json generation, we
|
|
|
|
# depend on being able to find the location of json files created by AUTOMOC/moc.
|
2020-11-30 07:46:49 +00:00
|
|
|
cmake_minimum_required(VERSION 3.16)
|
2020-10-30 16:42:34 +00:00
|
|
|
|
2020-11-30 07:46:49 +00:00
|
|
|
# Get the repo version and CMake policy details
|
|
|
|
include(.cmake.conf)
|
|
|
|
|
2021-05-14 12:48:19 +00:00
|
|
|
# Bail out if any part of the build directory's path is symlinked.
|
2021-12-23 12:20:21 +00:00
|
|
|
function(qt_internal_check_if_path_has_symlinks path)
|
|
|
|
get_filename_component(dir "${path}" ABSOLUTE)
|
2022-01-05 11:38:22 +00:00
|
|
|
set(is_symlink FALSE)
|
|
|
|
if(CMAKE_HOST_WIN32)
|
|
|
|
# CMake marks Windows mount points as symbolic links, so use simplified REALPATH check
|
|
|
|
# on Windows platforms instead of IS_SYMLINK.
|
|
|
|
get_filename_component(dir_realpath "${dir}" REALPATH)
|
|
|
|
if(NOT dir STREQUAL dir_realpath)
|
|
|
|
set(is_symlink TRUE)
|
2021-12-23 12:20:21 +00:00
|
|
|
endif()
|
2022-01-05 11:38:22 +00:00
|
|
|
else()
|
|
|
|
while(TRUE)
|
|
|
|
if(IS_SYMLINK "${dir}")
|
|
|
|
set(is_symlink TRUE)
|
|
|
|
break()
|
|
|
|
endif()
|
2021-12-23 12:20:21 +00:00
|
|
|
|
2022-01-05 11:38:22 +00:00
|
|
|
set(prev_dir "${dir}")
|
|
|
|
get_filename_component(dir "${dir}" DIRECTORY)
|
|
|
|
if("${dir}" STREQUAL "${prev_dir}")
|
|
|
|
return()
|
|
|
|
endif()
|
|
|
|
endwhile()
|
|
|
|
endif()
|
|
|
|
if(is_symlink)
|
2023-05-02 12:07:41 +00:00
|
|
|
set(possible_solutions_for_resolving_symlink [[
|
|
|
|
- Map directories using a transparent mechanism such as mount --bind
|
|
|
|
- Pass the real path of the build directory to CMake, e.g. using
|
|
|
|
cd $(realpath <path>) before invoking cmake <source_dir>.
|
|
|
|
]])
|
|
|
|
if(QT_ALLOW_SYMLINK_IN_PATHS)
|
|
|
|
# In some cases, e.g., Homebrew, it is beneficial to skip this check.
|
|
|
|
# Before this, Homebrew had to patch this out to be able to get their build.
|
|
|
|
message(WARNING
|
|
|
|
"The path \"${path}\" contains symlinks. "
|
|
|
|
"This is not recommended, and it may lead to unexpected issues. If you do "
|
|
|
|
"not have a good reason for enabling 'QT_ALLOW_SYMLINK_IN_PATHS', disable "
|
|
|
|
"it, and follow one of the following solutions: \n"
|
|
|
|
"${possible_solutions_for_resolving_symlink} ")
|
|
|
|
else()
|
|
|
|
message(FATAL_ERROR
|
|
|
|
"The path \"${path}\" contains symlinks. "
|
|
|
|
"This is not supported. Possible solutions: \n"
|
|
|
|
"${possible_solutions_for_resolving_symlink} ")
|
|
|
|
endif()
|
2022-01-05 11:38:22 +00:00
|
|
|
endif()
|
2021-12-23 12:20:21 +00:00
|
|
|
endfunction()
|
|
|
|
qt_internal_check_if_path_has_symlinks("${CMAKE_BINARY_DIR}")
|
2020-12-17 12:41:38 +00:00
|
|
|
|
2020-10-09 09:48:23 +00:00
|
|
|
# Run auto detection routines, but not when doing standalone tests. In that case, the detection
|
|
|
|
# results are taken from either QtBuildInternals or the qt.toolchain.cmake file. Also, inhibit
|
|
|
|
# auto-detection in a top-level build, because the top-level project file already includes it.
|
2021-03-04 09:42:34 +00:00
|
|
|
if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_SUPERBUILD)
|
2020-06-02 16:06:37 +00:00
|
|
|
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/QtAutoDetect.cmake)
|
|
|
|
endif()
|
2019-06-20 11:23:19 +00:00
|
|
|
|
2021-07-06 15:55:30 +00:00
|
|
|
# This call will load any provided cmake toolchain file.
|
2020-08-13 10:05:13 +00:00
|
|
|
project(QtBase
|
|
|
|
VERSION "${QT_REPO_MODULE_VERSION}"
|
|
|
|
DESCRIPTION "Qt Base Libraries"
|
|
|
|
HOMEPAGE_URL "https://qt.io/"
|
|
|
|
LANGUAGES CXX C ASM
|
|
|
|
)
|
|
|
|
|
2023-07-06 19:11:58 +00:00
|
|
|
if(NOT QT_BUILD_STANDALONE_TESTS)
|
|
|
|
# Should this Qt be static or dynamically linked?
|
|
|
|
option(BUILD_SHARED_LIBS "Build Qt statically or dynamically" ON)
|
|
|
|
set(QT_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
|
2021-07-06 15:55:30 +00:00
|
|
|
|
2023-07-06 19:11:58 +00:00
|
|
|
# This variable is also set in Qt6CoreConfigExtras.cmake, but it's not loaded when building
|
|
|
|
# qtbase. Set it here so qt_add_plugin can compute the proper plugin flavor.
|
|
|
|
set(QT6_IS_SHARED_LIBS_BUILD ${BUILD_SHARED_LIBS})
|
2021-07-06 15:55:30 +00:00
|
|
|
|
2023-07-06 19:11:58 +00:00
|
|
|
# BUILD_SHARED_LIBS influences the minimum required CMake version. The value is set either by:
|
|
|
|
# a cache variable provided on the configure command line
|
|
|
|
# or set by QtAutoDetect.cmake depending on the platform
|
|
|
|
# or specified via a toolchain file that is loaded by the project() call
|
|
|
|
# or set by the option() call above
|
|
|
|
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/QtCMakeVersionHelpers.cmake")
|
|
|
|
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/QtPublicCMakeVersionHelpers.cmake")
|
|
|
|
qt_internal_check_and_warn_about_unsuitable_cmake_version()
|
2021-07-06 15:55:30 +00:00
|
|
|
|
2019-11-01 10:48:23 +00:00
|
|
|
## Add some paths to check for cmake modules:
|
|
|
|
list(PREPEND CMAKE_MODULE_PATH
|
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake"
|
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/3rdparty/extra-cmake-modules/find-modules"
|
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/3rdparty/kwin"
|
|
|
|
)
|
|
|
|
|
2020-03-16 12:36:47 +00:00
|
|
|
if(MACOS)
|
cmake: Add default Info.plist for macOS with some important keys
The default Info.plist shipped with CMake lacks an NSPrincipalClass
entry, which is crucial for making macOS apps run in full resolution
on retina screens.
We make sure the file is only picked up on macOS, not iOS and friends,
since those platforms require another principal class. If needed we can
extract the value out as a CMake variable and use the same file for all
Apple platforms. Doing so would assume all keys are single-platform
only, so if that's not the case we need platform-specific files.
We should probably extract the package type out as a variable too,
so that the file can be used for both apps, plugins, and frameworks,
but doing so requires setting up that variable somewhere based on
the target type, which CMake doesn't allow in an easy way.
The file itself is based on the file CMake ships, combined with
keys inherited from Qt's existing plist templates for qmake, and
adjusted to match what Xcode generates by default these days.
Change-Id: I3f5109e5fff63cdbd109a99d4008948d4bd2102b
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2020-03-11 20:45:50 +00:00
|
|
|
# Add module directory to pick up custom Info.plist template
|
|
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/macos")
|
2021-04-14 16:16:44 +00:00
|
|
|
elseif(IOS)
|
|
|
|
# Add module directory to pick up custom Info.plist template
|
|
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/ios")
|
cmake: Add default Info.plist for macOS with some important keys
The default Info.plist shipped with CMake lacks an NSPrincipalClass
entry, which is crucial for making macOS apps run in full resolution
on retina screens.
We make sure the file is only picked up on macOS, not iOS and friends,
since those platforms require another principal class. If needed we can
extract the value out as a CMake variable and use the same file for all
Apple platforms. Doing so would assume all keys are single-platform
only, so if that's not the case we need platform-specific files.
We should probably extract the package type out as a variable too,
so that the file can be used for both apps, plugins, and frameworks,
but doing so requires setting up that variable somewhere based on
the target type, which CMake doesn't allow in an easy way.
The file itself is based on the file CMake ships, combined with
keys inherited from Qt's existing plist templates for qmake, and
adjusted to match what Xcode generates by default these days.
Change-Id: I3f5109e5fff63cdbd109a99d4008948d4bd2102b
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2020-03-11 20:45:50 +00:00
|
|
|
endif()
|
|
|
|
|
2019-11-01 10:48:23 +00:00
|
|
|
## Find the build internals package.
|
|
|
|
set(QT_BUILD_INTERNALS_SKIP_CMAKE_MODULE_PATH_ADDITION TRUE)
|
|
|
|
list(PREPEND CMAKE_PREFIX_PATH
|
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake"
|
|
|
|
)
|
|
|
|
find_package(QtBuildInternals CMAKE_FIND_ROOT_PATH_BOTH)
|
|
|
|
unset(QT_BUILD_INTERNALS_SKIP_CMAKE_MODULE_PATH_ADDITION)
|
|
|
|
else()
|
|
|
|
# When building standalone tests, an istalled BuildInternals package already exists.
|
|
|
|
find_package(Qt6 REQUIRED COMPONENTS BuildInternals CMAKE_FIND_ROOT_PATH_BOTH)
|
|
|
|
endif()
|
2018-10-24 13:20:27 +00:00
|
|
|
|
2023-04-12 13:04:14 +00:00
|
|
|
qt_internal_project_setup()
|
|
|
|
|
2019-09-26 15:58:53 +00:00
|
|
|
qt_build_repo_begin()
|
2018-10-24 13:20:27 +00:00
|
|
|
|
2019-11-01 10:48:23 +00:00
|
|
|
if(NOT QT_BUILD_STANDALONE_TESTS)
|
|
|
|
## Should this Qt be built with Werror?
|
|
|
|
option(WARNINGS_ARE_ERRORS "Build Qt with warnings as errors" ${FEATURE_developer_build})
|
2019-11-07 07:51:03 +00:00
|
|
|
|
2021-05-12 12:03:57 +00:00
|
|
|
## Should this Qt create versioned hard link for some tools?
|
|
|
|
option(QT_CREATE_VERSIONED_HARD_LINK "Enable the use of versioned hard link" ON)
|
|
|
|
|
2019-11-01 10:48:23 +00:00
|
|
|
## QtBase specific configure tests:
|
|
|
|
include(QtBaseConfigureTests)
|
2018-11-14 12:37:52 +00:00
|
|
|
|
2019-11-01 10:48:23 +00:00
|
|
|
## Build System tests:
|
|
|
|
include(QtBaseCMakeTesting)
|
2018-10-24 13:20:27 +00:00
|
|
|
|
2019-11-01 10:48:23 +00:00
|
|
|
## Targets for global features, etc.:
|
|
|
|
include(QtBaseGlobalTargets)
|
2019-10-17 08:14:09 +00:00
|
|
|
|
2019-11-01 10:48:23 +00:00
|
|
|
## Set language standards after QtBaseGlobalTargets, because that's when the relevant
|
|
|
|
## feature variables are available.
|
|
|
|
qt_set_language_standards()
|
Export tool config and target files for each relevant module
CMake will now generate config and target files for each module that
provides tools. As a result, namespaced global targets such as
Qt5::moc or Qt5::rcc can be made available.
Third party projects that require just these tools, and not the Qt
modules themselves, should specify CMAKE_PREFIX_PATH pointing to the
installed Qt location, and call find_package(Qt5CoreTools),
find_package(Qt5GuiTools), etc.
It is also possible to call
find_package(Qt5Tools REQUIRED Core Widgets) where the last option
is a list of modules whose tools should be imported.
Note that all the tools are in the Qt5::
namespace and not in the Qt5CoreTools:: or Qt5WidgetsTools::
namespace.
This commit also changes the behavior regarding when to build tools
while building Qt itself.
When cross compiling Qt (checked via CMAKE_CROSSCOMPILING) or when
-DQT_FORCE_FIND_TOOLS=TRUE is passed, tools added by add_qt_tool will
always be searched for and not built.
In this case the user has to specify the CMake variable QT_HOST_PATH
pointing to an installed host Qt location.
When not cross compiling, tools added by add_qt_tool are built from
source.
When building leaf modules (like qtsvg) that require some tool that was
built in qtbase (like moc), the module project should contain a
find_package(Qt5ToolsCore) call and specify an appropriate
CMAKE_PREFIX_PATH so that the tool package is found.
Note that because HOST_QT_TOOLS_DIRECTORY was replaced by QT_HOST_PATH,
the ensure syncqt code was changed to make it work properly with
both qtbase and qtsvg.
Here's a list of tools and their module associations:
qmake, moc, rcc, tracegen, qfloat16-tables, qlalr -> CoreTools
qvkgen -> GuiTools
uic -> WidgetTools
dbus related tools -> DBusTools
Task-number: QTBUG-74134
Change-Id: Ie67d1e2f8de46102b48eca008f0b50caf4fbe3ed
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
2019-04-10 17:21:22 +00:00
|
|
|
|
2019-11-26 09:10:55 +00:00
|
|
|
#include CoreMacros() for qt6_generate_meta_types()
|
2020-08-21 14:59:17 +00:00
|
|
|
set(QT_DEFAULT_MAJOR_VERSION 6)
|
2019-11-26 09:10:55 +00:00
|
|
|
include(src/corelib/Qt6CoreMacros.cmake)
|
|
|
|
|
2020-08-14 15:53:37 +00:00
|
|
|
# Needed when building qtbase for android.
|
2021-06-07 15:14:39 +00:00
|
|
|
if(ANDROID)
|
|
|
|
include(src/corelib/Qt6AndroidMacros.cmake)
|
2021-11-18 09:27:47 +00:00
|
|
|
_qt_internal_create_global_android_targets()
|
2021-06-07 15:14:39 +00:00
|
|
|
endif()
|
2020-08-14 15:53:37 +00:00
|
|
|
|
2020-09-03 08:29:41 +00:00
|
|
|
if(WASM)
|
|
|
|
# Needed when building for WebAssembly.
|
|
|
|
include(cmake/QtWasmHelpers.cmake)
|
2022-01-03 09:22:08 +00:00
|
|
|
include(src/corelib/Qt6WasmMacros.cmake)
|
2020-09-03 08:29:41 +00:00
|
|
|
qt_internal_setup_wasm_target_properties(Platform)
|
|
|
|
endif()
|
|
|
|
|
2020-10-02 13:38:47 +00:00
|
|
|
# Set up optimization flags like in qmake.
|
|
|
|
# This function must be called after the global QT_FEATURE_xxx variables have been set up,
|
|
|
|
# aka after QtBaseGlobalTargets is processed.
|
|
|
|
# It also has to be called /before/ adding add_subdirectory(src), so that per-directory
|
|
|
|
# modifications can still be applied if necessary (like in done in Core and Gui).
|
|
|
|
qt_internal_set_up_config_optimizations_like_in_qmake()
|
|
|
|
|
2019-09-19 07:38:09 +00:00
|
|
|
## Setup documentation
|
|
|
|
add_subdirectory(doc)
|
|
|
|
|
2019-11-01 10:48:23 +00:00
|
|
|
## Visit all the directories:
|
|
|
|
add_subdirectory(src)
|
|
|
|
endif()
|
2018-10-24 13:20:27 +00:00
|
|
|
|
2019-11-01 10:48:23 +00:00
|
|
|
if(NOT QT_BUILD_STANDALONE_TESTS)
|
2021-04-15 00:46:40 +00:00
|
|
|
if(QT_WILL_BUILD_TOOLS AND QT_FEATURE_settings)
|
2019-11-01 10:48:23 +00:00
|
|
|
add_subdirectory(qmake)
|
|
|
|
endif()
|
|
|
|
# As long as we use the mkspecs (for qplatformdefs.h), we need to always
|
|
|
|
# install it, especially when cross-compiling.
|
2020-01-15 22:01:16 +00:00
|
|
|
set(mkspecs_install_dir "${INSTALL_MKSPECSDIR}")
|
2019-11-01 10:48:23 +00:00
|
|
|
qt_path_join(mkspecs_install_dir ${QT_INSTALL_DIR} ${mkspecs_install_dir})
|
|
|
|
|
2020-01-15 22:01:16 +00:00
|
|
|
file(GLOB mkspecs_subdirs
|
|
|
|
LIST_DIRECTORIES TRUE
|
|
|
|
"${PROJECT_SOURCE_DIR}/mkspecs/*")
|
2020-03-11 10:07:02 +00:00
|
|
|
foreach(entry IN LISTS mkspecs_subdirs)
|
|
|
|
if (IS_DIRECTORY ${entry})
|
|
|
|
qt_copy_or_install(DIRECTORY "${entry}"
|
2020-10-15 14:39:44 +00:00
|
|
|
DESTINATION ${mkspecs_install_dir}
|
|
|
|
USE_SOURCE_PERMISSIONS)
|
2020-03-11 10:07:02 +00:00
|
|
|
else()
|
|
|
|
qt_copy_or_install(FILES "${entry}"
|
|
|
|
DESTINATION ${mkspecs_install_dir})
|
|
|
|
endif()
|
2020-01-15 22:01:16 +00:00
|
|
|
endforeach()
|
2019-02-15 12:16:35 +00:00
|
|
|
endif()
|
2019-01-17 09:22:59 +00:00
|
|
|
|
2023-08-18 13:48:21 +00:00
|
|
|
qt_build_repo_post_process()
|
|
|
|
|
|
|
|
if(QT_BUILD_TESTS)
|
|
|
|
add_subdirectory(tests)
|
|
|
|
if(NOT QT_BUILD_TESTS_BY_DEFAULT)
|
|
|
|
set_property(DIRECTORY tests PROPERTY EXCLUDE_FROM_ALL TRUE)
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
2019-06-11 13:46:31 +00:00
|
|
|
qt_build_repo_end()
|
|
|
|
|
2020-10-19 11:35:15 +00:00
|
|
|
if(NOT QT_BUILD_STANDALONE_TESTS AND QT_BUILD_EXAMPLES)
|
2019-01-17 09:22:59 +00:00
|
|
|
add_subdirectory(examples)
|
|
|
|
endif()
|