CMake的:每个目标不同的configure_file()

时间:2019-02-22 23:10:56

标签: c makefile cmake


我对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
)

我真正想做的是FirstTargetSecondTarget具有不同的配置文件,所以我要问的是是否有可能运行类似的东西

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,它们每个都有不同的配置参数。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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

config.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)