From 21f812e57c48166ec5529460182d6f266d0ee55e Mon Sep 17 00:00:00 2001 From: Orkun Tokdemir Date: Tue, 21 Mar 2023 18:18:46 +0100 Subject: Autogen: Split creation and setup of custom targets into separate steps Defer the setup step until after compile features have been finalized on normal targets. Later this will help pass the information to Qt tools. Issue: #24624 --- Source/cmGlobalGenerator.cxx | 22 ++++++++++------------ Source/cmGlobalGenerator.h | 4 ---- Source/cmQtAutoGenGlobalInitializer.cxx | 5 ----- Source/cmQtAutoGenGlobalInitializer.h | 6 ++---- 4 files changed, 12 insertions(+), 25 deletions(-) diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 7ed68d6..d2e129f 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -1543,10 +1543,12 @@ bool cmGlobalGenerator::Compute() return false; } - // Iterate through all targets and set up AUTOMOC, AUTOUIC and AUTORCC - if (!this->QtAutoGen()) { +#ifndef CMAKE_BOOTSTRAP + cmQtAutoGenGlobalInitializer qtAutoGen(this->LocalGenerators); + if (!qtAutoGen.InitializeCustomTargets()) { return false; } +#endif // Add generator specific helper commands for (const auto& localGen : this->LocalGenerators) { @@ -1563,6 +1565,12 @@ bool cmGlobalGenerator::Compute() } } +#ifndef CMAKE_BOOTSTRAP + if (!qtAutoGen.SetupCustomTargets()) { + return false; + } +#endif + for (const auto& localGen : this->LocalGenerators) { cmMakefile* mf = localGen->GetMakefile(); for (const auto& g : mf->GetInstallGenerators()) { @@ -1764,16 +1772,6 @@ void cmGlobalGenerator::ComputeTargetOrder(cmGeneratorTarget const* gt, entry->second = index++; } -bool cmGlobalGenerator::QtAutoGen() -{ -#ifndef CMAKE_BOOTSTRAP - cmQtAutoGenGlobalInitializer initializer(this->LocalGenerators); - return initializer.generate(); -#else - return true; -#endif -} - bool cmGlobalGenerator::AddHeaderSetVerification() { for (auto const& gen : this->LocalGenerators) { diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h index 7de8215..73a4915 100644 --- a/Source/cmGlobalGenerator.h +++ b/Source/cmGlobalGenerator.h @@ -625,10 +625,6 @@ protected: void CxxModuleSupportCheck() const; - /// @brief Qt AUTOMOC/UIC/RCC target generation - /// @return true on success - bool QtAutoGen(); - bool AddHeaderSetVerification(); bool AddAutomaticSources(); diff --git a/Source/cmQtAutoGenGlobalInitializer.cxx b/Source/cmQtAutoGenGlobalInitializer.cxx index 9e3fe7f..1da8847 100644 --- a/Source/cmQtAutoGenGlobalInitializer.cxx +++ b/Source/cmQtAutoGenGlobalInitializer.cxx @@ -264,11 +264,6 @@ cmQtAutoGenGlobalInitializer::GetCompilerFeatures( return res; } -bool cmQtAutoGenGlobalInitializer::generate() -{ - return (this->InitializeCustomTargets() && this->SetupCustomTargets()); -} - bool cmQtAutoGenGlobalInitializer::InitializeCustomTargets() { // Initialize global autogen targets diff --git a/Source/cmQtAutoGenGlobalInitializer.h b/Source/cmQtAutoGenGlobalInitializer.h index 3de5c1a..e8569a5 100644 --- a/Source/cmQtAutoGenGlobalInitializer.h +++ b/Source/cmQtAutoGenGlobalInitializer.h @@ -51,14 +51,12 @@ public: Keywords const& kw() const { return this->Keywords_; } - bool generate(); + bool InitializeCustomTargets(); + bool SetupCustomTargets(); private: friend class cmQtAutoGenInitializer; - bool InitializeCustomTargets(); - bool SetupCustomTargets(); - void GetOrCreateGlobalTarget(cmLocalGenerator* localGen, std::string const& name, std::string const& comment); -- cgit v0.12 From 429a452705f5a3b7f9a46833aca6560393659cc2 Mon Sep 17 00:00:00 2001 From: Orkun Tokdemir Date: Tue, 21 Mar 2023 18:18:46 +0100 Subject: Autogen: Add target's C++ standard to moc_predef.h Generate `moc_predef.h` using the same C++ standard level that will be used to compile the target so that the compiler's predefined macros can be more accurately recovered. Fixes: #24624 Qt-Issue: https://bugreports.qt.io/browse/QTBUG-110847 --- Source/cmQtAutoGenInitializer.cxx | 17 +++++- Tests/RunCMake/Autogen/MocPredefs-build-stderr.txt | 1 + Tests/RunCMake/Autogen/MocPredefs-check.cxx | 60 ++++++++++++++++++++++ Tests/RunCMake/Autogen/MocPredefs-prefix.cmake | 3 ++ Tests/RunCMake/Autogen/MocPredefs.cmake | 40 +++++++++++++++ Tests/RunCMake/Autogen/MocPredefs.cxx | 3 ++ Tests/RunCMake/Autogen/RunCMakeTest.cmake | 7 +++ 7 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 Tests/RunCMake/Autogen/MocPredefs-build-stderr.txt create mode 100644 Tests/RunCMake/Autogen/MocPredefs-check.cxx create mode 100644 Tests/RunCMake/Autogen/MocPredefs-prefix.cmake create mode 100644 Tests/RunCMake/Autogen/MocPredefs.cmake create mode 100644 Tests/RunCMake/Autogen/MocPredefs.cxx diff --git a/Source/cmQtAutoGenInitializer.cxx b/Source/cmQtAutoGenInitializer.cxx index 667e0f5..ba4c4d8 100644 --- a/Source/cmQtAutoGenInitializer.cxx +++ b/Source/cmQtAutoGenInitializer.cxx @@ -43,6 +43,7 @@ #include "cmSourceFile.h" #include "cmSourceFileLocationKind.h" #include "cmSourceGroup.h" +#include "cmStandardLevelResolver.h" #include "cmState.h" #include "cmStateTypes.h" #include "cmStringAlgorithms.h" @@ -1699,8 +1700,22 @@ bool cmQtAutoGenInitializer::SetupWriteAutogenInfo() jval[1u] = pair.second; }); info.SetConfig("MOC_COMPILATION_FILE", this->Moc.CompilationFile); - info.SetArray("MOC_PREDEFS_CMD", this->Moc.PredefsCmd); info.SetConfig("MOC_PREDEFS_FILE", this->Moc.PredefsFile); + + cmStandardLevelResolver resolver{ this->Makefile }; + auto CompileOptionFlag = + resolver.GetCompileOptionDef(this->GenTarget, "CXX", ""); + + auto CompileOptionValue = + this->GenTarget->Makefile->GetSafeDefinition(CompileOptionFlag); + + if (!CompileOptionValue.empty()) { + if (this->Moc.PredefsCmd.size() >= 3) { + this->Moc.PredefsCmd.insert(this->Moc.PredefsCmd.begin() + 1, + CompileOptionValue); + } + } + info.SetArray("MOC_PREDEFS_CMD", this->Moc.PredefsCmd); } // Write uic settings diff --git a/Tests/RunCMake/Autogen/MocPredefs-build-stderr.txt b/Tests/RunCMake/Autogen/MocPredefs-build-stderr.txt new file mode 100644 index 0000000..8d98f9d --- /dev/null +++ b/Tests/RunCMake/Autogen/MocPredefs-build-stderr.txt @@ -0,0 +1 @@ +.* diff --git a/Tests/RunCMake/Autogen/MocPredefs-check.cxx b/Tests/RunCMake/Autogen/MocPredefs-check.cxx new file mode 100644 index 0000000..2b4791f --- /dev/null +++ b/Tests/RunCMake/Autogen/MocPredefs-check.cxx @@ -0,0 +1,60 @@ +#include + +#include "check_predefs.h" + +#define TO_STRING(x) TO_STRING0(x) +#define TO_STRING0(x) #x + +int main() +{ + int ret = 0; +#if defined(__STRICT_ANSI__) +# if !defined(CHECK___STRICT_ANSI__) + std::cout << "__STRICT_ANSI__: Expected " << TO_STRING(__STRICT_ANSI__) + << " but it is not defined.\n"; + ret = 1; +# elif __STRICT_ANSI__ != CHECK___STRICT_ANSI__ + std::cout << "__STRICT_ANSI__: Expected " << TO_STRING(__STRICT_ANSI__) + << " but got: " << TO_STRING(CHECK___STRICT_ANSI__) << "\n"; + ret = 1; +# endif +#elif defined(CHECK___STRICT_ANSI__) + std::cout << "__STRICT_ANSI__: Expected undefined but got: " + << TO_STRING(CHECK___STRICT_ANSI__) << "\n"; + ret = 1; +#endif + +#if defined(__cplusplus) +# if !defined(CHECK___cplusplus) + std::cout << "__cplusplus: Expected " << TO_STRING(__cplusplus) + << " but it is not defined.\n"; + ret = 1; +# elif __cplusplus != CHECK___cplusplus + std::cout << "__cplusplus: Expected " << TO_STRING(__cplusplus) + << " but got: " << TO_STRING(CHECK___cplusplus) << "\n"; + ret = 1; +# endif +#elif defined(CHECK___cplusplus) + std::cout << "__cplusplus: Expected undefined but got: " + << TO_STRING(CHECK___cplusplus) << "\n"; + ret = 1; +#endif + +#if defined(_MSVC_LANG) +# if !defined(CHECK__MSVC_LANG) + std::cout << "_MSVC_LANG: Expected " << TO_STRING(_MSVC_LANG) + << " but it is not defined.\n"; + ret = 1; +# elif _MSVC_LANG != CHECK__MSVC_LANG + std::cout << "_MSVC_LANG: Expected " << TO_STRING(_MSVC_LANG) + << " but got: " << TO_STRING(CHECK__MSVC_LANG) << "\n"; + ret = 1; +# endif +#elif defined(CHECK__MSVC_LANG) + std::cout << "_MSVC_LANG: Expected undefined but got: " + << TO_STRING(CHECK__MSVC_LANG) << "\n"; + ret = 1; +#endif + + return ret; +} diff --git a/Tests/RunCMake/Autogen/MocPredefs-prefix.cmake b/Tests/RunCMake/Autogen/MocPredefs-prefix.cmake new file mode 100644 index 0000000..460a05d --- /dev/null +++ b/Tests/RunCMake/Autogen/MocPredefs-prefix.cmake @@ -0,0 +1,3 @@ +file(READ ${in} predefs) +string(REGEX REPLACE "#define +" "#define CHECK_" predefs "${predefs}") +file(WRITE ${out} "${predefs}") diff --git a/Tests/RunCMake/Autogen/MocPredefs.cmake b/Tests/RunCMake/Autogen/MocPredefs.cmake new file mode 100644 index 0000000..7a89bb5 --- /dev/null +++ b/Tests/RunCMake/Autogen/MocPredefs.cmake @@ -0,0 +1,40 @@ +cmake_policy(SET CMP0129 NEW) +enable_language(CXX) + +find_package(Qt${with_qt_version} REQUIRED COMPONENTS Core) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_EXTENSIONS OFF) + +add_library(MocPredefs MocPredefs.cxx) + +if(NOT DEFINED CMAKE_CXX_COMPILER_PREDEFINES_COMMAND) + return() +endif() + +if(CMAKE_CXX_COMPILER_ID STREQUAL "LCC" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "1.26") + return() +endif() + +get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(_isMultiConfig) + set(moc_predefs_h "moc_predefs_$.h") + set(check_dir "${CMAKE_CURRENT_BINARY_DIR}/$") +else() + set(moc_predefs_h "moc_predefs.h") + set(check_dir "${CMAKE_CURRENT_BINARY_DIR}") +endif() + +add_custom_command(TARGET MocPredefs POST_BUILD VERBATIM COMMAND + ${CMAKE_COMMAND} + -Din=${CMAKE_CURRENT_BINARY_DIR}/MocPredefs_autogen/${moc_predefs_h} + -Dout=${check_dir}/check_predefs.h + -P${CMAKE_CURRENT_SOURCE_DIR}/MocPredefs-prefix.cmake + ) + +add_executable(MocPredefs-check MocPredefs-check.cxx) +target_include_directories(MocPredefs-check PRIVATE ${check_dir}) +add_dependencies(MocPredefs-check MocPredefs) + +add_custom_target(MocPredefs-run-check ALL VERBATIM COMMAND MocPredefs-check) diff --git a/Tests/RunCMake/Autogen/MocPredefs.cxx b/Tests/RunCMake/Autogen/MocPredefs.cxx new file mode 100644 index 0000000..b27cec5 --- /dev/null +++ b/Tests/RunCMake/Autogen/MocPredefs.cxx @@ -0,0 +1,3 @@ +void MocPredefs() +{ +} diff --git a/Tests/RunCMake/Autogen/RunCMakeTest.cmake b/Tests/RunCMake/Autogen/RunCMakeTest.cmake index e4c5811..6a3c49b 100644 --- a/Tests/RunCMake/Autogen/RunCMakeTest.cmake +++ b/Tests/RunCMake/Autogen/RunCMakeTest.cmake @@ -15,4 +15,11 @@ if (DEFINED with_qt_version) run_cmake(CMP0111-imported-target-full) run_cmake(CMP0111-imported-target-libname) run_cmake(CMP0111-imported-target-implib-only) + + block() + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/MocPredefs-build) + run_cmake(MocPredefs) + set(RunCMake_TEST_NO_CLEAN 1) + run_cmake_command(MocPredefs-build ${CMAKE_COMMAND} --build . --config Debug) + endblock() endif () -- cgit v0.12