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.
This commit is contained in:
parent
1ef444d678
commit
82d4317503
|
@ -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
|
||||
|
|
|
@ -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.
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
|
@ -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)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Source-tree dependency for "RerunCMake.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)
|
||||
|
|
Loading…
Reference in New Issue