summaryrefslogtreecommitdiffstats
path: root/Source/cmTarget.cxx
diff options
context:
space:
mode:
authorStephen Kelly <steveire@gmail.com>2014-11-27 00:04:33 (GMT)
committerStephen Kelly <steveire@gmail.com>2014-11-29 11:24:59 (GMT)
commitbb5905bb1342229c06cecee735322a8a28916b76 (patch)
tree38549e8a26392cf29f49c87b81229e93dd7e19a2 /Source/cmTarget.cxx
parentd2f2a2e226a8717d6fdb6df0ed4858d1629f557c (diff)
downloadCMake-bb5905bb1342229c06cecee735322a8a28916b76.zip
CMake-bb5905bb1342229c06cecee735322a8a28916b76.tar.gz
CMake-bb5905bb1342229c06cecee735322a8a28916b76.tar.bz2
cmTarget: Don't allow relative paths in INTERFACE_SOURCES
Follow the pattern of checks that are made for INTERFACE_INCLUDE_DIRECTORIES. Existence is already checked by cmSourceFile::GetFullPath. Add a check to disallow relative paths in source directories. Otherwise code such as target_sources(lib1 INTERFACE foo.cpp) would fail if consumed by a target in a different directory. Unlike the INTERFACE_INCLUDE_DIRECTORIES behavior, we don't care whether the entry comes from an IMPORTED target or not. In the include directories case, the directory for a non-imported target might not exist yet but might be created. In the sources case, a file which does not yet exist in the filesystem must be explicitly marked with the GENERATED property. Adjust existing tests and add a new test for the error.
Diffstat (limited to 'Source/cmTarget.cxx')
-rw-r--r--Source/cmTarget.cxx26
1 files changed, 23 insertions, 3 deletions
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index b476a27..ad1c83e 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -649,6 +649,8 @@ static bool processSources(cmTarget const* tgt,
for (std::vector<cmTargetInternals::TargetPropertyEntry*>::const_iterator
it = entries.begin(), end = entries.end(); it != end; ++it)
{
+ cmLinkImplItem const& item = (*it)->LinkImplItem;
+ std::string const& targetName = item;
std::vector<std::string> entrySources;
cmSystemTools::ExpandListArgument((*it)->ge->Evaluate(mf,
config,
@@ -667,11 +669,10 @@ static bool processSources(cmTarget const* tgt,
i != entrySources.end(); ++i)
{
std::string& src = *i;
-
cmSourceFile* sf = mf->GetOrCreateSource(src);
std::string e;
- src = sf->GetFullPath(&e);
- if(src.empty())
+ std::string fullPath = sf->GetFullPath(&e);
+ if(fullPath.empty())
{
if(!e.empty())
{
@@ -681,6 +682,25 @@ static bool processSources(cmTarget const* tgt,
}
return contextDependent;
}
+
+ if (!targetName.empty() && !cmSystemTools::FileIsFullPath(src.c_str()))
+ {
+ cmOStringStream err;
+ if (!targetName.empty())
+ {
+ err << "Target \"" << targetName << "\" contains relative "
+ "path in its INTERFACE_SOURCES:\n"
+ " \"" << src << "\"";
+ }
+ else
+ {
+ err << "Found relative path while evaluating sources of "
+ "\"" << tgt->GetName() << "\":\n \"" << src << "\"\n";
+ }
+ tgt->GetMakefile()->IssueMessage(cmake::FATAL_ERROR, err.str());
+ return contextDependent;
+ }
+ src = fullPath;
}
std::string usedSources;
for(std::vector<std::string>::iterator