Commit Graph

127 Commits

Author SHA1 Message Date
Stephen Kelly c67b8124f7 Make cycles in target properties ignored, not an error.
Constructs such as these are an error as they are direct self-references:

 set_property(TARGET foo APPEND PROPERTY
   INCLUDE_DIRECTORIES $<TARGET_PROPERTY:foo,INCLUDE_DIRECTORIES>)
 set_property(TARGET foo APPEND PROPERTY
   INCLUDE_DIRECTORIES $<TARGET_PROPERTY:INCLUDE_DIRECTORIES>)

However, this is an indirect self-reference in a cycle, and not an error:

 set_property(TARGET foo APPEND PROPERTY
   INCLUDE_DIRECTORIES $<TARGET_PROPERTY:bar,INCLUDE_DIRECTORIES>)
 set_property(TARGET bar APPEND PROPERTY
   INCLUDE_DIRECTORIES $<TARGET_PROPERTY:foo,INCLUDE_DIRECTORIES>)
2013-01-05 01:18:36 +01:00
Stephen Kelly d0f950fdba Use mapped config properties to evaluate $<CONFIG> 2013-01-05 01:18:36 +01:00
Stephen Kelly 26def1771d Make all relevant targets available in the genex context.
The current node being evaluated transitively in the generator
expression must be available to resolve mapped configs.
2013-01-05 01:18:36 +01:00
Stephen Kelly b0c8f73eb6 Add the TARGET_NAME generator expression.
It will be used as a preprocessing marker.
2013-01-05 01:05:09 +01:00
Stephen Kelly 77475fe61d Allow generator expressions to require literals. 2013-01-05 01:05:09 +01:00
Stephen Kelly b2f1700bc7 GenEx: Add expressions to specify build- or install-only values
This is for specifying INCLUDE_DIRECTORIES relevant to the build-location
or the install location for example:

 set_property(TARGET foo PROPERTY
   INTERFACE_INCLUDE_DIRECTORIES
   "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
   "$<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/include>"
 )

A 'bar' target can then use:

 set_property(TARGET bar PROPERTY
   INCLUDE_DIRECTORIES
   "$<TARGET_PROPERTY:foo,INTERFACE_INCLUDE_DIRECTORIES>"
 )

and it will work whether foo is in the same project, or an imported target
from an installation location, or an imported target from a build location
generated by the export() command.

Because the generator expressions are only evaluated at build-time, these
new expressions are equivalent to the ZeroNode and OneNode.

The GeneratorExpression test is split into parts. Some shells can't run
the custom command as it is getting too long.
2013-01-05 01:05:08 +01:00
Stephen Kelly e767ffcda5 Don't crash when a target is expected but is not available. 2013-01-03 20:56:32 +01:00
Stephen Kelly 7d736af60e Replace some 'if' with 'else if'
For consistency with the rest of the method.
2012-12-23 16:37:01 +01:00
Brad King 5f30a56f29 Merge topic 'generator-expression-fixes'
b581be0 Genex: Don't segfault on $<FOO,>
07749e3 Genex: Ensure that $<0:...> has a parameter.
ee96dc7 Genex: Extract a method to parse parameters.
2012-11-27 13:35:02 -05:00
Stephen Kelly 07749e3705 Genex: Ensure that $<0:...> has a parameter. 2012-11-27 09:12:39 -05:00
Stephen Kelly ee96dc7686 Genex: Extract a method to parse parameters. 2012-11-26 22:52:22 +01:00
Stephen Kelly d8a59ea4b3 Port cmGeneratorExpression to cmTarget from cmGeneratorTarget.
Following from the discussion here:

 http://thread.gmane.org/gmane.comp.programming.tools.cmake.devel/3615/focus=5170
 (Re: Generator expressisons in target properties, 26 Oct 12:10)

we can't split cmTarget API for linking into cmGeneratorTarget. In
the future we will probably also need to move the include and compile
definitions API back to cmTarget so that it can be used by export().
2012-11-21 00:11:54 +01:00
Stephen Kelly 9be64f34c2 GenEx: Use case insensitive comparison for $<CONFIG:...>
This fixes a regression introduced by commit f1eacf0e
(cmGeneratorExpression: Re-write for multi-stage evaluation).
2012-11-05 08:49:25 -05:00
Stephen Kelly e386992152 GexEx: Validate Target names and property names differently.
In the unit test, use the same IMPORTED_LOCATION trick that
the ExportImport test uses.
2012-10-22 14:05:48 -04:00
Stephen Kelly a573a85658 Attempt to fix the compile of cmake on Sun CC.
The problem may be that the reportError method is static, so make
it non-static on that platform.
2012-10-11 22:31:35 +02:00
Stephen Kelly 7aa99270fa GenEx: Don't use std::vector::at(int).
It might not exist with GCC 2.9.
2012-10-09 08:26:56 -04:00
Stephen Kelly 354face4fa GenEx: Ensure that the empty CONFIGURATION can be used conditionally.
The CONFIGURATION can not be manipulated at unit testing time, so
this is not unit tested further.
2012-10-09 08:26:48 -04:00
Stephen Kelly 8b3b88abd8 GenEx: Validate target and property names.
They must be non-empty, and match a restrictive regexp.
2012-10-09 08:26:45 -04:00
Stephen Kelly a4985a9af9 GenEx: Report actual target name not found, not "0" each time. 2012-10-09 08:26:40 -04:00
Stephen Kelly d70650d6c3 GenEx: Return after error reported. 2012-10-09 08:26:37 -04:00
Brad King 103d99338a Merge topic 'generator-expression-target-properties'
083de7e Process generator expressions in the COMPILE_DEFINITIONS target property.
08cb4fa Process generator expressions in the INCLUDE_DIRECTORIES property.
0ef091d Early return if there is no target.
eb250cd Add a self-reference check for target properties.
7e80747 Add API to check that dependent target properties form a DAG.
239ac84 Add a generator expression for target properties.
e028381 Extend the generator expression language with more logic.
b8e61d6 Refactor GetCompileDefinitions a bit.
2c2b25b Return a std::string from GetCompileDefinitions.
b7e48e0 Add an AppendDefines std::string overload.
9a16087 Convert paths in INCLUDE_DIRECTORIES property to Unix slashes.
4557c8d Don't prepend a path before generator expressions in include_directories.
c6abc41 Add include guard for cmGeneratorExpression.
0ff4e3f Port remaining code to GetCompileDefinitions().
f178d53 Fix indentation in the code blocks generator.
2012-09-28 17:15:03 -04:00
Stephen Kelly eb250cd18a Add a self-reference check for target properties.
Prevent constructs like:

 ... INCLUDE_DIRECTORIES "$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>"

Indirect self-references (cycles) are also prevented here, but
indirect generator expression references of any kind are not
possible yet anyway.
2012-09-28 08:49:21 -04:00
Stephen Kelly 7e807472d2 Add API to check that dependent target properties form a DAG.
Initially this will only be used to check for self-references, but
can be extended to check for cycles when chaining properties of other
targets.
2012-09-28 08:49:21 -04:00
Stephen Kelly 239ac84153 Add a generator expression for target properties.
There are two overloads, so that it can use the operational
target when a target property is being evaluated, and a target
can alternatively be specified by name.

At this point, the generators don't chain. That comes later.
2012-09-28 08:49:21 -04:00
Stephen Kelly e028381bf1 Extend the generator expression language with more logic.
Generator expressions for comparing strings, evaluating
strings as booleans, and for creating literal right-angle-brackets
and commas are added. Those may be needed in some cases
where they appear in literals.
2012-09-28 08:49:21 -04:00
Stephen Kelly fb578c8635 Fix the regular expression validator for target names.
Regression introduced by f1eacf0e07.
Target names have different valid contents to config names.
2012-09-20 12:13:33 +02:00
Stephen Kelly f1eacf0e07 cmGeneratorExpression: Re-write for multi-stage evaluation
The expressions may be parsed and then cached and evaluated multiple
times.  They are evaluated lazily so that literals such as ',' can be
treated as universal parameter separators, and can be processed from
results without appearing literally, and without interfering with the
parsing/evaluation of the entire expression.
2012-09-18 17:02:23 -04:00