0

我在一个有很多配置选项的项目上工作。目前,代码期望它们通过命令行在命令行上传递-D。它们在旧的构建脚本中是硬编码的,我想通过 CMake 公开它们。

对于布尔选项,我想出了这个结构:

option(FOO1 "" ON)
option(FOO2 "" ON)
option(FOO3 "" OFF)

target_compile_definitions(
        mylib
        PRIVATE
        $<$<BOOL:${FOO1}>:FOO1>
        $<$<BOOL:${FOO2}>:FOO2>
        $<$<BOOL:${FOO3}>:FOO3>
)

好像行得通,但是我需要写FOO1三遍,而且看起来比较难看。然后在代码中可以#ifdef FOO1用来检查。

对于有价值的选择,我有以下几点:

set(BAR1 default_value CACHE STRING "")
set(BAR2 default_value CACHE STRING "")

target_compile_definitions(
        mylib
        PRIVATE
        BAR1=${BAR1}
        BAR2=${BAR2}
)

再次,我需要写BAR1三遍。至少在代码中我可以只使用定义而不必再次明确定义它们。

我愿意为此使用 a config.h.in。但是在那里我必须写FOO1 = "@FOO1@"or FOO1 = "${FOO1}",再次必须再声明两次选项。

有没有更聪明的方法来定义一堆编译定义?

4

1 回答 1

1

只需为此目的使用一个循环:

foreach(_VAR IN ITEMS
    FOO1
    FOO2
    FOO3
    )

    if(${_VAR})
        target_compile_definitions(mylib PRIVATE "${_VAR}")
    endif()
endforeach()

foreach(_VAR IN ITEMS
    BAR1
    BAR2
    BAR3
    )

    target_compile_definitions(mylib PRIVATE "${_VAR}=${${_VAR}}")
endforeach()

不幸的是,这实际上比您的代码长,但它确实避免了重复。对于更多选择,这将更值得。

于 2020-11-24T18:37:34.433 回答