Move GetFullPath to cmGeneratorTarget

This commit is contained in:
Stephen Kelly 2012-10-06 18:30:43 +02:00
parent dfb025bf12
commit ec38e4c84f
12 changed files with 143 additions and 128 deletions

View File

@ -535,10 +535,13 @@ bool cmComputeLinkInformation::Compute()
i != wrongItems.end(); ++i) i != wrongItems.end(); ++i)
{ {
cmTarget const* tgt = *i; cmTarget const* tgt = *i;
cmGeneratorTarget *gtgt = tgt->GetMakefile()
->GetGlobalGenerator()
->GetGeneratorTarget(tgt);
bool implib = bool implib =
(this->UseImportLibrary && (this->UseImportLibrary &&
(tgt->GetType() == cmTarget::SHARED_LIBRARY)); (tgt->GetType() == cmTarget::SHARED_LIBRARY));
std::string lib = tgt->GetFullPath(this->Config , implib, true); std::string lib = gtgt->GetFullPath(this->Config , implib, true);
this->OldLinkDirItems.push_back(lib); this->OldLinkDirItems.push_back(lib);
} }
} }
@ -637,6 +640,9 @@ void cmComputeLinkInformation::AddItem(std::string const& item,
if(tgt && tgt->IsLinkable()) if(tgt && tgt->IsLinkable())
{ {
cmGeneratorTarget *gtgt = tgt->GetMakefile()
->GetGlobalGenerator()
->GetGeneratorTarget(tgt);
// This is a CMake target. Ask the target for its real name. // This is a CMake target. Ask the target for its real name.
if(impexe && this->LoaderFlag) if(impexe && this->LoaderFlag)
{ {
@ -645,7 +651,8 @@ void cmComputeLinkInformation::AddItem(std::string const& item,
// platform. Add it now. // platform. Add it now.
std::string linkItem; std::string linkItem;
linkItem = this->LoaderFlag; linkItem = this->LoaderFlag;
std::string exe = tgt->GetFullPath(config, this->UseImportLibrary,
std::string exe = gtgt->GetFullPath(config, this->UseImportLibrary,
true); true);
linkItem += exe; linkItem += exe;
this->Items.push_back(Item(linkItem, true, tgt)); this->Items.push_back(Item(linkItem, true, tgt));
@ -666,7 +673,7 @@ void cmComputeLinkInformation::AddItem(std::string const& item,
(impexe || tgt->GetType() == cmTarget::SHARED_LIBRARY)); (impexe || tgt->GetType() == cmTarget::SHARED_LIBRARY));
// Pass the full path to the target file. // Pass the full path to the target file.
std::string lib = tgt->GetFullPath(config, implib, true); std::string lib = gtgt->GetFullPath(config, implib, true);
if(!this->LinkDependsNoShared || if(!this->LinkDependsNoShared ||
tgt->GetType() != cmTarget::SHARED_LIBRARY) tgt->GetType() != cmTarget::SHARED_LIBRARY)
{ {
@ -755,7 +762,10 @@ void cmComputeLinkInformation::AddSharedDepItem(std::string const& item,
std::string lib; std::string lib;
if(tgt) if(tgt)
{ {
lib = tgt->GetFullPath(this->Config, this->UseImportLibrary); cmGeneratorTarget *gtgt = tgt->GetMakefile()
->GetGlobalGenerator()
->GetGeneratorTarget(tgt);
lib = gtgt->GetFullPath(this->Config, this->UseImportLibrary);
this->AddLibraryRuntimeInfo(lib, tgt); this->AddLibraryRuntimeInfo(lib, tgt);
} }
else else

View File

@ -181,6 +181,9 @@ cmExportBuildFileGenerator
// Get the makefile in which to lookup target information. // Get the makefile in which to lookup target information.
cmMakefile* mf = target->GetMakefile(); cmMakefile* mf = target->GetMakefile();
cmGeneratorTarget* gtgt =
mf->GetGlobalGenerator()->GetGeneratorTarget(target);
// Add the main target file. // Add the main target file.
{ {
std::string prop = "IMPORTED_LOCATION"; std::string prop = "IMPORTED_LOCATION";
@ -188,11 +191,11 @@ cmExportBuildFileGenerator
std::string value; std::string value;
if(target->IsAppBundleOnApple()) if(target->IsAppBundleOnApple())
{ {
value = target->GetFullPath(config, false); value = gtgt->GetFullPath(config, false);
} }
else else
{ {
value = target->GetFullPath(config, false, true); value = gtgt->GetFullPath(config, false, true);
} }
properties[prop] = value; properties[prop] = value;
} }
@ -209,7 +212,7 @@ cmExportBuildFileGenerator
{ {
std::string prop = "IMPORTED_IMPLIB"; std::string prop = "IMPORTED_IMPLIB";
prop += suffix; prop += suffix;
std::string value = target->GetFullPath(config, true); std::string value = gtgt->GetFullPath(config, true);
target->GetImplibGNUtoMS(value, value, target->GetImplibGNUtoMS(value, value,
"${CMAKE_IMPORT_LIBRARY_SUFFIX}"); "${CMAKE_IMPORT_LIBRARY_SUFFIX}");
properties[prop] = value; properties[prop] = value;

View File

@ -1556,7 +1556,7 @@ class ArtifactDirTag;
template<typename ArtifactT> template<typename ArtifactT>
struct TargetFilesystemArtifactResultCreator struct TargetFilesystemArtifactResultCreator
{ {
static std::string Create(cmTarget* target, static std::string Create(cmGeneratorTarget* target,
cmGeneratorExpressionContext *context, cmGeneratorExpressionContext *context,
const GeneratorExpressionContent *content); const GeneratorExpressionContent *content);
}; };
@ -1565,12 +1565,12 @@ struct TargetFilesystemArtifactResultCreator
template<> template<>
struct TargetFilesystemArtifactResultCreator<ArtifactSonameTag> struct TargetFilesystemArtifactResultCreator<ArtifactSonameTag>
{ {
static std::string Create(cmTarget* target, static std::string Create(cmGeneratorTarget* target,
cmGeneratorExpressionContext *context, cmGeneratorExpressionContext *context,
const GeneratorExpressionContent *content) const GeneratorExpressionContent *content)
{ {
// The target soname file (.so.1). // The target soname file (.so.1).
if(target->IsDLLPlatform()) if(target->Target->IsDLLPlatform())
{ {
::reportError(context, content->GetOriginalExpression(), ::reportError(context, content->GetOriginalExpression(),
"TARGET_SONAME_FILE is not allowed " "TARGET_SONAME_FILE is not allowed "
@ -1584,9 +1584,9 @@ struct TargetFilesystemArtifactResultCreator<ArtifactSonameTag>
"SHARED libraries."); "SHARED libraries.");
return std::string(); return std::string();
} }
std::string result = target->GetDirectory(context->Config); std::string result = target->Target->GetDirectory(context->Config);
result += "/"; result += "/";
result += target->GetSOName(context->Config); result += target->Target->GetSOName(context->Config);
return result; return result;
} }
}; };
@ -1595,11 +1595,11 @@ struct TargetFilesystemArtifactResultCreator<ArtifactSonameTag>
template<> template<>
struct TargetFilesystemArtifactResultCreator<ArtifactPdbTag> struct TargetFilesystemArtifactResultCreator<ArtifactPdbTag>
{ {
static std::string Create(cmTarget* target, static std::string Create(cmGeneratorTarget* target,
cmGeneratorExpressionContext *context, cmGeneratorExpressionContext *context,
const GeneratorExpressionContent *content) const GeneratorExpressionContent *content)
{ {
std::string language = target->GetLinkerLanguage(context->Config); std::string language = target->Target->GetLinkerLanguage(context->Config);
std::string pdbSupportVar = "CMAKE_" + language + "_LINKER_SUPPORTS_PDB"; std::string pdbSupportVar = "CMAKE_" + language + "_LINKER_SUPPORTS_PDB";
@ -1610,7 +1610,7 @@ struct TargetFilesystemArtifactResultCreator<ArtifactPdbTag>
return std::string(); return std::string();
} }
cmTarget::TargetType targetType = target->GetType(); cmTarget::TargetType targetType = target->Target->GetType();
if(targetType != cmTarget::SHARED_LIBRARY && if(targetType != cmTarget::SHARED_LIBRARY &&
targetType != cmTarget::MODULE_LIBRARY && targetType != cmTarget::MODULE_LIBRARY &&
@ -1622,9 +1622,9 @@ struct TargetFilesystemArtifactResultCreator<ArtifactPdbTag>
return std::string(); return std::string();
} }
std::string result = target->GetPDBDirectory(context->Config); std::string result = target->Target->GetPDBDirectory(context->Config);
result += "/"; result += "/";
result += target->GetPDBName(context->Config); result += target->Target->GetPDBName(context->Config);
return result; return result;
} }
}; };
@ -1633,12 +1633,12 @@ struct TargetFilesystemArtifactResultCreator<ArtifactPdbTag>
template<> template<>
struct TargetFilesystemArtifactResultCreator<ArtifactLinkerTag> struct TargetFilesystemArtifactResultCreator<ArtifactLinkerTag>
{ {
static std::string Create(cmTarget* target, static std::string Create(cmGeneratorTarget* target,
cmGeneratorExpressionContext *context, cmGeneratorExpressionContext *context,
const GeneratorExpressionContent *content) const GeneratorExpressionContent *content)
{ {
// The file used to link to the target (.so, .lib, .a). // The file used to link to the target (.so, .lib, .a).
if(!target->IsLinkable()) if(!target->Target->IsLinkable())
{ {
::reportError(context, content->GetOriginalExpression(), ::reportError(context, content->GetOriginalExpression(),
"TARGET_LINKER_FILE is allowed only for libraries and " "TARGET_LINKER_FILE is allowed only for libraries and "
@ -1646,7 +1646,7 @@ struct TargetFilesystemArtifactResultCreator<ArtifactLinkerTag>
return std::string(); return std::string();
} }
return target->GetFullPath(context->Config, return target->GetFullPath(context->Config,
target->HasImportLibrary()); target->Target->HasImportLibrary());
} }
}; };
@ -1654,7 +1654,7 @@ struct TargetFilesystemArtifactResultCreator<ArtifactLinkerTag>
template<> template<>
struct TargetFilesystemArtifactResultCreator<ArtifactNameTag> struct TargetFilesystemArtifactResultCreator<ArtifactNameTag>
{ {
static std::string Create(cmTarget* target, static std::string Create(cmGeneratorTarget* target,
cmGeneratorExpressionContext *context, cmGeneratorExpressionContext *context,
const GeneratorExpressionContent *) const GeneratorExpressionContent *)
{ {
@ -1716,7 +1716,8 @@ struct TargetFilesystemArtifact : public cmGeneratorExpressionNode
"Expression syntax not recognized."); "Expression syntax not recognized.");
return std::string(); return std::string();
} }
cmTarget* target = context->Makefile->FindTargetToUse(name); cmGeneratorTarget* target =
context->Makefile->FindGeneratorTargetToUse(name);
if(!target) if(!target)
{ {
::reportError(context, content->GetOriginalExpression(), ::reportError(context, content->GetOriginalExpression(),
@ -1739,8 +1740,8 @@ struct TargetFilesystemArtifact : public cmGeneratorExpressionNode
"be used while evaluating link libraries"); "be used while evaluating link libraries");
return std::string(); return std::string();
} }
context->DependTargets.insert(target); context->DependTargets.insert(target->Target);
context->AllTargets.insert(target); context->AllTargets.insert(target->Target);
std::string result = std::string result =
TargetFilesystemArtifactResultCreator<ArtifactT>::Create( TargetFilesystemArtifactResultCreator<ArtifactT>::Create(

View File

@ -529,7 +529,7 @@ const char* cmGeneratorTarget::GetLocation(const std::string& config) const
} }
else else
{ {
location = this->Target->GetFullPath(config, false); location = this->GetFullPath(config, false);
} }
return location.c_str(); return location.c_str();
} }
@ -1182,6 +1182,86 @@ void cmGeneratorTarget::GenerateTargetManifest(
} }
} }
//----------------------------------------------------------------------------
std::string cmGeneratorTarget::GetFullPath(const std::string& config,
bool implib, bool realname) const
{
if(this->Target->IsImported())
{
return this->Target->ImportedGetFullPath(config, implib);
}
else
{
return this->NormalGetFullPath(config, implib, realname);
}
}
std::string cmGeneratorTarget::NormalGetFullPath(const std::string& config,
bool implib,
bool realname) const
{
std::string fpath = this->Target->GetDirectory(config, implib);
fpath += "/";
if(this->Target->IsAppBundleOnApple())
{
fpath = this->Target->BuildMacContentDirectory(fpath, config, false);
fpath += "/";
}
// Add the full name of the target.
if(implib)
{
fpath += this->Target->GetFullName(config, true);
}
else if(realname)
{
fpath += this->NormalGetRealName(config);
}
else
{
fpath += this->Target->GetFullName(config, false);
}
return fpath;
}
//----------------------------------------------------------------------------
std::string
cmGeneratorTarget::NormalGetRealName(const std::string& config) const
{
// This should not be called for imported targets.
// TODO: Split cmTarget into a class hierarchy to get compile-time
// enforcement of the limited imported target API.
if(this->Target->IsImported())
{
std::string msg = "NormalGetRealName called on imported target: ";
msg += this->GetName();
this->Makefile->IssueMessage(cmake::INTERNAL_ERROR, msg);
}
if(this->GetType() == cmTarget::EXECUTABLE)
{
// Compute the real name that will be built.
std::string name;
std::string realName;
std::string impName;
std::string pdbName;
this->Target->GetExecutableNames(name, realName, impName, pdbName, config);
return realName;
}
else
{
// Compute the real name that will be built.
std::string name;
std::string soName;
std::string realName;
std::string impName;
std::string pdbName;
this->Target->GetLibraryNames(name, soName, realName,
impName, pdbName, config);
return realName;
}
}
bool cmStrictTargetComparison::operator()(cmTarget const* t1, bool cmStrictTargetComparison::operator()(cmTarget const* t1,
cmTarget const* t2) const cmTarget const* t2) const
{ {

View File

@ -82,6 +82,14 @@ public:
bool GetFeatureAsBool(const std::string& feature, bool GetFeatureAsBool(const std::string& feature,
const std::string& config) const; const std::string& config) const;
/** Get the full path to the target according to the settings in its
makefile and the configuration type. */
std::string GetFullPath(const std::string& config="", bool implib = false,
bool realname = false) const;
std::string NormalGetFullPath(const std::string& config, bool implib,
bool realname) const;
std::string NormalGetRealName(const std::string& config) const;
cmTarget* Target; cmTarget* Target;
cmMakefile* Makefile; cmMakefile* Makefile;
cmLocalGenerator* LocalGenerator; cmLocalGenerator* LocalGenerator;

View File

@ -910,10 +910,14 @@ cmGlobalNinjaGenerator
case cmTarget::SHARED_LIBRARY: case cmTarget::SHARED_LIBRARY:
case cmTarget::STATIC_LIBRARY: case cmTarget::STATIC_LIBRARY:
case cmTarget::MODULE_LIBRARY: case cmTarget::MODULE_LIBRARY:
{
cmGeneratorTarget *gtgt = target->GetMakefile()->GetLocalGenerator()
->GetGlobalGenerator()
->GetGeneratorTarget(target);
outputs.push_back(ng->ConvertToNinjaPath( outputs.push_back(ng->ConvertToNinjaPath(
target->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 = ng->ConvertToNinjaPath(

View File

@ -3598,6 +3598,7 @@ cmGlobalXCodeGenerator::CreateXCodeDependHackTarget(
{ {
cmXCodeObject* target = *i; cmXCodeObject* target = *i;
cmTarget* t =target->GetTarget(); cmTarget* t =target->GetTarget();
cmGeneratorTarget *gt = this->GetGeneratorTarget(t);
if(t->GetType() == cmTarget::EXECUTABLE || if(t->GetType() == cmTarget::EXECUTABLE ||
// Nope - no post-build for OBJECT_LIRBRARY // Nope - no post-build for OBJECT_LIRBRARY
@ -3615,7 +3616,7 @@ cmGlobalXCodeGenerator::CreateXCodeDependHackTarget(
t->GetType() == cmTarget::SHARED_LIBRARY || t->GetType() == cmTarget::SHARED_LIBRARY ||
t->GetType() == cmTarget::MODULE_LIBRARY) t->GetType() == cmTarget::MODULE_LIBRARY)
{ {
std::string tfull = t->GetFullPath(configName); std::string tfull = gt->GetFullPath(configName);
std::string trel = this->ConvertToRelativeForMake(tfull.c_str()); std::string trel = this->ConvertToRelativeForMake(tfull.c_str());
// Add this target to the post-build phases of its dependencies. // Add this target to the post-build phases of its dependencies.

View File

@ -546,7 +546,7 @@ cmMakefileTargetGenerator
this->Target->GetType() == cmTarget::MODULE_LIBRARY) this->Target->GetType() == cmTarget::MODULE_LIBRARY)
{ {
targetFullPathReal = targetFullPathReal =
this->Target->GetFullPath(this->ConfigName, false, true); this->GeneratorTarget->GetFullPath(this->ConfigName, false, true);
targetFullPathPDB = this->Target->GetPDBDirectory(this->ConfigName); targetFullPathPDB = this->Target->GetPDBDirectory(this->ConfigName);
targetFullPathPDB += "/"; targetFullPathPDB += "/";
targetFullPathPDB += this->Target->GetPDBName(this->ConfigName); targetFullPathPDB += this->Target->GetPDBName(this->ConfigName);

View File

@ -398,15 +398,16 @@ static int calculateCommandLineLengthLimit(int linkRuleLength)
void cmNinjaNormalTargetGenerator::WriteLinkStatement() void cmNinjaNormalTargetGenerator::WriteLinkStatement()
{ {
cmTarget& target = *this->GetTarget(); cmTarget& target = *this->GetTarget();
cmGeneratorTarget& gt = *this->GetGeneratorTarget();
const std::string cfgName = this->GetConfigName(); const std::string cfgName = this->GetConfigName();
std::string targetOutput = ConvertToNinjaPath( std::string targetOutput = ConvertToNinjaPath(
target.GetFullPath(cfgName)); gt.GetFullPath(cfgName));
std::string targetOutputReal = ConvertToNinjaPath( std::string targetOutputReal = ConvertToNinjaPath(
target.GetFullPath(cfgName, gt.GetFullPath(cfgName,
/*implib=*/false, /*implib=*/false,
/*realpath=*/true)); /*realpath=*/true));
std::string targetOutputImplib = ConvertToNinjaPath( std::string targetOutputImplib = ConvertToNinjaPath(
target.GetFullPath(cfgName, gt.GetFullPath(cfgName,
/*implib=*/true)); /*implib=*/true));
if (target.IsAppBundleOnApple()) if (target.IsAppBundleOnApple())

View File

@ -2918,7 +2918,7 @@ const char *cmTarget::GetProperty(const std::string& prop,
gg->CreateGenerationObjects(); gg->CreateGenerationObjects();
cmGeneratorTarget* gt = gg->GetGeneratorTarget(this); cmGeneratorTarget* gt = gg->GetGeneratorTarget(this);
this->Properties.SetProperty( this->Properties.SetProperty(
prop, gt->Target->GetFullPath(configName, false).c_str()); prop, gt->GetFullPath(configName, false).c_str());
} }
} }
// Support "<CONFIG>_LOCATION". // Support "<CONFIG>_LOCATION".
@ -2942,7 +2942,7 @@ const char *cmTarget::GetProperty(const std::string& prop,
gg->CreateGenerationObjects(); gg->CreateGenerationObjects();
cmGeneratorTarget* gt = gg->GetGeneratorTarget(this); cmGeneratorTarget* gt = gg->GetGeneratorTarget(this);
this->Properties.SetProperty( this->Properties.SetProperty(
prop, gt->Target->GetFullPath(configName, false).c_str()); prop, gt->GetFullPath(configName, false).c_str());
} }
} }
} }
@ -3758,44 +3758,6 @@ bool cmTarget::IsImportedSharedLibWithoutSOName(
return false; return false;
} }
//----------------------------------------------------------------------------
std::string cmTarget::NormalGetRealName(const std::string& config) const
{
// This should not be called for imported targets.
// TODO: Split cmTarget into a class hierarchy to get compile-time
// enforcement of the limited imported target API.
if(this->IsImported())
{
std::string msg = "NormalGetRealName called on imported target: ";
msg += this->GetName();
this->GetMakefile()->
IssueMessage(cmake::INTERNAL_ERROR,
msg);
}
if(this->GetType() == cmTarget::EXECUTABLE)
{
// Compute the real name that will be built.
std::string name;
std::string realName;
std::string impName;
std::string pdbName;
this->GetExecutableNames(name, realName, impName, pdbName, config);
return realName;
}
else
{
// Compute the real name that will be built.
std::string name;
std::string soName;
std::string realName;
std::string impName;
std::string pdbName;
this->GetLibraryNames(name, soName, realName, impName, pdbName, config);
return realName;
}
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
std::string cmTarget::GetFullName(const std::string& config, std::string cmTarget::GetFullName(const std::string& config,
bool implib) const bool implib) const
@ -3827,48 +3789,6 @@ void cmTarget::GetFullNameComponents(std::string& prefix, std::string& base,
this->GetFullNameInternal(config, implib, prefix, base, suffix); this->GetFullNameInternal(config, implib, prefix, base, suffix);
} }
//----------------------------------------------------------------------------
std::string cmTarget::GetFullPath(const std::string& config, bool implib,
bool realname) const
{
if(this->IsImported())
{
return this->ImportedGetFullPath(config, implib);
}
else
{
return this->NormalGetFullPath(config, implib, realname);
}
}
//----------------------------------------------------------------------------
std::string cmTarget::NormalGetFullPath(const std::string& config,
bool implib, bool realname) const
{
std::string fpath = this->GetDirectory(config, implib);
fpath += "/";
if(this->IsAppBundleOnApple())
{
fpath = this->BuildMacContentDirectory(fpath, config, false);
fpath += "/";
}
// Add the full name of the target.
if(implib)
{
fpath += this->GetFullName(config, true);
}
else if(realname)
{
fpath += this->NormalGetRealName(config);
}
else
{
fpath += this->GetFullName(config, false);
}
return fpath;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
std::string std::string
cmTarget::ImportedGetFullPath(const std::string& config, bool implib) const cmTarget::ImportedGetFullPath(const std::string& config, bool implib) const

View File

@ -424,11 +424,6 @@ public:
no soname at all. */ no soname at all. */
bool IsImportedSharedLibWithoutSOName(const std::string& config) const; bool IsImportedSharedLibWithoutSOName(const std::string& config) const;
/** Get the full path to the target according to the settings in its
makefile and the configuration type. */
std::string GetFullPath(const std::string& config="", bool implib = false,
bool realname = false) const;
/** Get the names of the library needed to generate a build rule /** Get the names of the library needed to generate a build rule
that takes into account shared library version numbers. This that takes into account shared library version numbers. This
should be called only on a library target. */ should be called only on a library target. */
@ -708,14 +703,6 @@ private:
std::string ImportedGetFullPath(const std::string& config, std::string ImportedGetFullPath(const std::string& config,
bool implib) const; bool implib) const;
std::string NormalGetFullPath(const std::string& config, bool implib,
bool realname) const;
/** Get the real name of the target. Allowed only for non-imported
targets. When a library or executable file is versioned this is
the full versioned name. If the target is not versioned this is
the same as GetFullName. */
std::string NormalGetRealName(const std::string& config) const;
/** Append to @a base the mac content directory and return it. */ /** Append to @a base the mac content directory and return it. */
std::string BuildMacContentDirectory(const std::string& base, std::string BuildMacContentDirectory(const std::string& base,

View File

@ -82,7 +82,7 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os,
// be translated. // be translated.
std::string exe = command[0]; std::string exe = command[0];
cmMakefile* mf = this->Test->GetMakefile(); cmMakefile* mf = this->Test->GetMakefile();
cmTarget* target = mf->FindTargetToUse(exe); cmGeneratorTarget* target = mf->FindGeneratorTargetToUse(exe);
if(target && target->GetType() == cmTarget::EXECUTABLE) if(target && target->GetType() == cmTarget::EXECUTABLE)
{ {
// Use the target file on disk. // Use the target file on disk.