cmake从命令行覆盖编译定义



我有一个带有cmake的项目,我想设置一个编译定义,用户可以在每次运行make命令时从命令行重写该定义,并将其设置为他们想要的任何值。我希望这是一根绳子。

我试着添加

add_compile_definitions(USER_DEFINITION)

并运行make USER_DEFINITION="HELLO" VERBOSE=1

但我看到编译器忽略了我作为字符串的设置,它只是像布尔值一样定义它。

arm-none-eabi-gcc -DUSER_DEFINITION

我试图省略add_compile_definition,但我得到了error: 'USER_DEFINITION' undeclared

有什么办法可以在cmake中做到这一点吗?我可以使用cmake参数,但我不想每次都重新配置cmake。

由于Makefile中的变量是用$(varname)语法引用的,因此可以编写

add_compile_definitions(USER_DEFINITION=$(USER_DEFINITION))

这样,用构建项目

make USER_DEFINITION="HELLO"

将把-DUSER_DEFINITION=HELLO选项传递给编译器。

但是,请注意:

  1. 这是未记录的功能。它可以在当前的CMake版本中工作,也可以在未来的版本中中断。

  2. 更改变量的值不会强制执行使重新生成可执行文件。也就是说,如果先运行make USER_DEFINITION="HELLO",然后运行make USER_DEFINITION="GOODBAY",则第二次调用不会使用新的宏值重新生成可执行文件。您需要显式调用make cleanmake <path-to-object-file>来重新生成可执行文件。

  3. 这仅适用于与Makefile相关的生成器(构建系统(。例如,为Ninja工作可能需要对变量进行其他引用。

最新更新