Merge topic 'cmake-depend-in-project-only'
b06e17da
Help: Add notes for topic 'cmake-depend-in-project-only'52540245
Tests: Add test for CMAKE_DEPENDS_IN_PROJECT_ONLY variableb1e1aa1e
Makefile: Optionally scan only source and build trees for dependencies
This commit is contained in:
commit
917d49ed93
|
@ -114,6 +114,7 @@ Variables that Change Behavior
|
||||||
/variable/CMAKE_COLOR_MAKEFILE
|
/variable/CMAKE_COLOR_MAKEFILE
|
||||||
/variable/CMAKE_CONFIGURATION_TYPES
|
/variable/CMAKE_CONFIGURATION_TYPES
|
||||||
/variable/CMAKE_DEBUG_TARGET_PROPERTIES
|
/variable/CMAKE_DEBUG_TARGET_PROPERTIES
|
||||||
|
/variable/CMAKE_DEPENDS_IN_PROJECT_ONLY
|
||||||
/variable/CMAKE_DISABLE_FIND_PACKAGE_PackageName
|
/variable/CMAKE_DISABLE_FIND_PACKAGE_PackageName
|
||||||
/variable/CMAKE_ERROR_DEPRECATED
|
/variable/CMAKE_ERROR_DEPRECATED
|
||||||
/variable/CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION
|
/variable/CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
cmake-depend-in-project-only
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
* The :ref:`Makefile Generators` learned to optionally limit dependency
|
||||||
|
scanning only to files in the project source and build trees.
|
||||||
|
See the :variable:`CMAKE_DEPENDS_IN_PROJECT_ONLY` variable.
|
|
@ -0,0 +1,10 @@
|
||||||
|
CMAKE_DEPENDS_IN_PROJECT_ONLY
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
When set to ``TRUE`` in a directory, the build system produced by the
|
||||||
|
:ref:`Makefile Generators` is set up to only consider dependencies on source
|
||||||
|
files that appear either in the source or in the binary directories. Changes
|
||||||
|
to source files outside of these directories will not cause rebuilds.
|
||||||
|
|
||||||
|
This should be used carefully in cases where some source files are picked up
|
||||||
|
through external headers during the build.
|
|
@ -34,6 +34,7 @@
|
||||||
#include <cmsys/Terminal.h>
|
#include <cmsys/Terminal.h>
|
||||||
|
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
// Escape special characters in Makefile dependency lines
|
// Escape special characters in Makefile dependency lines
|
||||||
|
@ -1971,6 +1972,57 @@ void cmLocalUnixMakefileGenerator3::ClearDependencies(cmMakefile* mf,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
// Helper predicate for removing absolute paths that don't point to the
|
||||||
|
// source or binary directory. It is used when CMAKE_DEPENDS_IN_PROJECT_ONLY
|
||||||
|
// is set ON, to only consider in-project dependencies during the build.
|
||||||
|
class NotInProjectDir
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// Constructor with the source and binary directory's path
|
||||||
|
NotInProjectDir(const std::string& sourceDir,
|
||||||
|
const std::string& binaryDir)
|
||||||
|
: SourceDir(sourceDir), BinaryDir(binaryDir) {}
|
||||||
|
|
||||||
|
// Operator evaluating the predicate
|
||||||
|
bool operator()(const std::string& path) const
|
||||||
|
{
|
||||||
|
// Keep all relative paths:
|
||||||
|
if(!cmSystemTools::FileIsFullPath(path))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// If it's an absolute path, check if it starts with the source
|
||||||
|
// direcotory:
|
||||||
|
return (!(IsInDirectory(SourceDir, path)||
|
||||||
|
IsInDirectory(BinaryDir, path)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Helper function used by the predicate
|
||||||
|
static bool IsInDirectory(const std::string& baseDir,
|
||||||
|
const std::string& testDir)
|
||||||
|
{
|
||||||
|
// First check if the test directory "starts with" the base directory:
|
||||||
|
if (testDir.find(baseDir) != 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// If it does, then check that it's either the same string, or that the
|
||||||
|
// next character is a slash:
|
||||||
|
return ((testDir.size() == baseDir.size())||
|
||||||
|
(testDir[baseDir.size()] == '/'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// The path to the source directory
|
||||||
|
std::string SourceDir;
|
||||||
|
// The path to the binary directory
|
||||||
|
std::string BinaryDir;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void cmLocalUnixMakefileGenerator3
|
void cmLocalUnixMakefileGenerator3
|
||||||
::WriteDependLanguageInfo(std::ostream& cmakefileStream,
|
::WriteDependLanguageInfo(std::ostream& cmakefileStream,
|
||||||
cmGeneratorTarget* target)
|
cmGeneratorTarget* target)
|
||||||
|
@ -2058,6 +2110,15 @@ void cmLocalUnixMakefileGenerator3
|
||||||
this->Makefile->GetSafeDefinition("CMAKE_BUILD_TYPE");
|
this->Makefile->GetSafeDefinition("CMAKE_BUILD_TYPE");
|
||||||
this->GetIncludeDirectories(includes, target,
|
this->GetIncludeDirectories(includes, target,
|
||||||
l->first, config);
|
l->first, config);
|
||||||
|
if(this->Makefile->IsOn("CMAKE_DEPENDS_IN_PROJECT_ONLY"))
|
||||||
|
{
|
||||||
|
const char* sourceDir = this->GetState()->GetSourceDirectory();
|
||||||
|
const char* binaryDir = this->GetState()->GetBinaryDirectory();
|
||||||
|
std::vector<std::string>::iterator itr =
|
||||||
|
std::remove_if(includes.begin(), includes.end(),
|
||||||
|
::NotInProjectDir(sourceDir, binaryDir));
|
||||||
|
includes.erase(itr, includes.end());
|
||||||
|
}
|
||||||
for(std::vector<std::string>::iterator i = includes.begin();
|
for(std::vector<std::string>::iterator i = includes.begin();
|
||||||
i != includes.end(); ++i)
|
i != includes.end(); ++i)
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
#include <MakeInProjectOnly.h>
|
||||||
|
int main() { return MakeInProjectOnly(); }
|
|
@ -0,0 +1,16 @@
|
||||||
|
enable_language(C)
|
||||||
|
get_filename_component(include_dir "${CMAKE_BINARY_DIR}" PATH)
|
||||||
|
include_directories("${include_dir}")
|
||||||
|
add_executable(MakeInProjectOnly MakeInProjectOnly.c)
|
||||||
|
set(CMAKE_DEPENDS_IN_PROJECT_ONLY 1)
|
||||||
|
file(GENERATE OUTPUT check-$<LOWER_CASE:$<CONFIG>>.cmake CONTENT "
|
||||||
|
if (check_step EQUAL 1)
|
||||||
|
set(check_pairs
|
||||||
|
\"$<TARGET_FILE:MakeInProjectOnly>|${include_dir}/MakeInProjectOnly.h\"
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
set(check_pairs
|
||||||
|
\"${include_dir}/MakeInProjectOnly.h|\$<TARGET_FILE:MakeInProjectOnly>\"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
")
|
|
@ -0,0 +1,3 @@
|
||||||
|
file(WRITE "${RunCMake_TEST_BINARY_DIR}/../MakeInProjectOnly.h" [[
|
||||||
|
int MakeInProjectOnly(void) { return 0; }
|
||||||
|
]])
|
|
@ -0,0 +1,3 @@
|
||||||
|
file(WRITE "${RunCMake_TEST_BINARY_DIR}/../MakeInProjectOnly.h" [[
|
||||||
|
int MakeInProjectOnly(void) { return 1; }
|
||||||
|
]])
|
|
@ -41,6 +41,11 @@ endif()
|
||||||
|
|
||||||
run_BuildDepends(Custom-Always)
|
run_BuildDepends(Custom-Always)
|
||||||
|
|
||||||
|
if(RunCMake_GENERATOR MATCHES "Make" AND
|
||||||
|
NOT "${RunCMake_BINARY_DIR}" STREQUAL "${RunCMake_SOURCE_DIR}")
|
||||||
|
run_BuildDepends(MakeInProjectOnly)
|
||||||
|
endif()
|
||||||
|
|
||||||
function(run_ReGeneration)
|
function(run_ReGeneration)
|
||||||
# test re-generation of project even if CMakeLists.txt files disappeared
|
# test re-generation of project even if CMakeLists.txt files disappeared
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue