Просмотр исходного кода

Ninja Multi-Config: Add support for DEPFILE option in add_custom_command()

And give other generators a path forward to add support in the future.
Kyle Edwards 5 лет назад
Родитель
Сommit
67102d3252

+ 1 - 1
Source/cmAddCustomCommandCommand.cxx

@@ -174,7 +174,7 @@ bool cmAddCustomCommandCommand(std::vector<std::string> const& args,
         doing = doing_comment;
       } else if (copy == keyDEPFILE) {
         doing = doing_depfile;
-        if (mf.GetGlobalGenerator()->GetName() != "Ninja") {
+        if (!mf.GetGlobalGenerator()->SupportsCustomCommandDepfile()) {
           status.SetError("Option DEPFILE not supported by " +
                           mf.GetGlobalGenerator()->GetName());
           return false;

+ 2 - 0
Source/cmGlobalGenerator.h

@@ -448,6 +448,8 @@ public:
       MacFolder. */
   virtual bool ShouldStripResourcePath(cmMakefile*) const;
 
+  virtual bool SupportsCustomCommandDepfile() const { return false; }
+
   std::string GetSharedLibFlagsForLanguage(std::string const& lang) const;
 
   /** Generate an <output>.rule file path for a given command output.  */

+ 2 - 0
Source/cmGlobalNinjaGenerator.h

@@ -211,6 +211,8 @@ public:
   }
   const char* GetCleanTargetName() const override { return "clean"; }
 
+  bool SupportsCustomCommandDepfile() const override { return true; }
+
   virtual cmGeneratedFileStream* GetImplFileStream(
     const std::string& /*config*/) const
   {

+ 5 - 0
Tests/RunCMake/NinjaMultiConfig/CustomCommandDepfile-check.cmake

@@ -0,0 +1,5 @@
+set(log "${RunCMake_BINARY_DIR}/CustomCommandDepfile-build/CMakeFiles/impl-Debug.ninja")
+file(READ "${log}" build_file)
+if(NOT "${build_file}" MATCHES "depfile = test\\.d")
+  set(RunCMake_TEST_FAILED "Log file:\n ${log}\ndoes not have expected line: depfile = test.d")
+endif()

+ 9 - 0
Tests/RunCMake/NinjaMultiConfig/CustomCommandDepfile.cmake

@@ -0,0 +1,9 @@
+add_custom_command(
+  OUTPUT main.copy.c
+  COMMAND "${CMAKE_COMMAND}" -E copy
+          "${CMAKE_CURRENT_SOURCE_DIR}/main.c"
+          main.copy.c
+  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
+  DEPFILE "test.d"
+  )
+add_custom_target(copy ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/main.copy.c")

+ 4 - 0
Tests/RunCMake/NinjaMultiConfig/RunCMakeTest.cmake

@@ -224,6 +224,10 @@ run_ninja(CustomCommandsAndTargets release-postbuild build-Release.ninja SubdirP
 run_cmake_build(CustomCommandsAndTargets debug-targetpostbuild Debug TopTargetPostBuild)
 run_ninja(CustomCommandsAndTargets release-targetpostbuild build-Release.ninja SubdirTargetPostBuild)
 
+unset(RunCMake_TEST_BINARY_DIR)
+
+run_cmake(CustomCommandDepfile)
+
 set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/PostfixAndLocation-build)
 set(RunCMake_TEST_OPTIONS "-DCMAKE_CONFIGURATION_TYPES=Debug\\;Release;-DCMAKE_NMC_CROSS_CONFIGS=all")
 run_cmake_configure(PostfixAndLocation)