Selaa lähdekoodia

Allow projects to specify extra inputs to CMake

Define a new 'CMAKE_CONFIGURE_DEPENDS' directory property that projects
can use to specify input files to the CMake configuration process.
Extend the RunCMake.Configure test to verify that the build system
re-runs CMake when this input changes.
Brad King 12 vuotta sitten
vanhempi
sitoutus
82d4317503

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

@@ -48,6 +48,7 @@ Properties on Directories
    /prop_dir/ADDITIONAL_MAKE_CLEAN_FILES
    /prop_dir/CACHE_VARIABLES
    /prop_dir/CLEAN_NO_CUSTOM
+   /prop_dir/CMAKE_CONFIGURE_DEPENDS
    /prop_dir/COMPILE_DEFINITIONS_CONFIG
    /prop_dir/COMPILE_DEFINITIONS
    /prop_dir/COMPILE_OPTIONS

+ 9 - 0
Help/prop_dir/CMAKE_CONFIGURE_DEPENDS.rst

@@ -0,0 +1,9 @@
+CMAKE_CONFIGURE_DEPENDS
+-----------------------
+
+Tell CMake about additional input files to the configuration process.
+If any named file is modified the build system will re-run CMake to
+re-configure the file and generate the build system again.
+
+Specify files as a semicolon-separated list of paths.  Relative paths
+are interpreted as relative to the current source directory.

+ 2 - 0
Source/cmLocalGenerator.cxx

@@ -114,6 +114,8 @@ void cmLocalGenerator::Configure()
       }
     }
 
+  this->Makefile->AddCMakeDependFilesFromUser();
+
   // Check whether relative paths should be used for optionally
   // relative paths.
   this->UseRelativePaths = this->Makefile->IsOn("CMAKE_USE_RELATIVE_PATHS");

+ 24 - 0
Source/cmMakefile.cxx

@@ -3913,6 +3913,30 @@ cmTest* cmMakefile::GetTest(const char* testName) const
   return 0;
 }
 
+void cmMakefile::AddCMakeDependFilesFromUser()
+{
+  std::vector<std::string> deps;
+  if(const char* deps_str = this->GetProperty("CMAKE_CONFIGURE_DEPENDS"))
+    {
+    cmSystemTools::ExpandListArgument(deps_str, deps);
+    }
+  for(std::vector<std::string>::iterator i = deps.begin();
+      i != deps.end(); ++i)
+    {
+    if(cmSystemTools::FileIsFullPath(i->c_str()))
+      {
+      this->AddCMakeDependFile(*i);
+      }
+    else
+      {
+      std::string f = this->GetCurrentDirectory();
+      f += "/";
+      f += *i;
+      this->AddCMakeDependFile(f);
+      }
+    }
+}
+
 std::string cmMakefile::GetListFileStack()
 {
   cmOStringStream tmp;

+ 1 - 0
Source/cmMakefile.h

@@ -650,6 +650,7 @@ public:
   ///! When the file changes cmake will be re-run from the build system.
   void AddCMakeDependFile(const std::string& file)
     { this->ListFiles.push_back(file);}
+  void AddCMakeDependFilesFromUser();
 
     /**
      * Get the list file stack as a string

+ 5 - 0
Tests/RunCMake/Configure/RerunCMake-build1-check.cmake

@@ -2,3 +2,8 @@ file(READ ${stamp} content)
 if(NOT content STREQUAL 1)
   set(RunCMake_TEST_FAILED "Expected stamp '1' but got: '${content}'")
 endif()
+
+file(READ ${output} content)
+if(NOT content STREQUAL 1)
+  set(RunCMake_TEST_FAILED "Expected output '1' but got: '${content}'")
+endif()

+ 9 - 0
Tests/RunCMake/Configure/RerunCMake-build2-check.cmake

@@ -0,0 +1,9 @@
+file(READ ${stamp} content)
+if(NOT content STREQUAL 2)
+  set(RunCMake_TEST_FAILED "Expected stamp '2' but got: '${content}'")
+endif()
+
+file(READ ${output} content)
+if(NOT content STREQUAL 2)
+  set(RunCMake_TEST_FAILED "Expected output '2' but got: '${content}'")
+endif()

+ 7 - 0
Tests/RunCMake/Configure/RerunCMake.cmake

@@ -2,3 +2,10 @@ set(input  ${CMAKE_CURRENT_BINARY_DIR}/CustomCMakeInput.txt)
 set(stamp  ${CMAKE_CURRENT_BINARY_DIR}/CustomCMakeStamp.txt)
 file(READ ${input} content)
 file(WRITE ${stamp} "${content}")
+
+set(depend ${CMAKE_CURRENT_BINARY_DIR}/CustomCMakeDepend.txt)
+set(output ${CMAKE_CURRENT_BINARY_DIR}/CustomCMakeOutput.txt)
+set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${depend})
+file(READ ${depend} content)
+file(WRITE ${output} "${content}")
+set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS RerunCMake.txt)

+ 1 - 0
Tests/RunCMake/Configure/RerunCMake.txt

@@ -0,0 +1 @@
+Source-tree dependency for "RerunCMake.cmake".

+ 5 - 0
Tests/RunCMake/Configure/RunCMakeTest.cmake

@@ -10,10 +10,15 @@ file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
 file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
 set(input  "${RunCMake_TEST_BINARY_DIR}/CustomCMakeInput.txt")
 set(stamp  "${RunCMake_TEST_BINARY_DIR}/CustomCMakeStamp.txt")
+set(depend "${RunCMake_TEST_BINARY_DIR}/CustomCMakeDepend.txt")
+set(output "${RunCMake_TEST_BINARY_DIR}/CustomCMakeOutput.txt")
 file(WRITE "${input}" "1")
+file(WRITE "${depend}" "1")
 run_cmake(RerunCMake)
 execute_process(COMMAND ${CMAKE_COMMAND} -E sleep 1) # handle 1s resolution
 file(WRITE "${input}" "2")
 run_cmake_command(RerunCMake-build1 ${CMAKE_COMMAND} --build .)
+file(WRITE "${depend}" "2")
+run_cmake_command(RerunCMake-build2 ${CMAKE_COMMAND} --build .)
 unset(RunCMake_TEST_BINARY_DIR)
 unset(RunCMake_TEST_NO_CLEAN)