cmake 从命令行覆盖编译定义

cmake override compile definitions from command line

我有一个带有 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 工作可能需要对变量的其他引用。