mirror of
https://github.com/Kitware/CMake.git
synced 2026-03-01 04:08:46 -06:00
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.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user