mirror of
https://github.com/Kitware/CMake.git
synced 2026-03-11 20:11:10 -05:00
Merge topic 'symlink-build-under-source'
d33b12d84bAdd support for build tree symlink inside source tree43416c48edcmOutputConverter: Always set relative path top source and binary togetherde766bc7e0Xcode: Fix support for source tree symlink inside build tree55db2cf1e5Makefiles: Fix "make depend" with add_custom_command DEPFILE Acked-by: Kitware Robot <kwrobot@kitware.com> Tested-by: buildbot <buildbot@kitware.com> Merge-request: !7020
This commit is contained in:
@@ -2495,8 +2495,7 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile(
|
||||
snapshot.GetDirectory().SetCurrentBinary(dir_cur_bld);
|
||||
auto mfd = cm::make_unique<cmMakefile>(this, snapshot);
|
||||
auto lgd = this->CreateLocalGenerator(mfd.get());
|
||||
lgd->SetRelativePathTopSource(dir_top_src);
|
||||
lgd->SetRelativePathTopBinary(dir_top_bld);
|
||||
lgd->SetRelativePathTop(dir_top_src, dir_top_bld);
|
||||
this->Makefiles.push_back(std::move(mfd));
|
||||
this->LocalGenerators.push_back(std::move(lgd));
|
||||
}
|
||||
|
||||
@@ -4695,10 +4695,12 @@ std::string cmGlobalXCodeGenerator::ConvertToRelativeForMake(
|
||||
|
||||
std::string cmGlobalXCodeGenerator::RelativeToSource(const std::string& p)
|
||||
{
|
||||
// We force conversion because Xcode breakpoints do not work unless
|
||||
// they are in a file named relative to the source tree.
|
||||
return cmSystemTools::ForceToRelativePath(
|
||||
this->CurrentRootGenerator->GetCurrentSourceDirectory(), p);
|
||||
std::string const& rootSrc =
|
||||
this->CurrentRootGenerator->GetCurrentSourceDirectory();
|
||||
if (cmSystemTools::IsSubDirectory(p, rootSrc)) {
|
||||
return cmSystemTools::ForceToRelativePath(rootSrc, p);
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
std::string cmGlobalXCodeGenerator::RelativeToBinary(const std::string& p)
|
||||
|
||||
@@ -1508,13 +1508,12 @@ bool cmLocalUnixMakefileGenerator3::ScanDependencies(
|
||||
}
|
||||
|
||||
// Setup relative path top directories.
|
||||
if (cmValue relativePathTopSource =
|
||||
mf->GetDefinition("CMAKE_RELATIVE_PATH_TOP_SOURCE")) {
|
||||
this->SetRelativePathTopSource(*relativePathTopSource);
|
||||
}
|
||||
if (cmValue relativePathTopBinary =
|
||||
mf->GetDefinition("CMAKE_RELATIVE_PATH_TOP_BINARY")) {
|
||||
this->SetRelativePathTopBinary(*relativePathTopBinary);
|
||||
cmValue relativePathTopSource =
|
||||
mf->GetDefinition("CMAKE_RELATIVE_PATH_TOP_SOURCE");
|
||||
cmValue relativePathTopBinary =
|
||||
mf->GetDefinition("CMAKE_RELATIVE_PATH_TOP_BINARY");
|
||||
if (relativePathTopSource && relativePathTopBinary) {
|
||||
this->SetRelativePathTop(*relativePathTopSource, *relativePathTopBinary);
|
||||
}
|
||||
} else {
|
||||
cmSystemTools::Error("Directory Information file not found");
|
||||
@@ -1849,7 +1848,7 @@ void cmLocalUnixMakefileGenerator3::ClearDependencies(cmMakefile* mf,
|
||||
cmSystemTools::Touch(DepTimestamp.GenericString(), true);
|
||||
|
||||
// clear the dependencies files generated by the compiler
|
||||
std::vector<std::string> dependencies = cmExpandedList(depsFiles);
|
||||
std::vector<std::string> dependencies = cmExpandedList(depsFiles, true);
|
||||
cmDependsCompiler depsManager;
|
||||
depsManager.SetVerbose(verbose);
|
||||
depsManager.ClearDependencies(dependencies);
|
||||
|
||||
@@ -34,6 +34,7 @@ cmOutputConverter::cmOutputConverter(cmStateSnapshot const& snapshot)
|
||||
assert(this->StateSnapshot.IsValid());
|
||||
this->ComputeRelativePathTopSource();
|
||||
this->ComputeRelativePathTopBinary();
|
||||
this->ComputeRelativePathTopRelation();
|
||||
}
|
||||
|
||||
void cmOutputConverter::ComputeRelativePathTopSource()
|
||||
@@ -69,6 +70,22 @@ void cmOutputConverter::ComputeRelativePathTopBinary()
|
||||
this->RelativePathTopBinary = snapshot.GetDirectory().GetCurrentBinary();
|
||||
}
|
||||
|
||||
void cmOutputConverter::ComputeRelativePathTopRelation()
|
||||
{
|
||||
if (cmSystemTools::ComparePath(this->RelativePathTopSource,
|
||||
this->RelativePathTopBinary)) {
|
||||
this->RelativePathTopRelation = TopRelation::InSource;
|
||||
} else if (cmSystemTools::IsSubDirectory(this->RelativePathTopBinary,
|
||||
this->RelativePathTopSource)) {
|
||||
this->RelativePathTopRelation = TopRelation::BinInSrc;
|
||||
} else if (cmSystemTools::IsSubDirectory(this->RelativePathTopSource,
|
||||
this->RelativePathTopBinary)) {
|
||||
this->RelativePathTopRelation = TopRelation::SrcInBin;
|
||||
} else {
|
||||
this->RelativePathTopRelation = TopRelation::Separate;
|
||||
}
|
||||
}
|
||||
|
||||
std::string const& cmOutputConverter::GetRelativePathTopSource() const
|
||||
{
|
||||
return this->RelativePathTopSource;
|
||||
@@ -79,27 +96,45 @@ std::string const& cmOutputConverter::GetRelativePathTopBinary() const
|
||||
return this->RelativePathTopBinary;
|
||||
}
|
||||
|
||||
void cmOutputConverter::SetRelativePathTopSource(std::string const& top)
|
||||
void cmOutputConverter::SetRelativePathTop(std::string const& topSource,
|
||||
std::string const& topBinary)
|
||||
{
|
||||
this->RelativePathTopSource = top;
|
||||
}
|
||||
|
||||
void cmOutputConverter::SetRelativePathTopBinary(std::string const& top)
|
||||
{
|
||||
this->RelativePathTopBinary = top;
|
||||
this->RelativePathTopSource = topSource;
|
||||
this->RelativePathTopBinary = topBinary;
|
||||
this->ComputeRelativePathTopRelation();
|
||||
}
|
||||
|
||||
std::string cmOutputConverter::MaybeRelativeTo(
|
||||
std::string const& local_path, std::string const& remote_path) const
|
||||
{
|
||||
bool bothInBinary =
|
||||
PathEqOrSubDir(local_path, this->RelativePathTopBinary) &&
|
||||
bool localInBinary = PathEqOrSubDir(local_path, this->RelativePathTopBinary);
|
||||
bool remoteInBinary =
|
||||
PathEqOrSubDir(remote_path, this->RelativePathTopBinary);
|
||||
|
||||
bool bothInSource =
|
||||
PathEqOrSubDir(local_path, this->RelativePathTopSource) &&
|
||||
bool localInSource = PathEqOrSubDir(local_path, this->RelativePathTopSource);
|
||||
bool remoteInSource =
|
||||
PathEqOrSubDir(remote_path, this->RelativePathTopSource);
|
||||
|
||||
switch (this->RelativePathTopRelation) {
|
||||
case TopRelation::Separate:
|
||||
// Checks are independent.
|
||||
break;
|
||||
case TopRelation::BinInSrc:
|
||||
localInSource = localInSource && !localInBinary;
|
||||
remoteInSource = remoteInSource && !remoteInBinary;
|
||||
break;
|
||||
case TopRelation::SrcInBin:
|
||||
localInBinary = localInBinary && !localInSource;
|
||||
remoteInBinary = remoteInBinary && !remoteInSource;
|
||||
break;
|
||||
case TopRelation::InSource:
|
||||
// Checks are identical.
|
||||
break;
|
||||
};
|
||||
|
||||
bool const bothInBinary = localInBinary && remoteInBinary;
|
||||
bool const bothInSource = localInSource && remoteInSource;
|
||||
|
||||
if (bothInBinary || bothInSource) {
|
||||
return cmSystemTools::ForceToRelativePath(local_path, remote_path);
|
||||
}
|
||||
|
||||
@@ -29,8 +29,8 @@ public:
|
||||
|
||||
std::string const& GetRelativePathTopSource() const;
|
||||
std::string const& GetRelativePathTopBinary() const;
|
||||
void SetRelativePathTopSource(std::string const& top);
|
||||
void SetRelativePathTopBinary(std::string const& top);
|
||||
void SetRelativePathTop(std::string const& topSource,
|
||||
std::string const& topBinary);
|
||||
|
||||
enum OutputFormat
|
||||
{
|
||||
@@ -147,8 +147,17 @@ private:
|
||||
// safely by the build tools.
|
||||
std::string RelativePathTopSource;
|
||||
std::string RelativePathTopBinary;
|
||||
enum class TopRelation
|
||||
{
|
||||
Separate,
|
||||
BinInSrc,
|
||||
SrcInBin,
|
||||
InSource,
|
||||
};
|
||||
TopRelation RelativePathTopRelation = TopRelation::Separate;
|
||||
void ComputeRelativePathTopSource();
|
||||
void ComputeRelativePathTopBinary();
|
||||
void ComputeRelativePathTopRelation();
|
||||
std::string MaybeRelativeTo(std::string const& local_path,
|
||||
std::string const& remote_path) const;
|
||||
};
|
||||
|
||||
@@ -1286,8 +1286,7 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args,
|
||||
// FIXME: With advanced add_subdirectory usage, these are
|
||||
// not necessarily the same as the generator originally used.
|
||||
// We should pass all these directories through an info file.
|
||||
lgd->SetRelativePathTopSource(homeDir);
|
||||
lgd->SetRelativePathTopBinary(homeOutDir);
|
||||
lgd->SetRelativePathTop(homeDir, homeOutDir);
|
||||
|
||||
// Actually scan dependencies.
|
||||
return lgd->UpdateDependencies(depInfo, verbose, color) ? 0 : 2;
|
||||
@@ -1569,8 +1568,7 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args,
|
||||
// FIXME: With advanced add_subdirectory usage, these are
|
||||
// not necessarily the same as the generator originally used.
|
||||
// We should pass all these directories through an info file.
|
||||
lgd->SetRelativePathTopSource(homeDir);
|
||||
lgd->SetRelativePathTopBinary(homeOutDir);
|
||||
lgd->SetRelativePathTop(homeDir, homeOutDir);
|
||||
|
||||
return cmTransformDepfile(format, *lgd, args[8], args[9]) ? 0 : 2;
|
||||
}
|
||||
|
||||
@@ -76,18 +76,6 @@ function (run_symlink_test case src bin src_from_bin bin_from_src)
|
||||
run_symlink_test_case("${case}" -S "../${name}/${src}" -B "../${name}/${bin}")
|
||||
|
||||
# Verify paths passed to compiler.
|
||||
if(case MATCHES "^(different|asymmetric)-bin_in_src$")
|
||||
# FIXME: Some generators compute incorrect relative paths.
|
||||
message(STATUS "${case}-exe - SKIPPED")
|
||||
message(STATUS "${case}-exe-build - SKIPPED")
|
||||
return()
|
||||
endif()
|
||||
if(case MATCHES "^(different|asymmetric)-src_in_bin$" AND RunCMake_GENERATOR STREQUAL "Xcode")
|
||||
# FIXME: The Xcode generator computes an incorrect relative path.
|
||||
message(STATUS "${case}-exe - SKIPPED")
|
||||
message(STATUS "${case}-exe-build - SKIPPED")
|
||||
return()
|
||||
endif()
|
||||
unset(RunCMake_TEST_VARIANT_DESCRIPTION)
|
||||
run_symlink_test_case("${case}-exe" -S "${src}" -B "${bin}")
|
||||
if (RunCMake_GENERATOR MATCHES "Xcode")
|
||||
|
||||
Reference in New Issue
Block a user