2013-01-02 02:20:04 +04:00
|
|
|
/*============================================================================
|
|
|
|
CMake - Cross Platform Makefile Generator
|
|
|
|
Copyright 2013 Stephen Kelly <steveire@gmail.com>
|
|
|
|
|
|
|
|
Distributed under the OSI-approved BSD License (the "License");
|
|
|
|
see accompanying file Copyright.txt for details.
|
|
|
|
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even the
|
|
|
|
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
See the License for more information.
|
|
|
|
============================================================================*/
|
|
|
|
|
|
|
|
#include "cmTargetPropCommandBase.h"
|
|
|
|
|
|
|
|
#include "cmGlobalGenerator.h"
|
|
|
|
|
2016-05-16 17:34:04 +03:00
|
|
|
bool cmTargetPropCommandBase::HandleArguments(
|
|
|
|
std::vector<std::string> const& args, const std::string& prop,
|
|
|
|
ArgumentFlags flags)
|
2013-01-02 02:20:04 +04:00
|
|
|
{
|
2016-05-16 17:34:04 +03:00
|
|
|
if (args.size() < 2) {
|
2013-01-02 02:20:04 +04:00
|
|
|
this->SetError("called with incorrect number of arguments");
|
|
|
|
return false;
|
2016-05-16 17:34:04 +03:00
|
|
|
}
|
2013-01-02 02:20:04 +04:00
|
|
|
|
|
|
|
// Lookup the target for which libraries are specified.
|
2016-05-16 17:34:04 +03:00
|
|
|
if (this->Makefile->IsAlias(args[0])) {
|
2013-07-12 11:14:31 +04:00
|
|
|
this->SetError("can not be used on an ALIAS target.");
|
|
|
|
return false;
|
2016-05-16 17:34:04 +03:00
|
|
|
}
|
2013-01-02 02:20:04 +04:00
|
|
|
this->Target =
|
2016-05-16 17:34:04 +03:00
|
|
|
this->Makefile->GetCMakeInstance()->GetGlobalGenerator()->FindTarget(
|
|
|
|
args[0]);
|
|
|
|
if (!this->Target) {
|
2014-01-16 02:56:38 +04:00
|
|
|
this->Target = this->Makefile->FindTargetToUse(args[0]);
|
2016-05-16 17:34:04 +03:00
|
|
|
}
|
|
|
|
if (!this->Target) {
|
2013-01-02 02:20:04 +04:00
|
|
|
this->HandleMissingTarget(args[0]);
|
|
|
|
return false;
|
2016-05-16 17:34:04 +03:00
|
|
|
}
|
|
|
|
if ((this->Target->GetType() != cmState::SHARED_LIBRARY) &&
|
|
|
|
(this->Target->GetType() != cmState::STATIC_LIBRARY) &&
|
|
|
|
(this->Target->GetType() != cmState::OBJECT_LIBRARY) &&
|
|
|
|
(this->Target->GetType() != cmState::MODULE_LIBRARY) &&
|
|
|
|
(this->Target->GetType() != cmState::INTERFACE_LIBRARY) &&
|
|
|
|
(this->Target->GetType() != cmState::EXECUTABLE)) {
|
2013-02-08 22:12:45 +04:00
|
|
|
this->SetError("called with non-compilable target type");
|
|
|
|
return false;
|
2016-05-16 17:34:04 +03:00
|
|
|
}
|
2013-01-02 02:20:04 +04:00
|
|
|
|
2013-01-20 17:04:13 +04:00
|
|
|
bool system = false;
|
2013-01-02 02:20:04 +04:00
|
|
|
unsigned int argIndex = 1;
|
|
|
|
|
2016-05-16 17:34:04 +03:00
|
|
|
if ((flags & PROCESS_SYSTEM) && args[argIndex] == "SYSTEM") {
|
|
|
|
if (args.size() < 3) {
|
2013-01-20 17:04:13 +04:00
|
|
|
this->SetError("called with incorrect number of arguments");
|
|
|
|
return false;
|
2016-05-16 17:34:04 +03:00
|
|
|
}
|
2013-01-20 17:04:13 +04:00
|
|
|
system = true;
|
|
|
|
++argIndex;
|
2016-05-16 17:34:04 +03:00
|
|
|
}
|
2013-01-20 17:04:13 +04:00
|
|
|
|
2013-01-02 02:20:04 +04:00
|
|
|
bool prepend = false;
|
2016-05-16 17:34:04 +03:00
|
|
|
if ((flags & PROCESS_BEFORE) && args[argIndex] == "BEFORE") {
|
|
|
|
if (args.size() < 3) {
|
2013-01-02 02:20:04 +04:00
|
|
|
this->SetError("called with incorrect number of arguments");
|
|
|
|
return false;
|
2016-05-16 17:34:04 +03:00
|
|
|
}
|
2013-01-02 02:20:04 +04:00
|
|
|
prepend = true;
|
|
|
|
++argIndex;
|
2016-05-16 17:34:04 +03:00
|
|
|
}
|
2013-01-02 02:20:04 +04:00
|
|
|
|
|
|
|
this->Property = prop;
|
|
|
|
|
2016-05-16 17:34:04 +03:00
|
|
|
while (argIndex < args.size()) {
|
|
|
|
if (!this->ProcessContentArgs(args, argIndex, prepend, system)) {
|
2013-01-02 02:20:04 +04:00
|
|
|
return false;
|
|
|
|
}
|
2016-05-16 17:34:04 +03:00
|
|
|
}
|
2013-01-02 02:20:04 +04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2016-05-16 17:34:04 +03:00
|
|
|
bool cmTargetPropCommandBase::ProcessContentArgs(
|
|
|
|
std::vector<std::string> const& args, unsigned int& argIndex, bool prepend,
|
|
|
|
bool system)
|
2013-01-02 02:20:04 +04:00
|
|
|
{
|
|
|
|
const std::string scope = args[argIndex];
|
|
|
|
|
2016-05-16 17:34:04 +03:00
|
|
|
if (scope != "PUBLIC" && scope != "PRIVATE" && scope != "INTERFACE") {
|
2013-01-02 02:20:04 +04:00
|
|
|
this->SetError("called with invalid arguments");
|
|
|
|
return false;
|
2016-05-16 17:34:04 +03:00
|
|
|
}
|
2013-01-02 02:20:04 +04:00
|
|
|
|
2016-05-16 17:34:04 +03:00
|
|
|
if (this->Target->IsImported()) {
|
2013-01-21 15:28:27 +04:00
|
|
|
this->HandleImportedTarget(args[0]);
|
2013-01-02 02:20:04 +04:00
|
|
|
return false;
|
2016-05-16 17:34:04 +03:00
|
|
|
}
|
2013-01-02 02:20:04 +04:00
|
|
|
|
2016-05-16 17:34:04 +03:00
|
|
|
if (this->Target->GetType() == cmState::INTERFACE_LIBRARY &&
|
|
|
|
scope != "INTERFACE") {
|
2012-11-02 18:47:40 +04:00
|
|
|
this->SetError("may only be set INTERFACE properties on INTERFACE "
|
2016-05-16 17:34:04 +03:00
|
|
|
"targets");
|
2012-11-02 18:47:40 +04:00
|
|
|
return false;
|
2016-05-16 17:34:04 +03:00
|
|
|
}
|
2012-11-02 18:47:40 +04:00
|
|
|
|
2013-01-02 02:20:04 +04:00
|
|
|
++argIndex;
|
|
|
|
|
2013-01-29 20:23:31 +04:00
|
|
|
std::vector<std::string> content;
|
2013-01-02 02:20:04 +04:00
|
|
|
|
2016-05-16 17:34:04 +03:00
|
|
|
for (unsigned int i = argIndex; i < args.size(); ++i, ++argIndex) {
|
|
|
|
if (args[i] == "PUBLIC" || args[i] == "PRIVATE" ||
|
|
|
|
args[i] == "INTERFACE") {
|
2013-11-09 03:18:35 +04:00
|
|
|
return this->PopulateTargetProperies(scope, content, prepend, system);
|
2013-01-02 02:20:04 +04:00
|
|
|
}
|
2016-05-16 17:34:04 +03:00
|
|
|
content.push_back(args[i]);
|
|
|
|
}
|
2013-11-09 03:18:35 +04:00
|
|
|
return this->PopulateTargetProperies(scope, content, prepend, system);
|
2013-01-02 02:20:04 +04:00
|
|
|
}
|
|
|
|
|
2016-05-16 17:34:04 +03:00
|
|
|
bool cmTargetPropCommandBase::PopulateTargetProperies(
|
|
|
|
const std::string& scope, const std::vector<std::string>& content,
|
|
|
|
bool prepend, bool system)
|
2013-01-02 02:20:04 +04:00
|
|
|
{
|
2016-05-16 17:34:04 +03:00
|
|
|
if (scope == "PRIVATE" || scope == "PUBLIC") {
|
|
|
|
if (!this->HandleDirectContent(this->Target, content, prepend, system)) {
|
2013-11-09 03:18:35 +04:00
|
|
|
return false;
|
2013-01-02 02:20:04 +04:00
|
|
|
}
|
2016-05-16 17:34:04 +03:00
|
|
|
}
|
|
|
|
if (scope == "INTERFACE" || scope == "PUBLIC") {
|
2013-01-20 17:04:13 +04:00
|
|
|
this->HandleInterfaceContent(this->Target, content, prepend, system);
|
2016-05-16 17:34:04 +03:00
|
|
|
}
|
2013-11-09 03:18:35 +04:00
|
|
|
return true;
|
2013-07-02 01:19:25 +04:00
|
|
|
}
|
|
|
|
|
2016-05-16 17:34:04 +03:00
|
|
|
void cmTargetPropCommandBase::HandleInterfaceContent(
|
|
|
|
cmTarget* tgt, const std::vector<std::string>& content, bool prepend, bool)
|
2013-07-02 01:19:25 +04:00
|
|
|
{
|
2016-05-16 17:34:04 +03:00
|
|
|
if (prepend) {
|
2013-07-02 01:19:25 +04:00
|
|
|
const std::string propName = std::string("INTERFACE_") + this->Property;
|
2016-05-16 17:34:04 +03:00
|
|
|
const char* propValue = tgt->GetProperty(propName);
|
|
|
|
const std::string totalContent = this->Join(content) +
|
|
|
|
(propValue ? std::string(";") + propValue : std::string());
|
2014-03-11 03:04:11 +04:00
|
|
|
tgt->SetProperty(propName, totalContent.c_str());
|
2016-05-16 17:34:04 +03:00
|
|
|
} else {
|
2014-03-11 03:04:11 +04:00
|
|
|
tgt->AppendProperty("INTERFACE_" + this->Property,
|
2016-05-16 17:34:04 +03:00
|
|
|
this->Join(content).c_str());
|
|
|
|
}
|
2013-01-02 02:20:04 +04:00
|
|
|
}
|