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:
parent
f6b16d4b06
commit
7bf490e9bb
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
|
||||||
|
#define RELATIVE_DIR_DEFINE
|
Loading…
Reference in New Issue