CMake/Source/cmTargetIncludeDirectoriesCommand.cxx
Stephen Kelly 907c09cd31 include_directory: Add missing include.
The cmGeneratorExpression is used here, but the header for it is not
in the include heirarchy.  This would be a compile error if the file
were compiled as a standalone translation unit, but it is instead
used in a mini-unity-build by inclusion in cmCommands.cxx. The header
for cmGeneratorExpression happens to be included first, so the
compilation works fine.

IDEs do not know this however, and flag the use as an error.
2014-02-17 11:08:58 +01:00

107 lines
3.5 KiB
C++

/*============================================================================
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 "cmTargetIncludeDirectoriesCommand.h"
#include "cmGeneratorExpression.h"
//----------------------------------------------------------------------------
bool cmTargetIncludeDirectoriesCommand
::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &)
{
return this->HandleArguments(args, "INCLUDE_DIRECTORIES",
ArgumentFlags(PROCESS_BEFORE | PROCESS_SYSTEM));
}
//----------------------------------------------------------------------------
void cmTargetIncludeDirectoriesCommand
::HandleImportedTarget(const std::string &tgt)
{
cmOStringStream e;
e << "Cannot specify include directories for imported target \""
<< tgt << "\".";
this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
}
//----------------------------------------------------------------------------
void cmTargetIncludeDirectoriesCommand
::HandleMissingTarget(const std::string &name)
{
cmOStringStream e;
e << "Cannot specify include directories for target \"" << name << "\" "
"which is not built by this project.";
this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
}
//----------------------------------------------------------------------------
std::string cmTargetIncludeDirectoriesCommand
::Join(const std::vector<std::string> &content)
{
std::string dirs;
std::string sep;
std::string prefix = this->Makefile->GetStartDirectory() + std::string("/");
for(std::vector<std::string>::const_iterator it = content.begin();
it != content.end(); ++it)
{
if (cmSystemTools::FileIsFullPath(it->c_str())
|| cmGeneratorExpression::Find(*it) == 0)
{
dirs += sep + *it;
}
else
{
dirs += sep + prefix + *it;
}
sep = ";";
}
return dirs;
}
//----------------------------------------------------------------------------
void cmTargetIncludeDirectoriesCommand
::HandleDirectContent(cmTarget *tgt, const std::vector<std::string> &content,
bool prepend, bool system)
{
cmListFileBacktrace lfbt;
this->Makefile->GetBacktrace(lfbt);
cmValueWithOrigin entry(this->Join(content), lfbt);
tgt->InsertInclude(entry, prepend);
if (system)
{
tgt->AddSystemIncludeDirectories(content);
}
}
//----------------------------------------------------------------------------
void cmTargetIncludeDirectoriesCommand
::HandleInterfaceContent(cmTarget *tgt,
const std::vector<std::string> &content,
bool prepend, bool system)
{
cmTargetPropCommandBase::HandleInterfaceContent(tgt, content,
prepend, system);
if (system)
{
std::string joined;
std::string sep;
for(std::vector<std::string>::const_iterator it = content.begin();
it != content.end(); ++it)
{
joined += sep;
sep = ";";
joined += *it;
}
tgt->AppendProperty("INTERFACE_SYSTEM_INCLUDE_DIRECTORIES",
joined.c_str());
}
}