[CMake] Append to property COMPILE_DEFINITIONS

Craig Scott craig.scott at crascit.com
Mon Jul 24 09:03:01 EDT 2017


On Mon, Jul 24, 2017 at 12:32 PM, Florian Lindner <mailinglists at xgm.de>
wrote:

>
>
> Am 22.07.2017 um 15:36 schrieb Craig Scott:
> >
> > On Tue, Jul 18, 2017 at 8:50 PM, Florian Lindner <mailinglists at xgm.de
> <mailto:mailinglists at xgm.de>> wrote:
> >
> >     #Works, but I would prefer to have it just once for all targets and
> at the top of the file
> >     set_property(TARGET testprecice APPEND
> >       PROPERTY COMPILE_DEFINITIONS "FOO")
> >
> >     > BTW, you don't include the -D when adding to COMPILE_DEFINITIONS,
> just put FOO, not -DFOO. Have a read of the docs, they may give you other
> clues for this property (e.g. using the ..._CONFIG variant of it).
> >
> >     Yeah, I found out that I don't have to add -D. The docs say that
> generator expressions are preferable to using _CONFIG
> >     variant.
> >
> >
> > So just to be crystal clear, this is what I would have expected to work
> if you wanted the symbol FOO to be defined for
> > Debug builds for all targets in the current directory and below:
> >
> > set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS
> $<$<CONFIG:Debug>:FOO>)
>
> Put that in my CMakeLists.txt. Works, but only when I build in the same
> directory where the CMakeLists.txt file is
> located, i.e. in source builds. That way:
>
> set_property(DIRECTORY ${CMAKE_SOURCE_DIR} APPEND PROPERTY
> COMPILE_DEFINITIONS  $<$<CONFIG:Debug>:FOO>)
>
> it works also out of tree.
>

Not sure why you had to do that, but at least you found a way to get it to
work. There's probably something in your directory structure or something
else I'm not seeing which is causing the appearance of this directory
property to only work if you set it for the top of your source tree.




>
> Still, I don't undertand what is wrong with:
>
> set_property(GLOBAL APPEND PROPERTY COMPILE_DEFINITIONS
> $<$<CONFIG:Debug>:-FOO>)
>

Properties can be defined with an INHERITED option
<https://cmake.org/cmake/help/latest/command/define_property.html>. If a
directory property is defined with that option, then if you try to get the
directory property's value but it is not set, then CMake will look for a
global property with the same name instead and return that value. In this
case though, the COMPILE_DEFINITIONS directory property does not behave as
though it was defined with the INHERITED option, so you don't get that
fallback behaviour. I'm not sure if any of CMake's predefined properties
behave as though they supported INHERITED, but doing a quick test just now
confirms that it isn't supported for COMPILE_DEFINITIONS at least. Note
that properties like COMPILE_DEFINITIONS are set up internally within
CMake's C++ code, not via modules where the define_property() command would
be relevant. I mention it here just so you get the full picture in case you
see the fallback behaviour somewhere else and wonder why it doesn't apply
here.



>
> > Note that this directory property is NOT used to initialise the
> corresponding target property. Rather, BOTH are combined
> > to give the final set of command line compile definitions. It does not
> matter whether this directory property is set
> > before or after you call add_executable() within the same CMakeLists.txt
> file (or more accurately, within the same
> > directory scope).
> >
> >
> >
> >     >
> >     >
> >     > On Tue, Jul 18, 2017 at 1:21 PM, Florian Lindner <
> mailinglists at xgm.de <mailto:mailinglists at xgm.de> <mailto:
> mailinglists at xgm.de <mailto:mailinglists at xgm.de>>> wrote:
> >     >
> >     >     Am 18.07.2017 um 10:59 schrieb Craig Scott:
> >     >     > You appear to be setting a GLOBAL property where you
> probably meant DIRECTORY. You could also consider setting the
> >     >     > target property instead rather than applying it to all
> targets (unless that's what you want).
> >     >
> >     >     I tried to set the property on all targets, therefore I
> thought GLOBAL is the right thing.
> >     >
> >     >     However,
> >     >
> >     >     set_property(DIRECTORY "${CMAKE_SOURCE_DIR}/src" APPEND
> >     >       PROPERTY COMPILE_DEFINITIONS "-DFOO")
> >     >
> >     >     hasn't had any effect either.
> >     >
> >     >     set_property(TARGET testprecice APPEND
> >     >       PROPERTY COMPILE_DEFINITIONS "FOO")
> >     >
> >     >     works. But setting it on all targets is exactly what I want.
> How can I do that?
> >     >
> >     >     Best,
> >     >     Florian
> >     >
> >     >     >
> >     >     >
> >     >     > On Tue, Jul 18, 2017 at 12:56 PM, Florian Lindner <
> mailinglists at xgm.de <mailto:mailinglists at xgm.de> <mailto:
> mailinglists at xgm.de <mailto:mailinglists at xgm.de>>
> >     >     <mailto:mailinglists at xgm.de <mailto:mailinglists at xgm.de>
> <mailto:mailinglists at xgm.de <mailto:mailinglists at xgm.de>>>> wrote:
> >     >     >
> >     >     >     Hello,
> >     >     >
> >     >     >     I want to add compile definitions. Since I want to use
> generator expressions, I can't use add_definitions, but
> >     >     have to
> >     >     >     use the COMPILE_DEFINITIONS property, but neither:
> >     >     >
> >     >     >     set_property(GLOBAL APPEND
> >     >     >       PROPERTY COMPILE_DEFINITIONS "-DFOO")
> >     >     >
> >     >     >     for testing
> >     >     >
> >     >     >     or
> >     >     >
> >     >     >     set_property(GLOBAL APPEND
> >     >     >       PROPERTY COMPILE_DEFINITIONS
> $<$<CONFIG:Debug>:-DDebug>)
> >     >     >
> >     >     >     which should be final result, produces any -DFOO
> compiler switches.
> >     >     >
> >     >     >     I also tried placing it before and after the
> add_executable call.
> >     >     >
> >     >     >     What is wrong with that call?
> >     >     >


-- 
Craig Scott
Melbourne, Australia
https://crascit.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20170724/62b38aa7/attachment-0001.html>


More information about the CMake mailing list