Replace <OBJECT_DIR> rule placeholder consistently (#14667)
The <OBJECT_DIR> placeholder is supposed to be the base intermediate
files directory for the current target. This is how it gets replaced
during link line generation. However, during compile line generation
we replace it with the directory containing the current object file
which may be a subdirectory. Fix replacement of <OBJECT_DIR> in the
generated compile lines to be the base intermediate files directory.
This was expoxed by commit 42ba1b08
(VS: Separate compiler and linker
PDB files, 2013-04-05) when we added a "/Fd<OBJECT_DIR>/" flag to the
MSVC compile line in order to match the VS IDE default compiler program
database location in the intermediate files directory. For source files
in a subdirectory relative to the current target this caused the wrong
location to be used for the compiler program database. This becomes
particularly important when using precompiled headers.
While at it, use the cmTarget::GetSupportDirectory method to compute the
intermediate files directory for the current target instead of repeating
the logic in a few places.
This commit is contained in:
parent
c515dc5748
commit
03f3b4e727
|
@ -338,13 +338,11 @@ void cmMakefileExecutableTargetGenerator::WriteExecutableRule(bool relink)
|
||||||
vars.CMTarget = this->Target;
|
vars.CMTarget = this->Target;
|
||||||
vars.Language = linkLanguage;
|
vars.Language = linkLanguage;
|
||||||
vars.Objects = buildObjs.c_str();
|
vars.Objects = buildObjs.c_str();
|
||||||
std::string objdir = cmake::GetCMakeFilesDirectoryPostSlash();
|
std::string objectDir = this->Target->GetSupportDirectory();
|
||||||
objdir += this->Target->GetName();
|
objectDir = this->Convert(objectDir.c_str(),
|
||||||
objdir += ".dir";
|
|
||||||
objdir = this->Convert(objdir.c_str(),
|
|
||||||
cmLocalGenerator::START_OUTPUT,
|
cmLocalGenerator::START_OUTPUT,
|
||||||
cmLocalGenerator::SHELL);
|
cmLocalGenerator::SHELL);
|
||||||
vars.ObjectDir = objdir.c_str();
|
vars.ObjectDir = objectDir.c_str();
|
||||||
vars.Target = targetOutPathReal.c_str();
|
vars.Target = targetOutPathReal.c_str();
|
||||||
vars.TargetPDB = targetOutPathPDB.c_str();
|
vars.TargetPDB = targetOutPathPDB.c_str();
|
||||||
|
|
||||||
|
|
|
@ -577,13 +577,11 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules
|
||||||
vars.CMTarget = this->Target;
|
vars.CMTarget = this->Target;
|
||||||
vars.Language = linkLanguage;
|
vars.Language = linkLanguage;
|
||||||
vars.Objects = buildObjs.c_str();
|
vars.Objects = buildObjs.c_str();
|
||||||
std::string objdir = cmake::GetCMakeFilesDirectoryPostSlash();
|
std::string objectDir = this->Target->GetSupportDirectory();
|
||||||
objdir += this->Target->GetName();
|
objectDir = this->Convert(objectDir.c_str(),
|
||||||
objdir += ".dir";
|
|
||||||
objdir = this->Convert(objdir.c_str(),
|
|
||||||
cmLocalGenerator::START_OUTPUT,
|
cmLocalGenerator::START_OUTPUT,
|
||||||
cmLocalGenerator::SHELL);
|
cmLocalGenerator::SHELL);
|
||||||
vars.ObjectDir = objdir.c_str();
|
vars.ObjectDir = objectDir.c_str();
|
||||||
vars.Target = targetOutPathReal.c_str();
|
vars.Target = targetOutPathReal.c_str();
|
||||||
vars.LinkLibraries = linkLibs.c_str();
|
vars.LinkLibraries = linkLibs.c_str();
|
||||||
vars.ObjectsQuoted = buildObjs.c_str();
|
vars.ObjectsQuoted = buildObjs.c_str();
|
||||||
|
|
|
@ -638,7 +638,7 @@ cmMakefileTargetGenerator
|
||||||
cmLocalGenerator::NONE,
|
cmLocalGenerator::NONE,
|
||||||
cmLocalGenerator::SHELL).c_str();
|
cmLocalGenerator::SHELL).c_str();
|
||||||
vars.Object = shellObj.c_str();
|
vars.Object = shellObj.c_str();
|
||||||
std::string objectDir = cmSystemTools::GetFilenamePath(obj);
|
std::string objectDir = this->Target->GetSupportDirectory();
|
||||||
objectDir = this->Convert(objectDir.c_str(),
|
objectDir = this->Convert(objectDir.c_str(),
|
||||||
cmLocalGenerator::START_OUTPUT,
|
cmLocalGenerator::START_OUTPUT,
|
||||||
cmLocalGenerator::SHELL);
|
cmLocalGenerator::SHELL);
|
||||||
|
|
|
@ -543,7 +543,7 @@ cmNinjaTargetGenerator
|
||||||
vars["DEP_FILE"] = objectFileName + ".d";;
|
vars["DEP_FILE"] = objectFileName + ".d";;
|
||||||
EnsureParentDirectoryExists(objectFileName);
|
EnsureParentDirectoryExists(objectFileName);
|
||||||
|
|
||||||
std::string objectDir = cmSystemTools::GetFilenamePath(objectFileName);
|
std::string objectDir = this->Target->GetSupportDirectory();
|
||||||
vars["OBJECT_DIR"] = this->GetLocalGenerator()->ConvertToOutputFormat(
|
vars["OBJECT_DIR"] = this->GetLocalGenerator()->ConvertToOutputFormat(
|
||||||
ConvertToNinjaPath(objectDir.c_str()).c_str(),
|
ConvertToNinjaPath(objectDir.c_str()).c_str(),
|
||||||
cmLocalGenerator::SHELL);
|
cmLocalGenerator::SHELL);
|
||||||
|
|
Loading…
Reference in New Issue