Add OBJECT_FILE_DIR rule placeholder for compilation lines
Some compilers do not offer an option to specify the path to the object file, but rather only to the directory in which to place the object file. See issue 14876 for some examples. Add a new OBJECT_FILE_DIR placeholder to specify the directory containing the object file for the current compilation. This may differ from the main target OBJECT_DIR when the object corresponds to a source in a subdirectory.
This commit is contained in:
parent
8ab2d7d462
commit
8256ccb78c
|
@ -875,6 +875,13 @@ cmLocalGenerator::ExpandRuleVariable(std::string const& variable,
|
||||||
return replaceValues.ObjectDir;
|
return replaceValues.ObjectDir;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(replaceValues.ObjectFileDir)
|
||||||
|
{
|
||||||
|
if(variable == "OBJECT_FILE_DIR")
|
||||||
|
{
|
||||||
|
return replaceValues.ObjectFileDir;
|
||||||
|
}
|
||||||
|
}
|
||||||
if(replaceValues.Objects)
|
if(replaceValues.Objects)
|
||||||
{
|
{
|
||||||
if(variable == "OBJECTS")
|
if(variable == "OBJECTS")
|
||||||
|
|
|
@ -269,6 +269,7 @@ public:
|
||||||
const char* Output;
|
const char* Output;
|
||||||
const char* Object;
|
const char* Object;
|
||||||
const char* ObjectDir;
|
const char* ObjectDir;
|
||||||
|
const char* ObjectFileDir;
|
||||||
const char* Flags;
|
const char* Flags;
|
||||||
const char* ObjectsQuoted;
|
const char* ObjectsQuoted;
|
||||||
const char* SONameFlag;
|
const char* SONameFlag;
|
||||||
|
|
|
@ -684,6 +684,11 @@ cmMakefileTargetGenerator
|
||||||
cmLocalGenerator::START_OUTPUT,
|
cmLocalGenerator::START_OUTPUT,
|
||||||
cmLocalGenerator::SHELL);
|
cmLocalGenerator::SHELL);
|
||||||
vars.ObjectDir = objectDir.c_str();
|
vars.ObjectDir = objectDir.c_str();
|
||||||
|
std::string objectFileDir = cmSystemTools::GetFilenamePath(obj);
|
||||||
|
objectFileDir = this->Convert(objectFileDir,
|
||||||
|
cmLocalGenerator::START_OUTPUT,
|
||||||
|
cmLocalGenerator::SHELL);
|
||||||
|
vars.ObjectFileDir = objectFileDir.c_str();
|
||||||
vars.Flags = flags.c_str();
|
vars.Flags = flags.c_str();
|
||||||
|
|
||||||
std::string definesString = "$(";
|
std::string definesString = "$(";
|
||||||
|
|
|
@ -385,6 +385,7 @@ cmNinjaTargetGenerator
|
||||||
vars.TargetPDB = "$TARGET_PDB";
|
vars.TargetPDB = "$TARGET_PDB";
|
||||||
vars.TargetCompilePDB = "$TARGET_COMPILE_PDB";
|
vars.TargetCompilePDB = "$TARGET_COMPILE_PDB";
|
||||||
vars.ObjectDir = "$OBJECT_DIR";
|
vars.ObjectDir = "$OBJECT_DIR";
|
||||||
|
vars.ObjectFileDir = "$OBJECT_FILE_DIR";
|
||||||
|
|
||||||
cmMakefile* mf = this->GetMakefile();
|
cmMakefile* mf = this->GetMakefile();
|
||||||
|
|
||||||
|
@ -623,6 +624,10 @@ cmNinjaTargetGenerator
|
||||||
vars["OBJECT_DIR"] = this->GetLocalGenerator()->ConvertToOutputFormat(
|
vars["OBJECT_DIR"] = this->GetLocalGenerator()->ConvertToOutputFormat(
|
||||||
ConvertToNinjaPath(objectDir.c_str()),
|
ConvertToNinjaPath(objectDir.c_str()),
|
||||||
cmLocalGenerator::SHELL);
|
cmLocalGenerator::SHELL);
|
||||||
|
std::string objectFileDir = cmSystemTools::GetFilenamePath(objectFileName);
|
||||||
|
vars["OBJECT_FILE_DIR"] = this->GetLocalGenerator()->ConvertToOutputFormat(
|
||||||
|
ConvertToNinjaPath(objectFileDir.c_str()),
|
||||||
|
cmLocalGenerator::SHELL);
|
||||||
|
|
||||||
this->addPoolNinjaVariable("JOB_POOL_COMPILE", this->GetTarget(), vars);
|
this->addPoolNinjaVariable("JOB_POOL_COMPILE", this->GetTarget(), vars);
|
||||||
|
|
||||||
|
@ -651,6 +656,7 @@ cmNinjaTargetGenerator
|
||||||
compileObjectVars.Source = escapedSourceFileName.c_str();
|
compileObjectVars.Source = escapedSourceFileName.c_str();
|
||||||
compileObjectVars.Object = objectFileName.c_str();
|
compileObjectVars.Object = objectFileName.c_str();
|
||||||
compileObjectVars.ObjectDir = objectDir.c_str();
|
compileObjectVars.ObjectDir = objectDir.c_str();
|
||||||
|
compileObjectVars.ObjectFileDir = objectFileDir.c_str();
|
||||||
compileObjectVars.Flags = vars["FLAGS"].c_str();
|
compileObjectVars.Flags = vars["FLAGS"].c_str();
|
||||||
compileObjectVars.Defines = vars["DEFINES"].c_str();
|
compileObjectVars.Defines = vars["DEFINES"].c_str();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue