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/policy/CMP0053.rst2
-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/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--Tests/InterfaceLibrary/CMakeLists.txt5
13 files changed, 161 insertions, 125 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/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/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/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/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)