首页 > 解决方案 > CMake:每个目标都有不同的 configure_file()

问题描述


我不是很熟悉,cmake但正如标题所说,我想做的是以下内容:

我有一个配置头文件(例如config.h.in),我想在其中指定我的所有参数,具体取决于我当前正在调用的目标。所以我的头文件是这样的:

#cmakedefine TEST @TEST@
#cmakedefine PINK @PINK@

#ifndef TEST
#define MY_A 10    
#endif
#ifdef PINK
#define MY_A 20
#endif

现在,在我的CMakeLists.txt我想要多个目标,例如(实际上该config.h文件只是从其他.c文件中包含)

add_executable(FirstTarget
    something.c
    somethingelse.c
    config.h
)

add_executable(SecondTarget
    something.c
    somethingother.c
    config.h
)

我真正想做的是FirstTarget并且SecondTarget有不同的配置文件,所以我要问的是是否可以运行类似的东西

set(TEST Test)
configure_file(config.h.in config.h)

只为目标FirstTarget,然后以某种方式运行SecondTarget

set(PINK Test2)
configure_file(config.h.in config.h)

这样如果我打电话make FirstTargetmake SecondTarget他们每个人都有不同的配置参数。

谢谢!

标签: cmakefilecmake

解决方案


该命令configure_file创建一个“真实”文件:它对每个目标都有相同的内容

但是,创建的文件可能包含#ifdef(或其他条件语句),因此其解释可能不同的目标而异。

以下示例使用target_compile_definitions命令为特定目标“分配”编译定义。

配置.h

#ifndef TEST
#define MY_A 10    
#endif
#ifdef PINK
#define MY_A 20
#endif

CMakeLists.txt

add_executable(FirstTarget ...)
# When "config.h" will be included into this target, it will use "PINK" branch.
target_compile_definitions(FirstTarget PRIVATE PINK)

add_executable(SecondTarget ...)
# When "config.h" will be included into this target, it will use "TEST" branch.
target_compile_definitions(FirstTarget PRIVATE TEST)

推荐阅读