diff --git a/CMakeLists.txt b/CMakeLists.txt index 97fbfac421..1a92f3dc03 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,11 @@ # special case skip regeneration cmake_minimum_required(VERSION 3.15.0) -# Run auto detection routines -include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/QtAutoDetect.cmake) +# Run auto detection routines, but not when doing stnadalone tests. In that case the detection +# results are takend from either QtBuildInternals or the qt.toolchain.cmake file. +if(NOT QT_BUILD_STANDALONE_TESTS) + include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/QtAutoDetect.cmake) +endif() if (CMAKE_CROSSCOMPILING AND CMAKE_SYSROOT) # When cross compiling with CMake any calls to pkg_check_modules() will diff --git a/cmake/QtAutoDetect.cmake b/cmake/QtAutoDetect.cmake index 2fa103963a..5c72bf39d8 100644 --- a/cmake/QtAutoDetect.cmake +++ b/cmake/QtAutoDetect.cmake @@ -185,6 +185,16 @@ function(qt_auto_detect_cmake_config) endif() endfunction() +function(qt_auto_detect_cyclic_toolchain) + if(CMAKE_TOOLCHAIN_FILE AND CMAKE_TOOLCHAIN_FILE MATCHES "/qt.toolchain.cmake$") + message(FATAL_ERROR + "Woah there! You can't use the Qt generated qt.toolchain.cmake file to configure " + "qtbase, because that will create a toolchain file that includes itself!\n" + "Did you accidentally use qt-cmake to configure qtbase? Make sure to remove the " + "CMakeCache.txt file, and configure qtbase with 'cmake' instead of 'qt-cmake'.") + endif() +endfunction() + function(qt_auto_detect_darwin) if(APPLE) # If no CMAKE_OSX_DEPLOYMENT_TARGET is provided, default to a value that Qt defines. @@ -230,6 +240,7 @@ function(qt_auto_detect_pch) option(BUILD_WITH_PCH "Build Qt using precompiled headers?" "${default_value}") endfunction() +qt_auto_detect_cyclic_toolchain() qt_auto_detect_cmake_config() qt_auto_detect_darwin() qt_auto_detect_ios() diff --git a/cmake/QtBaseGlobalTargets.cmake b/cmake/QtBaseGlobalTargets.cmake index d37c7f1cc0..5e97f0e66b 100644 --- a/cmake/QtBaseGlobalTargets.cmake +++ b/cmake/QtBaseGlobalTargets.cmake @@ -116,7 +116,7 @@ if(QT_HOST_PATH) endif() if(CMAKE_TOOLCHAIN_FILE) - set(init_original_toolchain_file "set(qt_chainload_toolchain_file \"${CMAKE_TOOLCHAIN_FILE}\")") + set(init_original_toolchain_file "set(__qt_chainload_toolchain_file \"${CMAKE_TOOLCHAIN_FILE}\")") endif() if(VCPKG_CHAINLOAD_TOOLCHAIN_FILE) diff --git a/cmake/qt.toolchain.cmake.in b/cmake/qt.toolchain.cmake.in index d623d9c0fb..e7af642c05 100644 --- a/cmake/qt.toolchain.cmake.in +++ b/cmake/qt.toolchain.cmake.in @@ -6,9 +6,19 @@ @init_vcpkg@ -if(qt_chainload_toolchain_file) - include("${qt_chainload_toolchain_file}") - unset(qt_chainload_toolchain_file) +if(__qt_chainload_toolchain_file) + get_filename_component(__qt_chainload_toolchain_file_real_path + "${__qt_chainload_toolchain_file}" REALPATH) + if(__qt_chainload_toolchain_file_real_path STREQUAL CMAKE_CURRENT_LIST_FILE) + message(FATAL_ERROR + "Woah, the Qt toolchain file tried to include itself recusively! '${__qt_chainload_toolchain_file}' " + "Make sure to remove qtbase/CMakeCache.txt and reconfigure qtbase with 'cmake' " + "rather than 'qt-cmake', and then you can reconfigure your own project." + ) + else() + include("${__qt_chainload_toolchain_file}") + endif() + unset(__qt_chainload_toolchain_file) endif() # Compute dynamically the Qt installation prefix from the location of this file. This allows