Make subclasses responsible for joining content.

This way we can add handling of relative/absolute paths and of
-D in compile definitions.
This commit is contained in:
Stephen Kelly 2013-01-29 17:23:31 +01:00
parent f6b16d4b06
commit 7bf490e9bb
11 changed files with 89 additions and 18 deletions

View File

@ -37,9 +37,32 @@ void cmTargetCompileDefinitionsCommand
this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str()); this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
} }
//----------------------------------------------------------------------------
std::string cmTargetCompileDefinitionsCommand
::Join(const std::vector<std::string> &content)
{
std::string defs;
std::string sep;
for(std::vector<std::string>::const_iterator it = content.begin();
it != content.end(); ++it)
{
if (strncmp(it->c_str(), "-D", 2) == 0)
{
defs += sep + it->substr(2);
}
else
{
defs += sep + *it;
}
sep = ";";
}
return defs;
}
//----------------------------------------------------------------------------
void cmTargetCompileDefinitionsCommand void cmTargetCompileDefinitionsCommand
::HandleDirectContent(cmTarget *tgt, const std::string &content, ::HandleDirectContent(cmTarget *tgt, const std::vector<std::string> &content,
bool) bool)
{ {
tgt->AppendProperty("COMPILE_DEFINITIONS", content.c_str()); tgt->AppendProperty("COMPILE_DEFINITIONS", this->Join(content).c_str());
} }

View File

@ -81,8 +81,10 @@ private:
virtual void HandleImportedTarget(const std::string &tgt); virtual void HandleImportedTarget(const std::string &tgt);
virtual void HandleMissingTarget(const std::string &name); virtual void HandleMissingTarget(const std::string &name);
virtual void HandleDirectContent(cmTarget *tgt, const std::string &content, virtual void HandleDirectContent(cmTarget *tgt,
const std::vector<std::string> &content,
bool prepend); bool prepend);
virtual std::string Join(const std::vector<std::string> &content);
}; };
#endif #endif

View File

@ -40,13 +40,45 @@ void cmTargetIncludeDirectoriesCommand
this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str()); this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
} }
//----------------------------------------------------------------------------
static bool isGeneratorExpression(const std::string &lib)
{
const std::string::size_type openpos = lib.find("$<");
return (openpos != std::string::npos)
&& (lib.find(">", openpos) != std::string::npos);
}
//----------------------------------------------------------------------------
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())
|| isGeneratorExpression(*it))
{
dirs += sep + *it;
}
else
{
dirs += sep + prefix + *it;
}
sep = ";";
}
return dirs;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void cmTargetIncludeDirectoriesCommand void cmTargetIncludeDirectoriesCommand
::HandleDirectContent(cmTarget *tgt, const std::string &content, ::HandleDirectContent(cmTarget *tgt, const std::vector<std::string> &content,
bool prepend) bool prepend)
{ {
cmListFileBacktrace lfbt; cmListFileBacktrace lfbt;
this->Makefile->GetBacktrace(lfbt); this->Makefile->GetBacktrace(lfbt);
cmMakefileIncludeDirectoriesEntry entry(content, lfbt); cmMakefileIncludeDirectoriesEntry entry(this->Join(content), lfbt);
tgt->InsertInclude(entry, prepend); tgt->InsertInclude(entry, prepend);
} }

View File

@ -85,8 +85,10 @@ private:
virtual void HandleImportedTarget(const std::string &tgt); virtual void HandleImportedTarget(const std::string &tgt);
virtual void HandleMissingTarget(const std::string &name); virtual void HandleMissingTarget(const std::string &name);
virtual void HandleDirectContent(cmTarget *tgt, const std::string &content, virtual void HandleDirectContent(cmTarget *tgt,
const std::vector<std::string> &content,
bool prepend); bool prepend);
virtual std::string Join(const std::vector<std::string> &content);
}; };
#endif #endif

View File

@ -88,9 +88,8 @@ bool cmTargetPropCommandBase
++argIndex; ++argIndex;
std::string content; std::vector<std::string> content;
std::string sep;
for(unsigned int i=argIndex; i < args.size(); ++i, ++argIndex) for(unsigned int i=argIndex; i < args.size(); ++i, ++argIndex)
{ {
if(args[i] == "PUBLIC" if(args[i] == "PUBLIC"
@ -100,8 +99,7 @@ bool cmTargetPropCommandBase
this->PopulateTargetProperies(scope, content, prepend); this->PopulateTargetProperies(scope, content, prepend);
return true; return true;
} }
content += sep + args[i]; content.push_back(args[i]);
sep = ";";
} }
this->PopulateTargetProperies(scope, content, prepend); this->PopulateTargetProperies(scope, content, prepend);
return true; return true;
@ -110,7 +108,8 @@ bool cmTargetPropCommandBase
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void cmTargetPropCommandBase void cmTargetPropCommandBase
::PopulateTargetProperies(const std::string &scope, ::PopulateTargetProperies(const std::string &scope,
const std::string &content, bool prepend) const std::vector<std::string> &content,
bool prepend)
{ {
if (scope == "PRIVATE" || scope == "PUBLIC") if (scope == "PRIVATE" || scope == "PUBLIC")
{ {
@ -122,7 +121,7 @@ void cmTargetPropCommandBase
{ {
const std::string propName = std::string("INTERFACE_") + this->Property; const std::string propName = std::string("INTERFACE_") + this->Property;
const char *propValue = this->Target->GetProperty(propName.c_str()); const char *propValue = this->Target->GetProperty(propName.c_str());
const std::string totalContent = content + (propValue const std::string totalContent = this->Join(content) + (propValue
? std::string(";") + propValue ? std::string(";") + propValue
: std::string()); : std::string());
this->Target->SetProperty(propName.c_str(), totalContent.c_str()); this->Target->SetProperty(propName.c_str(), totalContent.c_str());
@ -130,7 +129,7 @@ void cmTargetPropCommandBase
else else
{ {
this->Target->AppendProperty(("INTERFACE_" + this->Property).c_str(), this->Target->AppendProperty(("INTERFACE_" + this->Property).c_str(),
content.c_str()); this->Join(content).c_str());
} }
} }
} }

View File

@ -33,22 +33,22 @@ public:
protected: protected:
std::string Property; std::string Property;
cmTarget *Target;
private: private:
virtual void HandleImportedTarget(const std::string &tgt) = 0; virtual void HandleImportedTarget(const std::string &tgt) = 0;
virtual void HandleMissingTarget(const std::string &name) = 0; virtual void HandleMissingTarget(const std::string &name) = 0;
virtual void HandleDirectContent(cmTarget *tgt, virtual void HandleDirectContent(cmTarget *tgt,
const std::string &content, const std::vector<std::string> &content,
bool prepend) = 0; bool prepend) = 0;
virtual std::string Join(const std::vector<std::string> &content) = 0;
bool ProcessContentArgs(std::vector<std::string> const& args, bool ProcessContentArgs(std::vector<std::string> const& args,
unsigned int &argIndex, bool prepend); unsigned int &argIndex, bool prepend);
void PopulateTargetProperies(const std::string &scope, void PopulateTargetProperies(const std::string &scope,
const std::string &content, bool prepend); const std::vector<std::string> &content,
bool prepend);
private:
cmTarget *Target;
}; };
#endif #endif

View File

@ -20,4 +20,5 @@ target_compile_definitions(consumer
PRIVATE $<TARGET_PROPERTY:target_compile_definitions,INTERFACE_COMPILE_DEFINITIONS> PRIVATE $<TARGET_PROPERTY:target_compile_definitions,INTERFACE_COMPILE_DEFINITIONS>
$<$<TARGET_DEFINED:notdefined>:SHOULD_NOT_BE_DEFINED> $<$<TARGET_DEFINED:notdefined>:SHOULD_NOT_BE_DEFINED>
$<$<TARGET_DEFINED:target_compile_definitions>:SHOULD_BE_DEFINED> $<$<TARGET_DEFINED:target_compile_definitions>:SHOULD_BE_DEFINED>
-DDASH_D_DEFINE
) )

View File

@ -19,4 +19,8 @@
#error Expected SHOULD_BE_DEFINED #error Expected SHOULD_BE_DEFINED
#endif #endif
#ifndef DASH_D_DEFINE
#error Expected DASH_D_DEFINE
#endif
int main() { return 0; } int main() { return 0; }

View File

@ -44,4 +44,5 @@ add_executable(consumer
target_include_directories(consumer target_include_directories(consumer
PRIVATE $<TARGET_PROPERTY:target_include_directories,INTERFACE_INCLUDE_DIRECTORIES> PRIVATE $<TARGET_PROPERTY:target_include_directories,INTERFACE_INCLUDE_DIRECTORIES>
relative_dir
) )

View File

@ -2,6 +2,7 @@
#include "common.h" #include "common.h"
#include "publicinclude.h" #include "publicinclude.h"
#include "interfaceinclude.h" #include "interfaceinclude.h"
#include "relative_dir.h"
#ifdef PRIVATEINCLUDE_DEFINE #ifdef PRIVATEINCLUDE_DEFINE
#error Unexpected PRIVATEINCLUDE_DEFINE #error Unexpected PRIVATEINCLUDE_DEFINE
@ -19,4 +20,8 @@
#error Expected CURE_DEFINE #error Expected CURE_DEFINE
#endif #endif
#ifndef RELATIVE_DIR_DEFINE
#error Expected RELATIVE_DIR_DEFINE
#endif
int main() { return 0; } int main() { return 0; }

View File

@ -0,0 +1,2 @@
#define RELATIVE_DIR_DEFINE