Merge topic 'ninja-cleanup-path-conversion'
6e2a4087
Ninja: Centralize path conversion in global generator (#15757)993d0641
Ninja: Fix OBJECT_DIR placeholder substitution in link rules
This commit is contained in:
commit
5ed2292d3a
|
@ -818,6 +818,17 @@ void cmGlobalNinjaGenerator::CloseRulesFileStream()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string cmGlobalNinjaGenerator::ConvertToNinjaPath(const std::string& path)
|
||||||
|
{
|
||||||
|
cmLocalNinjaGenerator *ng =
|
||||||
|
static_cast<cmLocalNinjaGenerator *>(this->LocalGenerators[0]);
|
||||||
|
std::string convPath = ng->Convert(path, cmOutputConverter::HOME_OUTPUT);
|
||||||
|
#ifdef _WIN32
|
||||||
|
cmSystemTools::ReplaceString(convPath, "/", "\\");
|
||||||
|
#endif
|
||||||
|
return convPath;
|
||||||
|
}
|
||||||
|
|
||||||
void cmGlobalNinjaGenerator::AddCXXCompileCommand(
|
void cmGlobalNinjaGenerator::AddCXXCompileCommand(
|
||||||
const std::string &commandLine,
|
const std::string &commandLine,
|
||||||
const std::string &sourceFile)
|
const std::string &sourceFile)
|
||||||
|
@ -907,8 +918,6 @@ cmGlobalNinjaGenerator
|
||||||
{
|
{
|
||||||
std::string configName =
|
std::string configName =
|
||||||
target->GetMakefile()->GetSafeDefinition("CMAKE_BUILD_TYPE");
|
target->GetMakefile()->GetSafeDefinition("CMAKE_BUILD_TYPE");
|
||||||
cmLocalNinjaGenerator *ng =
|
|
||||||
static_cast<cmLocalNinjaGenerator *>(this->LocalGenerators[0]);
|
|
||||||
|
|
||||||
// for frameworks, we want the real name, not smple name
|
// for frameworks, we want the real name, not smple name
|
||||||
// frameworks always appear versioned, and the build.ninja
|
// frameworks always appear versioned, and the build.ninja
|
||||||
|
@ -923,13 +932,13 @@ cmGlobalNinjaGenerator
|
||||||
case cmTarget::MODULE_LIBRARY:
|
case cmTarget::MODULE_LIBRARY:
|
||||||
{
|
{
|
||||||
cmGeneratorTarget *gtgt = this->GetGeneratorTarget(target);
|
cmGeneratorTarget *gtgt = this->GetGeneratorTarget(target);
|
||||||
outputs.push_back(ng->ConvertToNinjaPath(
|
outputs.push_back(this->ConvertToNinjaPath(
|
||||||
gtgt->GetFullPath(configName, false, realname)));
|
gtgt->GetFullPath(configName, false, realname)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case cmTarget::OBJECT_LIBRARY:
|
case cmTarget::OBJECT_LIBRARY:
|
||||||
case cmTarget::UTILITY: {
|
case cmTarget::UTILITY: {
|
||||||
std::string path = ng->ConvertToNinjaPath(
|
std::string path = this->ConvertToNinjaPath(
|
||||||
target->GetMakefile()->GetCurrentBinaryDirectory());
|
target->GetMakefile()->GetCurrentBinaryDirectory());
|
||||||
if (path.empty() || path == ".")
|
if (path.empty() || path == ".")
|
||||||
outputs.push_back(target->GetName());
|
outputs.push_back(target->GetName());
|
||||||
|
@ -1041,8 +1050,6 @@ void cmGlobalNinjaGenerator::WriteUnknownExplicitDependencies(std::ostream& os)
|
||||||
|
|
||||||
//get the list of files that cmake itself has generated as a
|
//get the list of files that cmake itself has generated as a
|
||||||
//product of configuration.
|
//product of configuration.
|
||||||
cmLocalNinjaGenerator *ng =
|
|
||||||
static_cast<cmLocalNinjaGenerator *>(this->LocalGenerators[0]);
|
|
||||||
|
|
||||||
for (std::vector<cmLocalGenerator *>::const_iterator i =
|
for (std::vector<cmLocalGenerator *>::const_iterator i =
|
||||||
this->LocalGenerators.begin(); i != this->LocalGenerators.end(); ++i)
|
this->LocalGenerators.begin(); i != this->LocalGenerators.end(); ++i)
|
||||||
|
@ -1054,7 +1061,7 @@ void cmGlobalNinjaGenerator::WriteUnknownExplicitDependencies(std::ostream& os)
|
||||||
typedef std::vector<std::string>::const_iterator vect_it;
|
typedef std::vector<std::string>::const_iterator vect_it;
|
||||||
for(vect_it j = files.begin(); j != files.end(); ++j)
|
for(vect_it j = files.begin(); j != files.end(); ++j)
|
||||||
{
|
{
|
||||||
knownDependencies.insert( ng->ConvertToNinjaPath( *j ) );
|
knownDependencies.insert( this->ConvertToNinjaPath( *j ) );
|
||||||
}
|
}
|
||||||
//get list files which are implicit dependencies as well and will be phony
|
//get list files which are implicit dependencies as well and will be phony
|
||||||
//for rebuild manifest
|
//for rebuild manifest
|
||||||
|
@ -1062,7 +1069,7 @@ void cmGlobalNinjaGenerator::WriteUnknownExplicitDependencies(std::ostream& os)
|
||||||
typedef std::vector<std::string>::const_iterator vect_it;
|
typedef std::vector<std::string>::const_iterator vect_it;
|
||||||
for(vect_it j = lf.begin(); j != lf.end(); ++j)
|
for(vect_it j = lf.begin(); j != lf.end(); ++j)
|
||||||
{
|
{
|
||||||
knownDependencies.insert( ng->ConvertToNinjaPath( *j ) );
|
knownDependencies.insert( this->ConvertToNinjaPath( *j ) );
|
||||||
}
|
}
|
||||||
std::vector<cmGeneratorExpressionEvaluationFile*> const& ef =
|
std::vector<cmGeneratorExpressionEvaluationFile*> const& ef =
|
||||||
(*i)->GetMakefile()->GetEvaluationFiles();
|
(*i)->GetMakefile()->GetEvaluationFiles();
|
||||||
|
@ -1074,7 +1081,7 @@ void cmGlobalNinjaGenerator::WriteUnknownExplicitDependencies(std::ostream& os)
|
||||||
std::vector<std::string> evaluationFiles = (*li)->GetFiles();
|
std::vector<std::string> evaluationFiles = (*li)->GetFiles();
|
||||||
for(vect_it j = evaluationFiles.begin(); j != evaluationFiles.end(); ++j)
|
for(vect_it j = evaluationFiles.begin(); j != evaluationFiles.end(); ++j)
|
||||||
{
|
{
|
||||||
knownDependencies.insert( ng->ConvertToNinjaPath( *j ) );
|
knownDependencies.insert( this->ConvertToNinjaPath( *j ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1084,7 +1091,7 @@ void cmGlobalNinjaGenerator::WriteUnknownExplicitDependencies(std::ostream& os)
|
||||||
i != this->TargetAliases.end();
|
i != this->TargetAliases.end();
|
||||||
++i)
|
++i)
|
||||||
{
|
{
|
||||||
knownDependencies.insert( ng->ConvertToNinjaPath(i->first) );
|
knownDependencies.insert( this->ConvertToNinjaPath(i->first) );
|
||||||
}
|
}
|
||||||
|
|
||||||
//remove all source files we know will exist.
|
//remove all source files we know will exist.
|
||||||
|
@ -1093,7 +1100,7 @@ void cmGlobalNinjaGenerator::WriteUnknownExplicitDependencies(std::ostream& os)
|
||||||
i != this->AssumedSourceDependencies.end();
|
i != this->AssumedSourceDependencies.end();
|
||||||
++i)
|
++i)
|
||||||
{
|
{
|
||||||
knownDependencies.insert( ng->ConvertToNinjaPath(i->first) );
|
knownDependencies.insert( this->ConvertToNinjaPath(i->first) );
|
||||||
}
|
}
|
||||||
|
|
||||||
//now we difference with CombinedCustomCommandExplicitDependencies to find
|
//now we difference with CombinedCustomCommandExplicitDependencies to find
|
||||||
|
@ -1214,8 +1221,6 @@ void cmGlobalNinjaGenerator::WriteTargetRebuildManifest(std::ostream& os)
|
||||||
/*restat=*/ "",
|
/*restat=*/ "",
|
||||||
/*generator=*/ true);
|
/*generator=*/ true);
|
||||||
|
|
||||||
cmLocalNinjaGenerator *ng = static_cast<cmLocalNinjaGenerator *>(lg);
|
|
||||||
|
|
||||||
cmNinjaDeps implicitDeps;
|
cmNinjaDeps implicitDeps;
|
||||||
for(std::vector<cmLocalGenerator*>::const_iterator i =
|
for(std::vector<cmLocalGenerator*>::const_iterator i =
|
||||||
this->LocalGenerators.begin(); i != this->LocalGenerators.end(); ++i)
|
this->LocalGenerators.begin(); i != this->LocalGenerators.end(); ++i)
|
||||||
|
@ -1224,7 +1229,7 @@ void cmGlobalNinjaGenerator::WriteTargetRebuildManifest(std::ostream& os)
|
||||||
for(std::vector<std::string>::const_iterator fi = lf.begin();
|
for(std::vector<std::string>::const_iterator fi = lf.begin();
|
||||||
fi != lf.end(); ++fi)
|
fi != lf.end(); ++fi)
|
||||||
{
|
{
|
||||||
implicitDeps.push_back(ng->ConvertToNinjaPath(*fi));
|
implicitDeps.push_back(this->ConvertToNinjaPath(*fi));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
implicitDeps.push_back("CMakeCache.txt");
|
implicitDeps.push_back("CMakeCache.txt");
|
||||||
|
|
|
@ -220,6 +220,19 @@ public:
|
||||||
cmGeneratedFileStream* GetRulesFileStream() const {
|
cmGeneratedFileStream* GetRulesFileStream() const {
|
||||||
return this->RulesFileStream; }
|
return this->RulesFileStream; }
|
||||||
|
|
||||||
|
std::string ConvertToNinjaPath(const std::string& path);
|
||||||
|
|
||||||
|
struct MapToNinjaPathImpl {
|
||||||
|
cmGlobalNinjaGenerator* GG;
|
||||||
|
MapToNinjaPathImpl(cmGlobalNinjaGenerator* gg): GG(gg) {}
|
||||||
|
std::string operator()(std::string const& path) {
|
||||||
|
return this->GG->ConvertToNinjaPath(path);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
MapToNinjaPathImpl MapToNinjaPath() {
|
||||||
|
return MapToNinjaPathImpl(this);
|
||||||
|
}
|
||||||
|
|
||||||
void AddCXXCompileCommand(const std::string &commandLine,
|
void AddCXXCompileCommand(const std::string &commandLine,
|
||||||
const std::string &sourceFile);
|
const std::string &sourceFile);
|
||||||
|
|
||||||
|
|
|
@ -284,15 +284,6 @@ void cmLocalNinjaGenerator::WriteProcessedMakefile(std::ostream& os)
|
||||||
os << std::endl;
|
os << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string cmLocalNinjaGenerator::ConvertToNinjaPath(const std::string& path)
|
|
||||||
{
|
|
||||||
std::string convPath = this->Convert(path, cmLocalGenerator::HOME_OUTPUT);
|
|
||||||
#ifdef _WIN32
|
|
||||||
cmSystemTools::ReplaceString(convPath, "/", "\\");
|
|
||||||
#endif
|
|
||||||
return convPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
cmLocalNinjaGenerator
|
cmLocalNinjaGenerator
|
||||||
::AppendTargetOutputs(cmTarget* target, cmNinjaDeps& outputs)
|
::AppendTargetOutputs(cmTarget* target, cmNinjaDeps& outputs)
|
||||||
|
@ -316,7 +307,8 @@ void cmLocalNinjaGenerator::AppendCustomCommandDeps(
|
||||||
i != deps.end(); ++i) {
|
i != deps.end(); ++i) {
|
||||||
std::string dep;
|
std::string dep;
|
||||||
if (this->GetRealDependency(*i, this->GetConfigName(), dep))
|
if (this->GetRealDependency(*i, this->GetConfigName(), dep))
|
||||||
ninjaDeps.push_back(ConvertToNinjaPath(dep));
|
ninjaDeps.push_back(
|
||||||
|
this->GetGlobalNinjaGenerator()->ConvertToNinjaPath(dep));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -413,9 +405,11 @@ cmLocalNinjaGenerator::WriteCustomCommandBuildStatement(
|
||||||
at us. How to know which ExternalProject step actually provides it?
|
at us. How to know which ExternalProject step actually provides it?
|
||||||
#endif
|
#endif
|
||||||
std::transform(outputs.begin(), outputs.end(),
|
std::transform(outputs.begin(), outputs.end(),
|
||||||
ninjaOutputs.begin(), MapToNinjaPath());
|
ninjaOutputs.begin(),
|
||||||
|
this->GetGlobalNinjaGenerator()->MapToNinjaPath());
|
||||||
std::transform(byproducts.begin(), byproducts.end(),
|
std::transform(byproducts.begin(), byproducts.end(),
|
||||||
ninjaOutputs.begin() + outputs.size(), MapToNinjaPath());
|
ninjaOutputs.begin() + outputs.size(),
|
||||||
|
this->GetGlobalNinjaGenerator()->MapToNinjaPath());
|
||||||
this->AppendCustomCommandDeps(ccg, ninjaDeps);
|
this->AppendCustomCommandDeps(ccg, ninjaDeps);
|
||||||
|
|
||||||
for (cmNinjaDeps::iterator i = ninjaOutputs.begin(); i != ninjaOutputs.end();
|
for (cmNinjaDeps::iterator i = ninjaOutputs.begin(); i != ninjaOutputs.end();
|
||||||
|
|
|
@ -50,21 +50,6 @@ public:
|
||||||
std::string GetHomeRelativeOutputPath() const
|
std::string GetHomeRelativeOutputPath() const
|
||||||
{ return this->HomeRelativeOutputPath; }
|
{ return this->HomeRelativeOutputPath; }
|
||||||
|
|
||||||
std::string ConvertToNinjaPath(const std::string& path);
|
|
||||||
|
|
||||||
struct map_to_ninja_path {
|
|
||||||
cmLocalNinjaGenerator *LocalGenerator;
|
|
||||||
map_to_ninja_path(cmLocalNinjaGenerator *LocalGen)
|
|
||||||
: LocalGenerator(LocalGen) {}
|
|
||||||
std::string operator()(const std::string &path) {
|
|
||||||
return LocalGenerator->ConvertToNinjaPath(path);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
map_to_ninja_path MapToNinjaPath() {
|
|
||||||
return map_to_ninja_path(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExpandRuleVariables(std::string& string,
|
void ExpandRuleVariables(std::string& string,
|
||||||
const RuleVariables& replaceValues) {
|
const RuleVariables& replaceValues) {
|
||||||
cmLocalGenerator::ExpandRuleVariables(string, replaceValues);
|
cmLocalGenerator::ExpandRuleVariables(string, replaceValues);
|
||||||
|
|
|
@ -583,7 +583,9 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement()
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string objPath = GetTarget()->GetSupportDirectory();
|
const std::string objPath = GetTarget()->GetSupportDirectory();
|
||||||
vars["OBJECT_DIR"] = ConvertToNinjaPath(objPath);
|
vars["OBJECT_DIR"] =
|
||||||
|
this->GetLocalGenerator()->ConvertToOutputFormat(
|
||||||
|
this->ConvertToNinjaPath(objPath), cmLocalGenerator::SHELL);
|
||||||
EnsureDirectoryExists(objPath);
|
EnsureDirectoryExists(objPath);
|
||||||
|
|
||||||
if (this->GetGlobalGenerator()->IsGCCOnWindows())
|
if (this->GetGlobalGenerator()->IsGCCOnWindows())
|
||||||
|
|
|
@ -771,14 +771,14 @@ cmNinjaTargetGenerator::MacOSXContentGeneratorType::operator()(
|
||||||
// Get the input file location.
|
// Get the input file location.
|
||||||
std::string input = source.GetFullPath();
|
std::string input = source.GetFullPath();
|
||||||
input =
|
input =
|
||||||
this->Generator->GetLocalGenerator()->ConvertToNinjaPath(input);
|
this->Generator->GetGlobalGenerator()->ConvertToNinjaPath(input);
|
||||||
|
|
||||||
// Get the output file location.
|
// Get the output file location.
|
||||||
std::string output = macdir;
|
std::string output = macdir;
|
||||||
output += "/";
|
output += "/";
|
||||||
output += cmSystemTools::GetFilenameName(input);
|
output += cmSystemTools::GetFilenameName(input);
|
||||||
output =
|
output =
|
||||||
this->Generator->GetLocalGenerator()->ConvertToNinjaPath(output);
|
this->Generator->GetGlobalGenerator()->ConvertToNinjaPath(output);
|
||||||
|
|
||||||
// Write a build statement to copy the content into the bundle.
|
// Write a build statement to copy the content into the bundle.
|
||||||
this->Generator->GetGlobalGenerator()->WriteMacOSXContentBuild(input,
|
this->Generator->GetGlobalGenerator()->WriteMacOSXContentBuild(input,
|
||||||
|
|
|
@ -17,11 +17,11 @@
|
||||||
|
|
||||||
#include "cmStandardIncludes.h"
|
#include "cmStandardIncludes.h"
|
||||||
#include "cmNinjaTypes.h"
|
#include "cmNinjaTypes.h"
|
||||||
|
#include "cmGlobalNinjaGenerator.h"
|
||||||
#include "cmLocalNinjaGenerator.h"
|
#include "cmLocalNinjaGenerator.h"
|
||||||
#include "cmOSXBundleGenerator.h"
|
#include "cmOSXBundleGenerator.h"
|
||||||
|
|
||||||
class cmTarget;
|
class cmTarget;
|
||||||
class cmGlobalNinjaGenerator;
|
|
||||||
class cmGeneratedFileStream;
|
class cmGeneratedFileStream;
|
||||||
class cmGeneratorTarget;
|
class cmGeneratorTarget;
|
||||||
class cmMakefile;
|
class cmMakefile;
|
||||||
|
@ -87,10 +87,10 @@ protected:
|
||||||
const std::string& language);
|
const std::string& language);
|
||||||
|
|
||||||
std::string ConvertToNinjaPath(const std::string& path) const {
|
std::string ConvertToNinjaPath(const std::string& path) const {
|
||||||
return this->GetLocalGenerator()->ConvertToNinjaPath(path);
|
return this->GetGlobalGenerator()->ConvertToNinjaPath(path);
|
||||||
}
|
}
|
||||||
cmLocalNinjaGenerator::map_to_ninja_path MapToNinjaPath() const {
|
cmGlobalNinjaGenerator::MapToNinjaPathImpl MapToNinjaPath() const {
|
||||||
return this->GetLocalGenerator()->MapToNinjaPath();
|
return this->GetGlobalGenerator()->MapToNinjaPath();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @return the list of link dependency for the given target @a target.
|
/// @return the list of link dependency for the given target @a target.
|
||||||
|
|
|
@ -1,2 +1,4 @@
|
||||||
add_library(outlib outlib.c)
|
add_library(outlib outlib.c)
|
||||||
|
|
||||||
|
add_executable(outexe outexe.c)
|
||||||
|
target_link_libraries(outexe subdir)
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
extern int subdir(void);
|
||||||
|
int main(void) { return subdir(); }
|
|
@ -6,3 +6,5 @@ add_subdirectory(${OutOfSource_SOURCE_DIR}/../OutOfBinary
|
||||||
|
|
||||||
# subdir to a sibling dir
|
# subdir to a sibling dir
|
||||||
add_subdirectory(${OutOfSource_SOURCE_DIR}/${KEN}OutOfSourceSubdir OutOfSourceSubdir )
|
add_subdirectory(${OutOfSource_SOURCE_DIR}/${KEN}OutOfSourceSubdir OutOfSourceSubdir )
|
||||||
|
|
||||||
|
add_library(subdir subdir.c)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
int subdir(void) { return 0; }
|
Loading…
Reference in New Issue