summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Help/command/get_property.rst42
-rw-r--r--Help/command/set_property.rst49
-rw-r--r--Help/command/target_sources.rst4
-rw-r--r--Help/policy/CMP0053.rst2
-rw-r--r--Help/prop_tgt/INTERFACE_SOURCES.rst4
-rw-r--r--Help/release/3.1.0.rst6
-rw-r--r--Modules/FindwxWidgets.cmake2
-rw-r--r--Source/cmConditionEvaluator.cxx5
-rw-r--r--Source/cmExportBuildFileGenerator.cxx10
-rw-r--r--Source/cmExportInstallFileGenerator.cxx11
-rw-r--r--Source/cmGeneratorExpressionEvaluator.cxx74
-rw-r--r--Source/cmMakefile.cxx47
-rw-r--r--Source/cmMakefile.h5
-rw-r--r--Source/cmSourceFileLocation.cxx3
-rw-r--r--Source/cmStringCommand.cxx44
-rw-r--r--Source/cmStringCommand.h2
-rw-r--r--Source/cmTarget.cxx26
-rw-r--r--Tests/ConfigSources/CMakeLists.txt6
-rw-r--r--Tests/InterfaceLibrary/CMakeLists.txt5
-rw-r--r--Tests/RunCMake/TargetSources/ExportBuild-result.txt1
-rw-r--r--Tests/RunCMake/TargetSources/ExportBuild-stderr.txt1
-rw-r--r--Tests/RunCMake/TargetSources/ExportBuild.cmake5
-rw-r--r--Tests/RunCMake/TargetSources/ExportInstall-result.txt1
-rw-r--r--Tests/RunCMake/TargetSources/ExportInstall-stderr.txt1
-rw-r--r--Tests/RunCMake/TargetSources/ExportInstall.cmake6
-rw-r--r--Tests/RunCMake/TargetSources/OriginDebug.cmake2
-rw-r--r--Tests/RunCMake/TargetSources/RelativePathInInterface-result.txt1
-rw-r--r--Tests/RunCMake/TargetSources/RelativePathInInterface-stderr.txt4
-rw-r--r--Tests/RunCMake/TargetSources/RelativePathInInterface.cmake6
-rw-r--r--Tests/RunCMake/TargetSources/RunCMakeTest.cmake3
-rw-r--r--Tests/RunCMake/TargetSources/main.cpp5
-rw-r--r--Tests/SourcesProperty/CMakeLists.txt4
32 files changed, 254 insertions, 133 deletions
diff --git a/Help/command/get_property.rst b/Help/command/get_property.rst
index c2937be..632ece6 100644
--- a/Help/command/get_property.rst
+++ b/Help/command/get_property.rst
@@ -10,6 +10,7 @@ Get a property.
DIRECTORY [dir] |
TARGET <target> |
SOURCE <source> |
+ INSTALL <file> |
TEST <test> |
CACHE <entry> |
VARIABLE>
@@ -21,29 +22,40 @@ specifies the variable in which to store the result. The second
argument determines the scope from which to get the property. It must
be one of the following:
-GLOBAL scope is unique and does not accept a name.
+``GLOBAL``
+ Scope is unique and does not accept a name.
-DIRECTORY scope defaults to the current directory but another
-directory (already processed by CMake) may be named by full or
-relative path.
+``DIRECTORY``
+ Scope defaults to the current directory but another
+ directory (already processed by CMake) may be named by full or
+ relative path.
-TARGET scope must name one existing target.
+``TARGET``
+ Scope must name one existing target.
-SOURCE scope must name one source file.
+``SOURCE``
+ Scope must name one source file.
-TEST scope must name one existing test.
+``INSTALL``
+ Scope must name one installed file path.
-CACHE scope must name one cache entry.
+``TEST``
+ Scope must name one existing test.
-VARIABLE scope is unique and does not accept a name.
+``CACHE``
+ Scope must name one cache entry.
-The required PROPERTY option is immediately followed by the name of
+``VARIABLE``
+ Scope is unique and does not accept a name.
+
+The required ``PROPERTY`` option is immediately followed by the name of
the property to get. If the property is not set an empty value is
-returned. If the SET option is given the variable is set to a boolean
-value indicating whether the property has been set. If the DEFINED
+returned. If the ``SET`` option is given the variable is set to a boolean
+value indicating whether the property has been set. If the ``DEFINED``
option is given the variable is set to a boolean value indicating
-whether the property has been defined such as with define_property.
-If BRIEF_DOCS or FULL_DOCS is given then the variable is set to a
+whether the property has been defined such as with the
+:command:`define_property` command.
+If ``BRIEF_DOCS`` or ``FULL_DOCS`` is given then the variable is set to a
string containing documentation for the requested property. If
documentation is requested for a property that has not been defined
-NOTFOUND is returned.
+``NOTFOUND`` is returned.
diff --git a/Help/command/set_property.rst b/Help/command/set_property.rst
index 8cb963e..6200230 100644
--- a/Help/command/set_property.rst
+++ b/Help/command/set_property.rst
@@ -9,6 +9,7 @@ Set a named property in a given scope.
DIRECTORY [dir] |
TARGET [target1 [target2 ...]] |
SOURCE [src1 [src2 ...]] |
+ INSTALL [file1 [file2 ...]] |
TEST [test1 [test2 ...]] |
CACHE [entry1 [entry2 ...]]>
[APPEND] [APPEND_STRING]
@@ -18,26 +19,48 @@ Set one property on zero or more objects of a scope. The first
argument determines the scope in which the property is set. It must
be one of the following:
-GLOBAL scope is unique and does not accept a name.
+``GLOBAL``
+ Scope is unique and does not accept a name.
-DIRECTORY scope defaults to the current directory but another
-directory (already processed by CMake) may be named by full or
-relative path.
+``DIRECTORY``
+ Scope defaults to the current directory but another
+ directory (already processed by CMake) may be named by full or
+ relative path.
-TARGET scope may name zero or more existing targets.
+``TARGET``
+ Scope may name zero or more existing targets.
-SOURCE scope may name zero or more source files. Note that source
-file properties are visible only to targets added in the same
-directory (CMakeLists.txt).
+``SOURCE``
+ Scope may name zero or more source files. Note that source
+ file properties are visible only to targets added in the same
+ directory (CMakeLists.txt).
-TEST scope may name zero or more existing tests.
+``INSTALL``
+ Scope may name zero or more installed file paths.
+ These are made available to CPack to influence deployment.
-CACHE scope must name zero or more cache existing entries.
+ Both the property key and value may use generator expressions.
+ Specific properties may apply to installed files and/or directories.
-The required PROPERTY option is immediately followed by the name of
+ Path components have to be separated by forward slashes,
+ must be normalized and are case sensitive.
+
+ To reference the installation prefix itself with a relative path use ".".
+
+ Currently installed file properties are only defined for
+ the WIX generator where the given paths are relative
+ to the installation prefix.
+
+``TEST``
+ Scope may name zero or more existing tests.
+
+``CACHE``
+ Scope must name zero or more cache existing entries.
+
+The required ``PROPERTY`` option is immediately followed by the name of
the property to set. Remaining arguments are used to compose the
property value in the form of a semicolon-separated list. If the
-APPEND option is given the list is appended to any existing property
-value.If the APPEND_STRING option is given the string is append to any
+``APPEND`` option is given the list is appended to any existing property
+value. If the ``APPEND_STRING`` option is given the string is append to any
existing property value as string, i.e. it results in a longer string
and not a list of strings.
diff --git a/Help/command/target_sources.rst b/Help/command/target_sources.rst
index d6f148d..832240a 100644
--- a/Help/command/target_sources.rst
+++ b/Help/command/target_sources.rst
@@ -22,6 +22,10 @@ items will populate the :prop_tgt:`SOURCES` property of
following arguments specify sources. Repeated calls for the same
``<target>`` append items in the order called.
+Targets with :prop_tgt:`INTERFACE_SOURCES` may not be exported with the
+:command:`export` or :command:`install(EXPORT)` commands. This limitation may be
+lifted in a future version of CMake.
+
Arguments to ``target_sources`` may use "generator expressions"
with the syntax ``$<...>``. See the :manual:`cmake-generator-expressions(7)`
manual for available expressions. See the :manual:`cmake-buildsystem(7)`
diff --git a/Help/policy/CMP0053.rst b/Help/policy/CMP0053.rst
index fac430e..bb0ff8b 100644
--- a/Help/policy/CMP0053.rst
+++ b/Help/policy/CMP0053.rst
@@ -28,7 +28,7 @@ cleaned up to simplify the behavior. Specifically:
so improper variable reference syntax is always an error.
* More characters are allowed to be escaped in variable names.
- Previously, only ``()#" \#@^`` were valid characters to
+ Previously, only ``()#" \@^`` were valid characters to
escape. Now any non-alphanumeric, non-semicolon, non-NUL
character may be escaped following the ``escape_identity``
production in the :ref:`Escape Sequences` section of the
diff --git a/Help/prop_tgt/INTERFACE_SOURCES.rst b/Help/prop_tgt/INTERFACE_SOURCES.rst
index fb28231..c8ca2e8 100644
--- a/Help/prop_tgt/INTERFACE_SOURCES.rst
+++ b/Help/prop_tgt/INTERFACE_SOURCES.rst
@@ -9,6 +9,10 @@ targets can add entries to their own :prop_tgt:`SOURCES` property
such as ``$<TARGET_PROPERTY:foo,INTERFACE_SOURCES>`` to use the
sources specified in the interface of ``foo``.
+Targets with ``INTERFACE_SOURCES`` may not be exported with the
+:command:`export` or :command:`install(EXPORT)` commands. This limitation may be
+lifted in a future version of CMake.
+
Contents of ``INTERFACE_SOURCES`` may use "generator expressions"
with the syntax ``$<...>``. See the :manual:`cmake-generator-expressions(7)`
manual for available expressions. See the :manual:`cmake-buildsystem(7)`
diff --git a/Help/release/3.1.0.rst b/Help/release/3.1.0.rst
index 101c29d..d6921c4 100644
--- a/Help/release/3.1.0.rst
+++ b/Help/release/3.1.0.rst
@@ -69,9 +69,15 @@ Commands
:variable:`CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY`
variables to skip searching the package registries.
+* The :command:`get_property` command learned a new ``INSTALL`` scope
+ for properties.
+
* The :command:`install` command learned a ``MESSAGE_NEVER`` option
to avoid output during installation.
+* The :command:`set_property` command learned a new ``INSTALL`` scope
+ for properties.
+
* The :command:`string` command learned a new ``GENEX_STRIP`` subcommand
which removes
:manual:`generator expression <cmake-generator-expressions(7)>`.
diff --git a/Modules/FindwxWidgets.cmake b/Modules/FindwxWidgets.cmake
index 7ef06a8..dec0ddf 100644
--- a/Modules/FindwxWidgets.cmake
+++ b/Modules/FindwxWidgets.cmake
@@ -460,6 +460,8 @@ if(wxWidgets_FIND_STYLE STREQUAL "win32")
D:/
ENV ProgramFiles
PATH_SUFFIXES
+ wxWidgets-3.0.2
+ wxWidgets-3.0.1
wxWidgets-3.0.0
wxWidgets-2.9.5
wxWidgets-2.9.4
diff --git a/Source/cmConditionEvaluator.cxx b/Source/cmConditionEvaluator.cxx
index aba26de..6065b8a 100644
--- a/Source/cmConditionEvaluator.cxx
+++ b/Source/cmConditionEvaluator.cxx
@@ -11,6 +11,7 @@
============================================================================*/
#include "cmConditionEvaluator.h"
+#include "cmStringCommand.h"
cmConditionEvaluator::cmConditionEvaluator(cmMakefile& makefile):
Makefile(makefile),
@@ -555,7 +556,7 @@ bool cmConditionEvaluator::HandleLevel2(cmArgumentList &newArgs,
{
def = this->GetVariableOrString(*arg);
const char* rex = argP2->c_str();
- this->Makefile.ClearMatches();
+ cmStringCommand::ClearMatches(&this->Makefile);
cmsys::RegularExpression regEntry;
if ( !regEntry.compile(rex) )
{
@@ -567,7 +568,7 @@ bool cmConditionEvaluator::HandleLevel2(cmArgumentList &newArgs,
}
if (regEntry.find(def))
{
- this->Makefile.StoreMatches(regEntry);
+ cmStringCommand::StoreMatches(&this->Makefile, regEntry);
*arg = cmExpandedCommandArgument("1", true);
}
else
diff --git a/Source/cmExportBuildFileGenerator.cxx b/Source/cmExportBuildFileGenerator.cxx
index 30a52d4..134ee98 100644
--- a/Source/cmExportBuildFileGenerator.cxx
+++ b/Source/cmExportBuildFileGenerator.cxx
@@ -68,6 +68,16 @@ bool cmExportBuildFileGenerator::GenerateMainFile(std::ostream& os)
tei != this->Exports.end(); ++tei)
{
cmTarget* te = *tei;
+ if (te->GetProperty("INTERFACE_SOURCES"))
+ {
+ cmOStringStream e;
+ e << "Target \""
+ << te->GetName()
+ << "\" has a populated INTERFACE_SOURCES property. This is not "
+ "currently supported.";
+ cmSystemTools::Error(e.str().c_str());
+ return false;
+ }
this->GenerateImportTargetCode(os, te);
te->AppendBuildInterfaceIncludes();
diff --git a/Source/cmExportInstallFileGenerator.cxx b/Source/cmExportInstallFileGenerator.cxx
index 89071c0..23180f1 100644
--- a/Source/cmExportInstallFileGenerator.cxx
+++ b/Source/cmExportInstallFileGenerator.cxx
@@ -123,6 +123,17 @@ bool cmExportInstallFileGenerator::GenerateMainFile(std::ostream& os)
{
cmTarget* te = (*tei)->Target;
+ if (te->GetProperty("INTERFACE_SOURCES"))
+ {
+ cmOStringStream e;
+ e << "Target \""
+ << te->GetName()
+ << "\" has a populated INTERFACE_SOURCES property. This is not "
+ "currently supported.";
+ cmSystemTools::Error(e.str().c_str());
+ return false;
+ }
+
requiresConfigFiles = requiresConfigFiles
|| te->GetType() != cmTarget::INTERFACE_LIBRARY;
diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx
index 67a1a6d..84a4daa 100644
--- a/Source/cmGeneratorExpressionEvaluator.cxx
+++ b/Source/cmGeneratorExpressionEvaluator.cxx
@@ -69,9 +69,42 @@ struct cmGeneratorExpressionNode
const GeneratorExpressionContent *content,
cmGeneratorExpressionDAGChecker *dagChecker
) const = 0;
+
+ static std::string EvaluateDependentExpression(
+ std::string const& prop, cmMakefile *makefile,
+ cmGeneratorExpressionContext *context,
+ cmTarget const* headTarget, cmTarget const* currentTarget,
+ cmGeneratorExpressionDAGChecker *dagChecker);
};
//----------------------------------------------------------------------------
+std::string cmGeneratorExpressionNode::EvaluateDependentExpression(
+ std::string const& prop, cmMakefile *makefile,
+ cmGeneratorExpressionContext *context,
+ cmTarget const* headTarget, cmTarget const* currentTarget,
+ cmGeneratorExpressionDAGChecker *dagChecker)
+{
+ cmGeneratorExpression ge(&context->Backtrace);
+ cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(prop);
+ cge->SetEvaluateForBuildsystem(context->EvaluateForBuildsystem);
+ std::string result = cge->Evaluate(makefile,
+ context->Config,
+ context->Quiet,
+ headTarget,
+ currentTarget,
+ dagChecker);
+ if (cge->GetHadContextSensitiveCondition())
+ {
+ context->HadContextSensitiveCondition = true;
+ }
+ if (cge->GetHadHeadSensitiveCondition())
+ {
+ context->HadHeadSensitiveCondition = true;
+ }
+ return result;
+}
+
+//----------------------------------------------------------------------------
static const struct ZeroNode : public cmGeneratorExpressionNode
{
ZeroNode() {}
@@ -825,22 +858,10 @@ getLinkedTargetsContent(
}
if(!depString.empty())
{
- cmGeneratorExpression ge(&context->Backtrace);
- cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(depString);
- linkedTargetsContent = cge->Evaluate(target->GetMakefile(),
- context->Config,
- context->Quiet,
- headTarget,
- target,
- dagChecker);
- if (cge->GetHadContextSensitiveCondition())
- {
- context->HadContextSensitiveCondition = true;
- }
- if (cge->GetHadHeadSensitiveCondition())
- {
- context->HadHeadSensitiveCondition = true;
- }
+ linkedTargetsContent =
+ cmGeneratorExpressionNode::EvaluateDependentExpression(depString,
+ target->GetMakefile(), context,
+ headTarget, target, dagChecker);
}
linkedTargetsContent =
cmGeneratorExpression::StripEmptyListElements(linkedTargetsContent);
@@ -1181,24 +1202,9 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
}
if(!interfacePropertyName.empty())
{
- cmGeneratorExpression ge(&context->Backtrace);
- cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(prop);
- cge->SetEvaluateForBuildsystem(context->EvaluateForBuildsystem);
- std::string result = cge->Evaluate(context->Makefile,
- context->Config,
- context->Quiet,
- headTarget,
- target,
- &dagChecker);
-
- if (cge->GetHadContextSensitiveCondition())
- {
- context->HadContextSensitiveCondition = true;
- }
- if (cge->GetHadHeadSensitiveCondition())
- {
- context->HadHeadSensitiveCondition = true;
- }
+ std::string result = this->EvaluateDependentExpression(prop,
+ context->Makefile, context,
+ headTarget, target, &dagChecker);
if (!linkedTargetsContent.empty())
{
result += (result.empty() ? "" : ";") + linkedTargetsContent;
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 0bd1624..b7e89b8 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -102,7 +102,6 @@ cmMakefile::cmMakefile(): Internal(new Internals)
this->PreOrder = false;
this->GeneratingBuildSystem = false;
- this->NumLastMatches = 0;
this->SuppressWatches = false;
}
@@ -153,7 +152,6 @@ cmMakefile::cmMakefile(const cmMakefile& mf): Internal(new Internals)
this->ListFileStack = mf.ListFileStack;
this->OutputToSource = mf.OutputToSource;
- this->NumLastMatches = mf.NumLastMatches;
this->SuppressWatches = mf.SuppressWatches;
}
@@ -4743,51 +4741,6 @@ std::vector<cmSourceFile*> cmMakefile::GetQtUiFilesWithOptions() const
return this->QtUiFilesWithOptions;
}
-static std::string matchVariables[] = {
- "CMAKE_MATCH_0",
- "CMAKE_MATCH_1",
- "CMAKE_MATCH_2",
- "CMAKE_MATCH_3",
- "CMAKE_MATCH_4",
- "CMAKE_MATCH_5",
- "CMAKE_MATCH_6",
- "CMAKE_MATCH_7",
- "CMAKE_MATCH_8",
- "CMAKE_MATCH_9"
-};
-
-//----------------------------------------------------------------------------
-void cmMakefile::ClearMatches()
-{
- for (unsigned int i=0; i<this->NumLastMatches; i++)
- {
- std::string const& var = matchVariables[i];
- std::string const& s = this->GetSafeDefinition(var);
- if(!s.empty())
- {
- this->AddDefinition(var, "");
- this->MarkVariableAsUsed(var);
- }
- }
- this->NumLastMatches = 0;
-}
-
-//----------------------------------------------------------------------------
-void cmMakefile::StoreMatches(cmsys::RegularExpression& re)
-{
- for (unsigned int i=0; i<10; i++)
- {
- std::string const& m = re.match(i);
- if(!m.empty())
- {
- std::string const& var = matchVariables[i];
- this->AddDefinition(var, m.c_str());
- this->MarkVariableAsUsed(var);
- this->NumLastMatches = i + 1;
- }
- }
-}
-
//----------------------------------------------------------------------------
cmPolicies::PolicyStatus
cmMakefile::GetPolicyStatus(cmPolicies::PolicyID id) const
diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h
index 164290a..28f8686 100644
--- a/Source/cmMakefile.h
+++ b/Source/cmMakefile.h
@@ -942,9 +942,6 @@ public:
std::string const& lhs,
std::string const& rhs);
- void ClearMatches();
- void StoreMatches(cmsys::RegularExpression& re);
-
protected:
// add link libraries and directories to the target
void AddGlobalLinkInformation(const std::string& name, cmTarget& target);
@@ -1150,8 +1147,6 @@ private:
std::vector<cmSourceFile*> QtUiFilesWithOptions;
- unsigned int NumLastMatches;
-
bool AddRequiredTargetCFeature(cmTarget *target,
const std::string& feature) const;
diff --git a/Source/cmSourceFileLocation.cxx b/Source/cmSourceFileLocation.cxx
index 1c2454e..004fd1f 100644
--- a/Source/cmSourceFileLocation.cxx
+++ b/Source/cmSourceFileLocation.cxx
@@ -216,7 +216,8 @@ bool cmSourceFileLocation::Matches(cmSourceFileLocation const& loc)
// Both extensions are similarly ambiguous. Since only the old fixed set
// of extensions will be tried, the names must match at this point to be
// the same file.
- if(this->Name.size() != loc.Name.size() || this->Name != loc.Name)
+ if(this->Name.size() != loc.Name.size() ||
+ !cmSystemTools::ComparePath(this->Name, loc.Name))
{
return false;
}
diff --git a/Source/cmStringCommand.cxx b/Source/cmStringCommand.cxx
index 90a8f85..93aa083 100644
--- a/Source/cmStringCommand.cxx
+++ b/Source/cmStringCommand.cxx
@@ -310,7 +310,7 @@ bool cmStringCommand::RegexMatch(std::vector<std::string> const& args)
input += args[i];
}
- this->Makefile->ClearMatches();
+ this->ClearMatches(this->Makefile);
// Compile the regular expression.
cmsys::RegularExpression re;
if(!re.compile(regex.c_str()))
@@ -325,7 +325,7 @@ bool cmStringCommand::RegexMatch(std::vector<std::string> const& args)
std::string output;
if(re.find(input.c_str()))
{
- this->Makefile->StoreMatches(re);
+ this->StoreMatches(this->Makefile, re);
std::string::size_type l = re.start();
std::string::size_type r = re.end();
if(r-l == 0)
@@ -359,7 +359,7 @@ bool cmStringCommand::RegexMatchAll(std::vector<std::string> const& args)
input += args[i];
}
- this->Makefile->ClearMatches();
+ this->ClearMatches(this->Makefile);
// Compile the regular expression.
cmsys::RegularExpression re;
if(!re.compile(regex.c_str()))
@@ -376,7 +376,7 @@ bool cmStringCommand::RegexMatchAll(std::vector<std::string> const& args)
const char* p = input.c_str();
while(re.find(p))
{
- this->Makefile->StoreMatches(re);
+ this->StoreMatches(this->Makefile, re);
std::string::size_type l = re.start();
std::string::size_type r = re.end();
if(r-l == 0)
@@ -463,7 +463,7 @@ bool cmStringCommand::RegexReplace(std::vector<std::string> const& args)
input += args[i];
}
- this->Makefile->ClearMatches();
+ this->ClearMatches(this->Makefile);
// Compile the regular expression.
cmsys::RegularExpression re;
if(!re.compile(regex.c_str()))
@@ -480,7 +480,7 @@ bool cmStringCommand::RegexReplace(std::vector<std::string> const& args)
std::string::size_type base = 0;
while(re.find(input.c_str()+base))
{
- this->Makefile->StoreMatches(re);
+ this->StoreMatches(this->Makefile, re);
std::string::size_type l2 = re.start();
std::string::size_type r = re.end();
@@ -541,6 +541,38 @@ bool cmStringCommand::RegexReplace(std::vector<std::string> const& args)
}
//----------------------------------------------------------------------------
+void cmStringCommand::ClearMatches(cmMakefile* mf)
+{
+ for (unsigned int i=0; i<10; i++)
+ {
+ char name[128];
+ sprintf(name, "CMAKE_MATCH_%d", i);
+ const char* s = mf->GetDefinition(name);
+ if(s && *s != 0)
+ {
+ mf->AddDefinition(name, "");
+ mf->MarkVariableAsUsed(name);
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+void cmStringCommand::StoreMatches(cmMakefile* mf,cmsys::RegularExpression& re)
+{
+ for (unsigned int i=0; i<10; i++)
+ {
+ std::string m = re.match(i);
+ if(m.size() > 0)
+ {
+ char name[128];
+ sprintf(name, "CMAKE_MATCH_%d", i);
+ mf->AddDefinition(name, re.match(i).c_str());
+ mf->MarkVariableAsUsed(name);
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
bool cmStringCommand::HandleFindCommand(std::vector<std::string> const&
args)
{
diff --git a/Source/cmStringCommand.h b/Source/cmStringCommand.h
index 9c75095..a5fe893 100644
--- a/Source/cmStringCommand.h
+++ b/Source/cmStringCommand.h
@@ -53,6 +53,8 @@ public:
virtual std::string GetName() const { return "string";}
cmTypeMacro(cmStringCommand, cmCommand);
+ static void ClearMatches(cmMakefile* mf);
+ static void StoreMatches(cmMakefile* mf, cmsys::RegularExpression& re);
protected:
bool HandleConfigureCommand(std::vector<std::string> const& args);
bool HandleAsciiCommand(std::vector<std::string> const& args);
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
diff --git a/Tests/ConfigSources/CMakeLists.txt b/Tests/ConfigSources/CMakeLists.txt
index c272257..748aad8 100644
--- a/Tests/ConfigSources/CMakeLists.txt
+++ b/Tests/ConfigSources/CMakeLists.txt
@@ -5,9 +5,9 @@ project(ConfigSources)
add_library(iface INTERFACE)
set_property(TARGET iface PROPERTY INTERFACE_SOURCES
- iface_src.cpp
- $<$<CONFIG:Debug>:iface_debug_src.cpp>
- $<$<CONFIG:Release>:does_not_exist.cpp>
+ "${CMAKE_CURRENT_SOURCE_DIR}/iface_src.cpp"
+ "$<$<CONFIG:Debug>:${CMAKE_CURRENT_SOURCE_DIR}/iface_debug_src.cpp>"
+ "$<$<CONFIG:Release>:${CMAKE_CURRENT_SOURCE_DIR}/does_not_exist.cpp>"
)
add_executable(ConfigSources
diff --git a/Tests/InterfaceLibrary/CMakeLists.txt b/Tests/InterfaceLibrary/CMakeLists.txt
index fe202dd..ee81419 100644
--- a/Tests/InterfaceLibrary/CMakeLists.txt
+++ b/Tests/InterfaceLibrary/CMakeLists.txt
@@ -22,8 +22,11 @@ add_library(objlib OBJECT obj.cpp)
add_library(iface_objlib INTERFACE)
target_sources(iface_objlib INTERFACE $<TARGET_OBJECTS:objlib>)
+add_library(intermediate INTERFACE)
+target_link_libraries(intermediate INTERFACE iface_objlib)
+
add_executable(InterfaceLibrary definetestexe.cpp)
-target_link_libraries(InterfaceLibrary iface_nodepends headeriface subiface iface_objlib)
+target_link_libraries(InterfaceLibrary iface_nodepends headeriface subiface intermediate)
add_subdirectory(libsdir)
diff --git a/Tests/RunCMake/TargetSources/ExportBuild-result.txt b/Tests/RunCMake/TargetSources/ExportBuild-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/TargetSources/ExportBuild-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/TargetSources/ExportBuild-stderr.txt b/Tests/RunCMake/TargetSources/ExportBuild-stderr.txt
new file mode 100644
index 0000000..0d65a55
--- /dev/null
+++ b/Tests/RunCMake/TargetSources/ExportBuild-stderr.txt
@@ -0,0 +1 @@
+CMake Error: Target "iface" has a populated INTERFACE_SOURCES property. This is not currently supported.
diff --git a/Tests/RunCMake/TargetSources/ExportBuild.cmake b/Tests/RunCMake/TargetSources/ExportBuild.cmake
new file mode 100644
index 0000000..b626aa6
--- /dev/null
+++ b/Tests/RunCMake/TargetSources/ExportBuild.cmake
@@ -0,0 +1,5 @@
+
+add_library(iface INTERFACE)
+target_sources(iface INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/empty_1.cpp")
+
+export(TARGETS iface FILE ${CMAKE_CURRENT_BINARY_DIR}/targets.cmake)
diff --git a/Tests/RunCMake/TargetSources/ExportInstall-result.txt b/Tests/RunCMake/TargetSources/ExportInstall-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/TargetSources/ExportInstall-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/TargetSources/ExportInstall-stderr.txt b/Tests/RunCMake/TargetSources/ExportInstall-stderr.txt
new file mode 100644
index 0000000..0d65a55
--- /dev/null
+++ b/Tests/RunCMake/TargetSources/ExportInstall-stderr.txt
@@ -0,0 +1 @@
+CMake Error: Target "iface" has a populated INTERFACE_SOURCES property. This is not currently supported.
diff --git a/Tests/RunCMake/TargetSources/ExportInstall.cmake b/Tests/RunCMake/TargetSources/ExportInstall.cmake
new file mode 100644
index 0000000..8e7c9f9
--- /dev/null
+++ b/Tests/RunCMake/TargetSources/ExportInstall.cmake
@@ -0,0 +1,6 @@
+
+add_library(iface INTERFACE)
+target_sources(iface INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/empty_1.cpp")
+
+install(TARGETS iface EXPORT exp)
+install(EXPORT exp DESTINATION cmake)
diff --git a/Tests/RunCMake/TargetSources/OriginDebug.cmake b/Tests/RunCMake/TargetSources/OriginDebug.cmake
index 5fe9ba7..d40a1d8 100644
--- a/Tests/RunCMake/TargetSources/OriginDebug.cmake
+++ b/Tests/RunCMake/TargetSources/OriginDebug.cmake
@@ -7,7 +7,7 @@ set(CMAKE_DEBUG_TARGET_PROPERTIES SOURCES)
add_library(iface INTERFACE)
set_property(TARGET iface PROPERTY INTERFACE_SOURCES
- empty_1.cpp
+ "${CMAKE_CURRENT_SOURCE_DIR}/empty_1.cpp"
)
add_library(OriginDebug empty_2.cpp)
diff --git a/Tests/RunCMake/TargetSources/RelativePathInInterface-result.txt b/Tests/RunCMake/TargetSources/RelativePathInInterface-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/TargetSources/RelativePathInInterface-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/TargetSources/RelativePathInInterface-stderr.txt b/Tests/RunCMake/TargetSources/RelativePathInInterface-stderr.txt
new file mode 100644
index 0000000..d47dd4d
--- /dev/null
+++ b/Tests/RunCMake/TargetSources/RelativePathInInterface-stderr.txt
@@ -0,0 +1,4 @@
+CMake Error in CMakeLists.txt:
+ Target "iface" contains relative path in its INTERFACE_SOURCES:
+
+ "empty_1.cpp"
diff --git a/Tests/RunCMake/TargetSources/RelativePathInInterface.cmake b/Tests/RunCMake/TargetSources/RelativePathInInterface.cmake
new file mode 100644
index 0000000..8bb6149
--- /dev/null
+++ b/Tests/RunCMake/TargetSources/RelativePathInInterface.cmake
@@ -0,0 +1,6 @@
+
+add_library(iface INTERFACE)
+target_sources(iface INTERFACE empty_1.cpp)
+
+add_executable(main main.cpp)
+target_link_libraries(main iface)
diff --git a/Tests/RunCMake/TargetSources/RunCMakeTest.cmake b/Tests/RunCMake/TargetSources/RunCMakeTest.cmake
index 1d2eaec..1b4ef0b 100644
--- a/Tests/RunCMake/TargetSources/RunCMakeTest.cmake
+++ b/Tests/RunCMake/TargetSources/RunCMakeTest.cmake
@@ -8,3 +8,6 @@ else()
endif()
run_cmake(CMP0026-LOCATION)
+run_cmake(RelativePathInInterface)
+run_cmake(ExportBuild)
+run_cmake(ExportInstall)
diff --git a/Tests/RunCMake/TargetSources/main.cpp b/Tests/RunCMake/TargetSources/main.cpp
new file mode 100644
index 0000000..766b775
--- /dev/null
+++ b/Tests/RunCMake/TargetSources/main.cpp
@@ -0,0 +1,5 @@
+
+int main()
+{
+ return 0;
+}
diff --git a/Tests/SourcesProperty/CMakeLists.txt b/Tests/SourcesProperty/CMakeLists.txt
index 6c99e00..d1c35d8 100644
--- a/Tests/SourcesProperty/CMakeLists.txt
+++ b/Tests/SourcesProperty/CMakeLists.txt
@@ -4,7 +4,9 @@ cmake_minimum_required(VERSION 3.0)
project(SourcesProperty)
add_library(iface INTERFACE)
-set_property(TARGET iface PROPERTY INTERFACE_SOURCES iface.cpp)
+set_property(TARGET iface PROPERTY INTERFACE_SOURCES
+ "${CMAKE_CURRENT_SOURCE_DIR}/iface.cpp"
+)
add_executable(SourcesProperty main.cpp)
target_link_libraries(SourcesProperty iface)