浏览代码

Merge topic 'all-verify-interface-header-sets'

83e44002ae VERIFY_INTERFACE_HEADER_SETS: Add verification target for all

Acked-by: Kitware Robot <[email protected]>
Merge-request: !7536
Kyle Edwards 3 年之前
父节点
当前提交
e7bfd0ac7a

+ 4 - 0
Help/prop_tgt/VERIFY_INTERFACE_HEADER_SETS.rst

@@ -26,6 +26,10 @@ Otherwise, if C++ is enabled globally, the header is compiled as C++.
 Otherwise, if C is enabled globally, the header is compiled as C. Otherwise,
 the header file is not compiled.
 
+If any verification targets are created, a top-level target called
+``all_verify_interface_header_sets`` is created which depends on all
+verification targets.
+
 This property is initialized by the value of the
 :variable:`CMAKE_VERIFY_INTERFACE_HEADER_SETS` variable if it is set when
 a target is created.

+ 12 - 0
Source/cmGeneratorTarget.cxx

@@ -8579,6 +8579,9 @@ bool cmGeneratorTarget::AddHeaderSetVerification()
   }
 
   cmTarget* verifyTarget = nullptr;
+  cmTarget* allVerifyTarget =
+    this->GlobalGenerator->GetMakefiles().front()->FindTargetToUse(
+      "all_verify_interface_header_sets", true);
 
   auto interfaceFileSetEntries = this->Target->GetInterfaceHeaderSetsEntries();
 
@@ -8666,6 +8669,15 @@ bool cmGeneratorTarget::AddHeaderSetVerification()
             verifyTarget->FinalizeTargetCompileInfo(
               this->Makefile->GetCompileDefinitionsEntries(),
               perConfigCompileDefinitions);
+
+            if (!allVerifyTarget) {
+              allVerifyTarget = this->GlobalGenerator->GetMakefiles()
+                                  .front()
+                                  ->AddNewUtilityTarget(
+                                    "all_verify_interface_header_sets", true);
+            }
+
+            allVerifyTarget->AddUtility(verifyTarget->GetName(), false);
           }
 
           if (fileCgesContextSensitive) {

+ 8 - 0
Source/cmGlobalGenerator.cxx

@@ -1758,6 +1758,14 @@ bool cmGlobalGenerator::AddHeaderSetVerification()
     }
   }
 
+  cmTarget* allVerifyTarget = this->Makefiles.front()->FindTargetToUse(
+    "all_verify_interface_header_sets", true);
+  if (allVerifyTarget) {
+    this->LocalGenerators.front()->AddGeneratorTarget(
+      cm::make_unique<cmGeneratorTarget>(allVerifyTarget,
+                                         this->LocalGenerators.front().get()));
+  }
+
   return true;
 }
 

+ 10 - 0
Tests/RunCMake/VerifyHeaderSets/AllVerifyInterfaceHeaderSets-all_verify_interface_header_sets-Debug-build-check.cmake

@@ -0,0 +1,10 @@
+# A custom command is used to copy the header file from the source directory to
+# the binary directory. If the verification target was built, the custom
+# command should have been executed, and the file should be present in the
+# binary directory.
+if(NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/dir1/lib1.h")
+  string(APPEND RunCMake_TEST_FAILED "${RunCMake_TEST_BINARY_DIR}/dir1/lib1.h should exist but it does not\n")
+endif()
+if(NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/dir2/lib2.h")
+  string(APPEND RunCMake_TEST_FAILED "${RunCMake_TEST_BINARY_DIR}/dir2/lib2.h should exist but it does not\n")
+endif()

+ 4 - 0
Tests/RunCMake/VerifyHeaderSets/AllVerifyInterfaceHeaderSets.cmake

@@ -0,0 +1,4 @@
+enable_language(C)
+
+add_subdirectory(dir1)
+add_subdirectory(dir2)

+ 6 - 0
Tests/RunCMake/VerifyHeaderSets/RunCMakeTest.cmake

@@ -43,6 +43,12 @@ run_cmake_build(VerifyHeaderSets lang_test_cxx_verify_interface_header_sets)
 run_cmake_build(VerifyHeaderSets interface_lang_test_cxx_verify_interface_header_sets)
 run_cmake_build(VerifyHeaderSets list_verify_interface_header_sets)
 
+set(RunCMake_TEST_OPTIONS -DCMAKE_VERIFY_INTERFACE_HEADER_SETS=ON)
+run_cmake(AllVerifyInterfaceHeaderSets)
+unset(RunCMake_TEST_OPTIONS)
+
+run_cmake_build(AllVerifyInterfaceHeaderSets all_verify_interface_header_sets)
+
 set(RunCMake_TEST_OPTIONS -DCMAKE_VERIFY_INTERFACE_HEADER_SETS=ON)
 run_cmake(VerifyHeaderSetsNonexistent)
 unset(RunCMake_TEST_OPTIONS)

+ 3 - 0
Tests/RunCMake/VerifyHeaderSets/dir1/CMakeLists.txt

@@ -0,0 +1,3 @@
+add_library(lib1 STATIC ../lib.c)
+add_custom_command(OUTPUT lib1.h COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/lib1.h lib1.h)
+target_sources(lib1 PUBLIC FILE_SET HEADERS BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR} FILES ${CMAKE_CURRENT_BINARY_DIR}/lib1.h)

+ 4 - 0
Tests/RunCMake/VerifyHeaderSets/dir1/lib1.h

@@ -0,0 +1,4 @@
+#ifdef _WIN32
+__declspec(dllimport)
+#endif
+  extern void lib1(void);

+ 3 - 0
Tests/RunCMake/VerifyHeaderSets/dir2/CMakeLists.txt

@@ -0,0 +1,3 @@
+add_library(lib2 STATIC ../lib.c)
+add_custom_command(OUTPUT lib2.h COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/lib2.h lib2.h)
+target_sources(lib2 PUBLIC FILE_SET HEADERS BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR} FILES ${CMAKE_CURRENT_BINARY_DIR}/lib2.h)

+ 4 - 0
Tests/RunCMake/VerifyHeaderSets/dir2/lib2.h

@@ -0,0 +1,4 @@
+#ifdef _WIN32
+__declspec(dllimport)
+#endif
+  extern void lib2(void);