diff --git a/cmake/QtExecutableHelpers.cmake b/cmake/QtExecutableHelpers.cmake index 768e1f15623..dc73f578446 100644 --- a/cmake/QtExecutableHelpers.cmake +++ b/cmake/QtExecutableHelpers.cmake @@ -420,7 +420,7 @@ function(qt_internal_add_configure_time_executable target) ) set(should_build_at_configure_time TRUE) - if(EXISTS "${target_binary_path}") + if(EXISTS "${target_binary_path}" AND EXISTS "${timestamp_file}") set(last_ts 0) foreach(source IN LISTS sources) file(TIMESTAMP "${source}" ts "%s") diff --git a/cmake/QtSetup.cmake b/cmake/QtSetup.cmake index 1c4e880807a..f579315540d 100644 --- a/cmake/QtSetup.cmake +++ b/cmake/QtSetup.cmake @@ -193,6 +193,8 @@ else() set(QT_INTERNAL_CONFIGURE_FROM_IDE FALSE CACHE INTERNAL "Configuring Qt Project from IDE") endif() +set(_qt_sync_headers_at_configure_time_default ${QT_INTERNAL_CONFIGURE_FROM_IDE}) + if(FEATURE_developer_build) if(DEFINED QT_CMAKE_EXPORT_COMPILE_COMMANDS) set(CMAKE_EXPORT_COMPILE_COMMANDS ${QT_CMAKE_EXPORT_COMPILE_COMMANDS}) @@ -213,11 +215,26 @@ if(FEATURE_developer_build) if (CMAKE_BUILD_TYPE AND CMAKE_BUILD_TYPE STREQUAL Debug) set(__build_benchmarks OFF) endif() + + # Sync headers during the initial configuration of a -developer-build to facilitate code + # navigation for code editors that use an LSP-based code model. + set(_qt_sync_headers_at_configure_time_default TRUE) else() set(_qt_build_tests_default OFF) set(__build_benchmarks OFF) endif() +# Sync Qt header files at configure time +option(QT_SYNC_HEADERS_AT_CONFIGURE_TIME "Run syncqt at configure time already" + ${_qt_sync_headers_at_configure_time_default}) +unset(_qt_sync_headers_at_configure_time_default) + +# In static Ninja Multi-Config builds the sync_headers dependencies(and other autogen dependencies +# are not added to '_autogen/timestamp' targets. See QTBUG-113974. +if(CMAKE_GENERATOR STREQUAL "Ninja Multi-Config" AND NOT QT_BUILD_SHARED_LIBS) + set(QT_SYNC_HEADERS_AT_CONFIGURE_TIME TRUE CACHE BOOL "" FORCE) +endif() + # Build Benchmarks option(QT_BUILD_BENCHMARKS "Build Qt Benchmarks" ${__build_benchmarks}) if(QT_BUILD_BENCHMARKS) diff --git a/cmake/QtSyncQtHelpers.cmake b/cmake/QtSyncQtHelpers.cmake index b8eead1a9a9..001ddee5f06 100644 --- a/cmake/QtSyncQtHelpers.cmake +++ b/cmake/QtSyncQtHelpers.cmake @@ -251,7 +251,7 @@ function(qt_internal_target_sync_headers target module_headers module_headers_ge # Run sync Qt first time at configure step to make all header files available for the code model # of IDEs. get_property(synced_modules GLOBAL PROPERTY _qt_synced_modules) - if(NOT "${module}" IN_LIST synced_modules) + if(NOT "${module}" IN_LIST synced_modules AND QT_SYNC_HEADERS_AT_CONFIGURE_TIME) message(STATUS "Running syncqt.cpp for module: ${module}") get_target_property(syncqt_location ${QT_CMAKE_EXPORT_NAMESPACE}::syncqt LOCATION) execute_process( diff --git a/src/tools/syncqt/CMakeLists.txt b/src/tools/syncqt/CMakeLists.txt index 3740b1bd4dc..9cdbec88413 100644 --- a/src/tools/syncqt/CMakeLists.txt +++ b/src/tools/syncqt/CMakeLists.txt @@ -11,29 +11,41 @@ set(compile_definitions QT_NAMESPACE="${QT_NAMESPACE}" ) -set(config_type "") -if(NOT QT_INTERNAL_AVOID_OVERRIDING_SYNCQT_CONFIG) - set(config_type CONFIG RelWithDebInfo) -endif() - -if(CMAKE_OSX_ARCHITECTURES) - set(osx_architectures "-DCMAKE_OSX_ARCHITECTURES:STRING=${CMAKE_OSX_ARCHITECTURES}") -endif() qt_get_tool_target_name(target_name syncqt) -# Note: configure-time tools reserve the original tool name for the imported executable. -# To re-build syncqt use 'syncqt_build' target. -qt_internal_add_configure_time_tool(${target_name} - DEFINES ${compile_definitions} - COMPILE_OPTIONS ${optimize_full_flags} - TOOLS_TARGET Core - INSTALL_DIRECTORY "${INSTALL_LIBEXECDIR}" - CMAKE_FLAGS - -DCMAKE_CXX_STANDARD_REQUIRED:BOOL=TRUE - -DCMAKE_CXX_STANDARD:STRING=${CMAKE_CXX_STANDARD} - # std::filesystem API is only available in macOS 10.15+ - -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=10.15 - "${osx_architectures}" - SOURCES +if(NOT QT_SYNC_HEADERS_AT_CONFIGURE_TIME) + qt_internal_add_tool(${target_name} + DEFINES ${compile_definitions} + COMPILE_OPTIONS ${optimize_full_flags} + TOOLS_TARGET Core + CORE_LIBRARY None + INSTALL_DIR "${INSTALL_LIBEXECDIR}" + SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/main.cpp" - ${config_type} -) + ) +else() + set(config_type "") + if(NOT QT_INTERNAL_AVOID_OVERRIDING_SYNCQT_CONFIG) + set(config_type CONFIG RelWithDebInfo) + endif() + + if(CMAKE_OSX_ARCHITECTURES) + set(osx_architectures "-DCMAKE_OSX_ARCHITECTURES:STRING=${CMAKE_OSX_ARCHITECTURES}") + endif() + # Note: configure-time tools reserve the original tool name for the imported executable. + # To re-build syncqt use 'syncqt_build' target. + qt_internal_add_configure_time_tool(${target_name} + DEFINES ${compile_definitions} + COMPILE_OPTIONS ${optimize_full_flags} + TOOLS_TARGET Core + INSTALL_DIRECTORY "${INSTALL_LIBEXECDIR}" + CMAKE_FLAGS + -DCMAKE_CXX_STANDARD_REQUIRED:BOOL=TRUE + -DCMAKE_CXX_STANDARD:STRING=${CMAKE_CXX_STANDARD} + # std::filesystem API is only available in macOS 10.15+ + -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=10.15 + "${osx_architectures}" + SOURCES + "${CMAKE_CURRENT_SOURCE_DIR}/main.cpp" + ${config_type} + ) +endif()