|
|
@@ -1030,7 +1030,19 @@ void cmTarget::CheckProperty(const std::string& prop,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-bool cmTarget::HandleLocationPropertyPolicy(cmMakefile* context) const
|
|
|
+class cmTargetPropertyComputer
|
|
|
+{
|
|
|
+public:
|
|
|
+ static const char* GetProperty(cmTarget const* tgt, const std::string& prop,
|
|
|
+ cmMakefile* context);
|
|
|
+
|
|
|
+private:
|
|
|
+ static bool HandleLocationPropertyPolicy(std::string const& tgtName,
|
|
|
+ cmMakefile* context);
|
|
|
+};
|
|
|
+
|
|
|
+bool cmTargetPropertyComputer::HandleLocationPropertyPolicy(
|
|
|
+ std::string const& tgtName, cmMakefile* context)
|
|
|
{
|
|
|
std::ostringstream e;
|
|
|
const char* modal = CM_NULLPTR;
|
|
|
@@ -1050,7 +1062,7 @@ bool cmTarget::HandleLocationPropertyPolicy(cmMakefile* context) const
|
|
|
|
|
|
if (modal) {
|
|
|
e << "The LOCATION property " << modal << " not be read from target \""
|
|
|
- << this->GetName()
|
|
|
+ << tgtName
|
|
|
<< "\". Use the target name directly with "
|
|
|
"add_custom_command, or use the generator expression $<TARGET_FILE>, "
|
|
|
"as appropriate.\n";
|
|
|
@@ -1060,36 +1072,21 @@ bool cmTarget::HandleLocationPropertyPolicy(cmMakefile* context) const
|
|
|
return messageType != cmake::FATAL_ERROR;
|
|
|
}
|
|
|
|
|
|
-const char* cmTarget::GetProperty(const std::string& prop) const
|
|
|
-{
|
|
|
- return this->GetProperty(prop, this->Makefile);
|
|
|
-}
|
|
|
-
|
|
|
-const char* cmTarget::GetProperty(const std::string& prop,
|
|
|
- cmMakefile* context) const
|
|
|
+const char* cmTargetPropertyComputer::GetProperty(cmTarget const* tgt,
|
|
|
+ const std::string& prop,
|
|
|
+ cmMakefile* context)
|
|
|
{
|
|
|
- if (this->GetType() == cmState::INTERFACE_LIBRARY &&
|
|
|
- !whiteListedInterfaceProperty(prop)) {
|
|
|
- std::ostringstream e;
|
|
|
- e << "INTERFACE_LIBRARY targets may only have whitelisted properties. "
|
|
|
- "The property \""
|
|
|
- << prop << "\" is not allowed.";
|
|
|
- context->IssueMessage(cmake::FATAL_ERROR, e.str());
|
|
|
- return CM_NULLPTR;
|
|
|
- }
|
|
|
-
|
|
|
// Watch for special "computed" properties that are dependent on
|
|
|
// other properties or variables. Always recompute them.
|
|
|
- if (this->GetType() == cmState::EXECUTABLE ||
|
|
|
- this->GetType() == cmState::STATIC_LIBRARY ||
|
|
|
- this->GetType() == cmState::SHARED_LIBRARY ||
|
|
|
- this->GetType() == cmState::MODULE_LIBRARY ||
|
|
|
- this->GetType() == cmState::UNKNOWN_LIBRARY) {
|
|
|
+ if (tgt->GetType() == cmState::EXECUTABLE ||
|
|
|
+ tgt->GetType() == cmState::STATIC_LIBRARY ||
|
|
|
+ tgt->GetType() == cmState::SHARED_LIBRARY ||
|
|
|
+ tgt->GetType() == cmState::MODULE_LIBRARY ||
|
|
|
+ tgt->GetType() == cmState::UNKNOWN_LIBRARY) {
|
|
|
static const std::string propLOCATION = "LOCATION";
|
|
|
if (prop == propLOCATION) {
|
|
|
-
|
|
|
- if (!this->IsImported() &&
|
|
|
- !this->HandleLocationPropertyPolicy(context)) {
|
|
|
+ if (!tgt->IsImported() &&
|
|
|
+ !HandleLocationPropertyPolicy(tgt->GetName(), context)) {
|
|
|
return CM_NULLPTR;
|
|
|
}
|
|
|
|
|
|
@@ -1098,20 +1095,20 @@ const char* cmTarget::GetProperty(const std::string& prop,
|
|
|
// For an imported target this is the location of an arbitrary
|
|
|
// available configuration.
|
|
|
//
|
|
|
- if (this->IsImported()) {
|
|
|
+ if (tgt->IsImported()) {
|
|
|
static std::string loc;
|
|
|
- loc = this->ImportedGetFullPath("", false);
|
|
|
+ loc = tgt->ImportedGetFullPath("", false);
|
|
|
return loc.c_str();
|
|
|
} else {
|
|
|
// For a non-imported target this is deprecated because it
|
|
|
// cannot take into account the per-configuration name of the
|
|
|
// target because the configuration type may not be known at
|
|
|
// CMake time.
|
|
|
- cmGlobalGenerator* gg = this->Makefile->GetGlobalGenerator();
|
|
|
+ cmGlobalGenerator* gg = tgt->GetMakefile()->GetGlobalGenerator();
|
|
|
if (!gg->GetConfigureDoneCMP0026()) {
|
|
|
gg->CreateGenerationObjects();
|
|
|
}
|
|
|
- cmGeneratorTarget* gt = gg->FindGeneratorTarget(this->GetName());
|
|
|
+ cmGeneratorTarget* gt = gg->FindGeneratorTarget(tgt->GetName());
|
|
|
static std::string loc;
|
|
|
loc = gt->GetLocationForBuild();
|
|
|
return loc.c_str();
|
|
|
@@ -1121,22 +1118,22 @@ const char* cmTarget::GetProperty(const std::string& prop,
|
|
|
|
|
|
// Support "LOCATION_<CONFIG>".
|
|
|
else if (cmHasLiteralPrefix(prop, "LOCATION_")) {
|
|
|
- if (!this->IsImported() &&
|
|
|
- !this->HandleLocationPropertyPolicy(context)) {
|
|
|
+ if (!tgt->IsImported() &&
|
|
|
+ !HandleLocationPropertyPolicy(tgt->GetName(), context)) {
|
|
|
return CM_NULLPTR;
|
|
|
}
|
|
|
const char* configName = prop.c_str() + 9;
|
|
|
|
|
|
- if (this->IsImported()) {
|
|
|
+ if (tgt->IsImported()) {
|
|
|
static std::string loc;
|
|
|
- loc = this->ImportedGetFullPath(configName, false);
|
|
|
+ loc = tgt->ImportedGetFullPath(configName, false);
|
|
|
return loc.c_str();
|
|
|
} else {
|
|
|
- cmGlobalGenerator* gg = this->Makefile->GetGlobalGenerator();
|
|
|
+ cmGlobalGenerator* gg = tgt->GetMakefile()->GetGlobalGenerator();
|
|
|
if (!gg->GetConfigureDoneCMP0026()) {
|
|
|
gg->CreateGenerationObjects();
|
|
|
}
|
|
|
- cmGeneratorTarget* gt = gg->FindGeneratorTarget(this->GetName());
|
|
|
+ cmGeneratorTarget* gt = gg->FindGeneratorTarget(tgt->GetName());
|
|
|
static std::string loc;
|
|
|
loc = gt->GetFullPath(configName, false);
|
|
|
return loc.c_str();
|
|
|
@@ -1147,20 +1144,20 @@ const char* cmTarget::GetProperty(const std::string& prop,
|
|
|
!cmHasLiteralPrefix(prop, "XCODE_ATTRIBUTE_")) {
|
|
|
std::string configName(prop.c_str(), prop.size() - 9);
|
|
|
if (configName != "IMPORTED") {
|
|
|
- if (!this->IsImported() &&
|
|
|
- !this->HandleLocationPropertyPolicy(context)) {
|
|
|
+ if (!tgt->IsImported() &&
|
|
|
+ !HandleLocationPropertyPolicy(tgt->GetName(), context)) {
|
|
|
return CM_NULLPTR;
|
|
|
}
|
|
|
- if (this->IsImported()) {
|
|
|
+ if (tgt->IsImported()) {
|
|
|
static std::string loc;
|
|
|
- loc = this->ImportedGetFullPath(configName, false);
|
|
|
+ loc = tgt->ImportedGetFullPath(configName, false);
|
|
|
return loc.c_str();
|
|
|
} else {
|
|
|
- cmGlobalGenerator* gg = this->Makefile->GetGlobalGenerator();
|
|
|
+ cmGlobalGenerator* gg = tgt->GetMakefile()->GetGlobalGenerator();
|
|
|
if (!gg->GetConfigureDoneCMP0026()) {
|
|
|
gg->CreateGenerationObjects();
|
|
|
}
|
|
|
- cmGeneratorTarget* gt = gg->FindGeneratorTarget(this->GetName());
|
|
|
+ cmGeneratorTarget* gt = gg->FindGeneratorTarget(tgt->GetName());
|
|
|
static std::string loc;
|
|
|
loc = gt->GetFullPath(configName, false);
|
|
|
return loc.c_str();
|
|
|
@@ -1169,15 +1166,15 @@ const char* cmTarget::GetProperty(const std::string& prop,
|
|
|
}
|
|
|
}
|
|
|
if (prop == "SOURCES") {
|
|
|
- if (this->Internal->SourceEntries.empty()) {
|
|
|
+ cmStringRange entries = tgt->GetSourceEntries();
|
|
|
+ if (entries.empty()) {
|
|
|
return CM_NULLPTR;
|
|
|
}
|
|
|
|
|
|
std::ostringstream ss;
|
|
|
const char* sep = "";
|
|
|
- for (std::vector<std::string>::const_iterator i =
|
|
|
- this->Internal->SourceEntries.begin();
|
|
|
- i != this->Internal->SourceEntries.end(); ++i) {
|
|
|
+ for (std::vector<std::string>::const_iterator i = entries.begin();
|
|
|
+ i != entries.end(); ++i) {
|
|
|
std::string const& entry = *i;
|
|
|
|
|
|
std::vector<std::string> files;
|
|
|
@@ -1211,7 +1208,7 @@ const char* cmTarget::GetProperty(const std::string& prop,
|
|
|
addContent = true;
|
|
|
}
|
|
|
if (!noMessage) {
|
|
|
- e << "Target \"" << this->Name
|
|
|
+ e << "Target \"" << tgt->GetName()
|
|
|
<< "\" contains "
|
|
|
"$<TARGET_OBJECTS> generator expression in its sources "
|
|
|
"list. "
|
|
|
@@ -1233,7 +1230,7 @@ const char* cmTarget::GetProperty(const std::string& prop,
|
|
|
sep = ";";
|
|
|
ss << *li;
|
|
|
} else {
|
|
|
- cmSourceFile* sf = this->Makefile->GetOrCreateSource(*li);
|
|
|
+ cmSourceFile* sf = tgt->GetMakefile()->GetOrCreateSource(*li);
|
|
|
// Construct what is known about this source file location.
|
|
|
cmSourceFileLocation const& location = sf->GetLocation();
|
|
|
std::string sname = location.GetDirectory();
|
|
|
@@ -1253,6 +1250,35 @@ const char* cmTarget::GetProperty(const std::string& prop,
|
|
|
srcs = ss.str();
|
|
|
return srcs.c_str();
|
|
|
}
|
|
|
+ return CM_NULLPTR;
|
|
|
+}
|
|
|
+
|
|
|
+const char* cmTarget::GetProperty(const std::string& prop) const
|
|
|
+{
|
|
|
+ return this->GetProperty(prop, this->Makefile);
|
|
|
+}
|
|
|
+
|
|
|
+const char* cmTarget::GetProperty(const std::string& prop,
|
|
|
+ cmMakefile* context) const
|
|
|
+{
|
|
|
+ if (this->GetType() == cmState::INTERFACE_LIBRARY &&
|
|
|
+ !whiteListedInterfaceProperty(prop)) {
|
|
|
+ std::ostringstream e;
|
|
|
+ e << "INTERFACE_LIBRARY targets may only have whitelisted properties. "
|
|
|
+ "The property \""
|
|
|
+ << prop << "\" is not allowed.";
|
|
|
+ context->IssueMessage(cmake::FATAL_ERROR, e.str());
|
|
|
+ return CM_NULLPTR;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (const char* result =
|
|
|
+ cmTargetPropertyComputer::GetProperty(this, prop, context)) {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ if (cmSystemTools::GetFatalErrorOccured()) {
|
|
|
+ return CM_NULLPTR;
|
|
|
+ }
|
|
|
+
|
|
|
static UNORDERED_SET<std::string> specialProps;
|
|
|
#define MAKE_STATIC_PROP(PROP) static const std::string prop##PROP = #PROP
|
|
|
MAKE_STATIC_PROP(LINK_LIBRARIES);
|