cmake/Source/cmTargetPropCommandBase.cxx

182 lines
5.2 KiB
C++
Raw Normal View History

2013-03-16 19:13:01 +02: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"
//----------------------------------------------------------------------------
bool cmTargetPropCommandBase
2015-04-27 22:25:09 +02:00
::HandleArguments(std::vector<std::string> const& args,
const std::string& prop,
ArgumentFlags flags)
2013-03-16 19:13:01 +02:00
{
2013-11-03 12:27:13 +02:00
if(args.size() < 2)
2013-03-16 19:13:01 +02:00
{
this->SetError("called with incorrect number of arguments");
return false;
}
// Lookup the target for which libraries are specified.
2014-08-03 19:52:23 +02:00
if (this->Makefile->IsAlias(args[0]))
2013-11-03 12:27:13 +02:00
{
this->SetError("can not be used on an ALIAS target.");
return false;
}
2013-03-16 19:13:01 +02:00
this->Target =
this->Makefile->GetCMakeInstance()
2015-04-27 22:25:09 +02:00
->GetGlobalGenerator()->FindTarget(args[0]);
2013-03-16 19:13:01 +02:00
if(!this->Target)
{
2014-08-03 19:52:23 +02:00
this->Target = this->Makefile->FindTargetToUse(args[0]);
2013-03-16 19:13:01 +02:00
}
if(!this->Target)
{
this->HandleMissingTarget(args[0]);
return false;
}
2016-03-13 13:35:51 +01: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-03-16 19:13:01 +02:00
{
this->SetError("called with non-compilable target type");
return false;
}
2013-11-03 12:27:13 +02:00
bool system = false;
2013-03-16 19:13:01 +02:00
unsigned int argIndex = 1;
2013-11-03 12:27:13 +02:00
if ((flags & PROCESS_SYSTEM) && args[argIndex] == "SYSTEM")
{
if (args.size() < 3)
{
this->SetError("called with incorrect number of arguments");
return false;
}
system = true;
++argIndex;
}
2013-03-16 19:13:01 +02:00
bool prepend = false;
if ((flags & PROCESS_BEFORE) && args[argIndex] == "BEFORE")
{
2013-11-03 12:27:13 +02:00
if (args.size() < 3)
2013-03-16 19:13:01 +02:00
{
this->SetError("called with incorrect number of arguments");
return false;
}
prepend = true;
++argIndex;
}
this->Property = prop;
while (argIndex < args.size())
{
2013-11-03 12:27:13 +02:00
if (!this->ProcessContentArgs(args, argIndex, prepend, system))
2013-03-16 19:13:01 +02:00
{
return false;
}
}
return true;
}
//----------------------------------------------------------------------------
bool cmTargetPropCommandBase
::ProcessContentArgs(std::vector<std::string> const& args,
2013-11-03 12:27:13 +02:00
unsigned int &argIndex, bool prepend, bool system)
2013-03-16 19:13:01 +02:00
{
const std::string scope = args[argIndex];
if(scope != "PUBLIC"
&& scope != "PRIVATE"
&& scope != "INTERFACE" )
{
this->SetError("called with invalid arguments");
return false;
}
if(this->Target->IsImported())
{
this->HandleImportedTarget(args[0]);
return false;
}
2016-03-13 13:35:51 +01:00
if (this->Target->GetType() == cmState::INTERFACE_LIBRARY
2014-08-03 19:52:23 +02:00
&& scope != "INTERFACE")
{
this->SetError("may only be set INTERFACE properties on INTERFACE "
"targets");
return false;
}
2013-03-16 19:13:01 +02:00
++argIndex;
std::vector<std::string> content;
for(unsigned int i=argIndex; i < args.size(); ++i, ++argIndex)
{
if(args[i] == "PUBLIC"
|| args[i] == "PRIVATE"
|| args[i] == "INTERFACE" )
{
2015-04-27 22:25:09 +02:00
return this->PopulateTargetProperies(scope, content, prepend, system);
2013-03-16 19:13:01 +02:00
}
content.push_back(args[i]);
}
2015-04-27 22:25:09 +02:00
return this->PopulateTargetProperies(scope, content, prepend, system);
2013-03-16 19:13:01 +02:00
}
//----------------------------------------------------------------------------
2015-04-27 22:25:09 +02:00
bool cmTargetPropCommandBase
2013-03-16 19:13:01 +02:00
::PopulateTargetProperies(const std::string &scope,
const std::vector<std::string> &content,
2013-11-03 12:27:13 +02:00
bool prepend, bool system)
2013-03-16 19:13:01 +02:00
{
if (scope == "PRIVATE" || scope == "PUBLIC")
{
2015-04-27 22:25:09 +02:00
if (!this->HandleDirectContent(this->Target, content, prepend, system))
{
return false;
}
2013-03-16 19:13:01 +02:00
}
if (scope == "INTERFACE" || scope == "PUBLIC")
{
2013-11-03 12:27:13 +02:00
this->HandleInterfaceContent(this->Target, content, prepend, system);
}
2015-04-27 22:25:09 +02:00
return true;
2013-11-03 12:27:13 +02:00
}
//----------------------------------------------------------------------------
void cmTargetPropCommandBase::HandleInterfaceContent(cmTarget *tgt,
const std::vector<std::string> &content,
bool prepend, bool)
{
if (prepend)
{
const std::string propName = std::string("INTERFACE_") + this->Property;
2015-04-27 22:25:09 +02:00
const char *propValue = tgt->GetProperty(propName);
2013-11-03 12:27:13 +02:00
const std::string totalContent = this->Join(content) + (propValue
? std::string(";") + propValue
: std::string());
2015-04-27 22:25:09 +02:00
tgt->SetProperty(propName, totalContent.c_str());
2013-11-03 12:27:13 +02:00
}
else
{
2015-04-27 22:25:09 +02:00
tgt->AppendProperty("INTERFACE_" + this->Property,
2013-11-03 12:27:13 +02:00
this->Join(content).c_str());
2013-03-16 19:13:01 +02:00
}
}