Browse Source

Autogen: Default AUTOGEN_USE_SYSTEM_INCLUDE to ON if it is not set

Add policy CMP0151 to preserve the old behavior by default.
Orkun Tokdemir 2 years ago
parent
commit
7bf4e30090

+ 1 - 0
Help/manual/cmake-policies.7.rst

@@ -57,6 +57,7 @@ Policies Introduced by CMake 3.27
 .. toctree::
    :maxdepth: 1
 
+   CMP0151: AUTOMOC include directory is a system include directory by default. </policy/CMP0151>
    CMP0150: ExternalProject_Add and FetchContent_Declare treat relative git repository paths as being relative to parent project's remote. </policy/CMP0150>
    CMP0149: Visual Studio generators select latest Windows SDK by default. </policy/CMP0149>
    CMP0148: The FindPythonInterp and FindPythonLibs modules are removed. </policy/CMP0148>

+ 28 - 0
Help/policy/CMP0151.rst

@@ -0,0 +1,28 @@
+CMP0151
+-------
+
+.. versionadded:: 3.27
+
+AUTOMOC include directory is a system include directory by default.
+
+Headers generated for :ref:`Qt AUTOMOC` are placed in target-specific include
+directories.  CMake 3.26 and older added these as normal include directories.
+CMake 3.27 and newer prefer to add them as system include directories.
+This policy provides compatibility for projects that have not been updated
+to expect this.
+
+If the :prop_tgt:`AUTOGEN_USE_SYSTEM_INCLUDE` target property is set,
+perhaps via the :variable:`CMAKE_AUTOGEN_USE_SYSTEM_INCLUDE` variable,
+then its value is used regardless of the setting of this policy.
+
+The ``OLD`` behavior for this policy is to add autogen include directory to
+the target's include directories.
+The ``NEW`` behavior for this policy is to add autogen include directory to
+the target's system include directories.
+
+This policy was introduced in CMake version 3.27.  Use the
+:command:`cmake_policy` command to set it to ``OLD`` or ``NEW`` explicitly.
+Unlike many policies, CMake version |release| does *not* warn
+when this policy is not set and simply uses ``OLD`` behavior.
+
+.. include:: DEPRECATED.txt

+ 3 - 0
Help/prop_tgt/AUTOGEN_USE_SYSTEM_INCLUDE.rst

@@ -6,6 +6,9 @@ on a target to indicate that the autogen target include directory should
 be added as a system include directory or normal include directory to the
 target.
 
+If this property is not set, the autogen target include directory is added
+as a system include directory by default.  See policy :policy:`CMP0151`.
+
 See the :manual:`cmake-qt(7)` manual for more information on using CMake
 with Qt.
 

+ 4 - 0
Source/cmPolicies.h

@@ -455,6 +455,10 @@ class cmMakefile;
          "ExternalProject_Add and FetchContent_Declare commands "             \
          "treat relative GIT_REPOSITORY paths as being relative "             \
          "to the parent project's remote.",                                   \
+         3, 27, 0, cmPolicies::WARN)                                          \
+  SELECT(POLICY, CMP0151,                                                     \
+         "AUTOMOC include directory is a system include directory by "        \
+         "default.",                                                          \
          3, 27, 0, cmPolicies::WARN)
 
 #define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1)

+ 12 - 1
Source/cmQtAutoGenInitializer.cxx

@@ -587,7 +587,18 @@ bool cmQtAutoGenInitializer::InitCustomTargets()
         addBefore = true;
       }
     } else {
-      addBefore = true;
+      switch (this->Makefile->GetPolicyStatus(cmPolicies::CMP0151)) {
+        case cmPolicies::WARN:
+        case cmPolicies::OLD:
+          addBefore = true;
+          break;
+        case cmPolicies::REQUIRED_IF_USED:
+        case cmPolicies::REQUIRED_ALWAYS:
+        case cmPolicies::NEW:
+          this->GenTarget->AddSystemIncludeDirectory(this->Dir.IncludeGenExp,
+                                                     "CXX");
+          break;
+      }
     }
     this->GenTarget->AddIncludeDirectory(this->Dir.IncludeGenExp, addBefore);
   }

+ 10 - 0
Tests/RunCMake/Autogen/CMP0151-common.cmake

@@ -0,0 +1,10 @@
+enable_language(CXX)
+
+find_package(Qt${with_qt_version} REQUIRED COMPONENTS Core Widgets Gui)
+
+set(CMAKE_AUTOMOC ON)
+
+add_library(dummy SHARED empty.cpp)
+target_link_libraries(dummy Qt${with_qt_version}::Core
+                            Qt${with_qt_version}::Widgets
+                            Qt${with_qt_version}::Gui)

+ 1 - 0
Tests/RunCMake/Autogen/CMP0151-new.cmake

@@ -0,0 +1 @@
+include("${CMAKE_CURRENT_LIST_DIR}/CMP0151-common.cmake")

+ 1 - 0
Tests/RunCMake/Autogen/CMP0151-old.cmake

@@ -0,0 +1 @@
+include("${CMAKE_CURRENT_LIST_DIR}/CMP0151-common.cmake")

+ 20 - 2
Tests/RunCMake/Autogen/RunCMakeTest.cmake

@@ -40,9 +40,18 @@ if (DEFINED with_qt_version)
       string(APPEND test_expect_stdout "_Debug")
     endif()
 
+    block()
+      set(RunCMake_TEST_BINARY_DIR  ${RunCMake_BINARY_DIR}/CMP0151-new-build)
+      run_cmake_with_options(CMP0151-new ${RunCMake_TEST_OPTIONS} -DCMAKE_POLICY_DEFAULT_CMP0151=NEW)
+      set(RunCMake_TEST_NO_CLEAN 1)
+      set(RunCMake_TEST_EXPECT_stdout "${test_expect_stdout}")
+      message(STATUS "RunCMake_TEST_EXPECT_stdout: ${RunCMake_TEST_EXPECT_stdout}")
+      run_cmake_command(CMP0151-new-build ${CMAKE_COMMAND} --build . --config Debug --verbose)
+    endblock()
+
     block()
       set(RunCMake_TEST_BINARY_DIR  ${RunCMake_BINARY_DIR}/AutogenUseSystemIncludeOn-build)
-      run_cmake(AutogenUseSystemIncludeOn)
+      run_cmake_with_options(AutogenUseSystemIncludeOn ${RunCMake_TEST_OPTIONS} -DCMAKE_POLICY_DEFAULT_CMP0151=NEW)
       set(RunCMake_TEST_NO_CLEAN 1)
       set(RunCMake_TEST_EXPECT_stdout "${test_expect_stdout}")
       message(STATUS "RunCMake_TEST_EXPECT_stdout: ${RunCMake_TEST_EXPECT_stdout}")
@@ -61,9 +70,18 @@ if (DEFINED with_qt_version)
       string(APPEND test_expect_stdout "_Debug")
     endif()
 
+    block()
+      set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/CMP0151-old-build)
+      run_cmake_with_options(CMP0151-old ${RunCMake_TEST_OPTIONS} -DCMAKE_POLICY_DEFAULT_CMP0151=OLD)
+      set(RunCMake_TEST_NO_CLEAN 1)
+      set(RunCMake_TEST_EXPECT_stdout "${test_expect_stdout}")
+      message(STATUS "RunCMake_TEST_EXPECT_stdout: ${RunCMake_TEST_EXPECT_stdout}")
+      run_cmake_command(CMP0151-old-build ${CMAKE_COMMAND} --build . --config Debug --verbose)
+    endblock()
+
     block()
       set(RunCMake_TEST_BINARY_DIR  ${RunCMake_BINARY_DIR}/AutogenUseSystemIncludeOff-build)
-      run_cmake(AutogenUseSystemIncludeOff)
+      run_cmake_with_options(AutogenUseSystemIncludeOff ${RunCMake_TEST_OPTIONS} -DCMAKE_POLICY_DEFAULT_CMP0151=NEW)
       set(RunCMake_TEST_NO_CLEAN 1)
       set(RunCMake_TEST_EXPECT_stdout "${test_expect_stdout}")
       message(STATUS "RunCMake_TEST_EXPECT_stdout: ${RunCMake_TEST_EXPECT_stdout}")