[CMake] get complete list of compile definitions

Volker Enderlein volker.enderlein at ifm-chemnitz.de
Wed Apr 5 11:42:37 EDT 2017


Am 04/04/2017 um 11:17 schrieb Magnus Therning:
> Robert Schwarzelt <rschwarzelt at gmail.com> writes:
>
>> Hi all,
>> I need to implement a code export function, that will only export code used
>> in a specific project configuration.
>> For this purpose I want to use unifdef (http://dotat.at/prog/unifdef/),
>> which is capable of removing unused #ifdef blocks.
>>
>> The project uses static libraries like in following example:
>>
>> add_library(
>>      foo STATIC
>>      foo.c
>> )
>>
>> add_library(
>>      bar STATIC
>>      bar.c
>> )
>>
>> target_compile_definitions(bar INTERFACE HAVE_BAR)
>> target_link_libraries(foo LINK_PUBLIC bar)
>>
>>
>> Now foo.c will be compiled with -DHAVE_BAR at build time.
>> To create a custom target using unifdef i need this information at cmake
>> configure time. I expected to find this in the property COMPILE_DEFINITIONS
>> of either the source file foo.c or target foo, but both are empty.
>>
>> Does anyone know, how to get a list of definitions (that will be used at
>> build time) for targets or files?
> Not to discourage you, but *every time* I've asked a question along the
> lines of "how can I get a list of foo for a source file / target at
> cmake configuration time" the answer has been "oh, that's not easy", or
> even "oh, that's not possible". In every case I've resorted to trying to
> find a way to push what I want to do until build time.
>
> If you *can* find a way to do it post-configuration time I believe you will have
> access to everything you need if you set "CMAKE_EXPORT_COMPILE_COMMANDS"
> and then look at the resulting `compile_commands.json`.
>
> /M
>
> --
> Magnus Therning              OpenPGP: 0x927912051716CE39
> email: magnus at therning.org   jabber: magnus at therning.org
> twitter: magthe               http://therning.org/magnus
>
> Finagle's Second Law:
> Always keep a record of data — it indicates you've been working.
>
>

I successfully used the following commands to get the 
INTERFACE_COMPILE_DEFINITIONS and the COMPILE_DEFINITIONS of a target
(yes, both of them may exist). And because the OP has specified 
INTERFACE_COMPILE_DEFINITIONS he should evaluate that property of the 
target.

get_target_property(_if_compile_defs YourTargetNameHere 
INTERFACE_COMPILE_DEFINITIONS)

get_target_property(_compile_defs YourTargetNameHere COMPILE_DEFINITIONS)

Cheers Volker




More information about the CMake mailing list