summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/cmGlobalGenerator.cxx22
-rw-r--r--Source/cmGlobalGenerator.h4
-rw-r--r--Source/cmQtAutoGenGlobalInitializer.cxx5
-rw-r--r--Source/cmQtAutoGenGlobalInitializer.h6
-rw-r--r--Source/cmQtAutoGenInitializer.cxx17
-rw-r--r--Tests/RunCMake/Autogen/MocPredefs-build-stderr.txt1
-rw-r--r--Tests/RunCMake/Autogen/MocPredefs-check.cxx60
-rw-r--r--Tests/RunCMake/Autogen/MocPredefs-prefix.cmake3
-rw-r--r--Tests/RunCMake/Autogen/MocPredefs.cmake40
-rw-r--r--Tests/RunCMake/Autogen/MocPredefs.cxx3
-rw-r--r--Tests/RunCMake/Autogen/RunCMakeTest.cmake7
11 files changed, 142 insertions, 26 deletions
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx
index 08022b3..eb3f433 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()) {
@@ -1763,16 +1771,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 4bbbdfa..0e0624a 100644
--- a/Source/cmGlobalGenerator.h
+++ b/Source/cmGlobalGenerator.h
@@ -637,10 +637,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);
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 <iostream>
+
+#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_$<CONFIG>.h")
+ set(check_dir "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>")
+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 ()