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
选项传递给编译器。
但是请注意:
这是未记录的功能。它可以在当前的 CMake 版本中工作,并可能在未来的版本中中断。
更改变量值不会强制 重建 可执行文件。
也就是说,如果您 运行 make USER_DEFINITION="HELLO"
然后 make USER_DEFINITION="GOODBAY"
,第二次调用将不会用新的宏值重建可执行文件。您需要显式调用 make clean
或 make <path-to-object-file>
来重建可执行文件。
这仅适用于与 Makefile 相关的生成器(构建系统)。例如。为 Ninja
工作可能需要对变量的其他引用。
我有一个带有 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
选项传递给编译器。
但是请注意:
这是未记录的功能。它可以在当前的 CMake 版本中工作,并可能在未来的版本中中断。
更改变量值不会强制 重建 可执行文件。 也就是说,如果您 运行
make USER_DEFINITION="HELLO"
然后make USER_DEFINITION="GOODBAY"
,第二次调用将不会用新的宏值重建可执行文件。您需要显式调用make clean
或make <path-to-object-file>
来重建可执行文件。这仅适用于与 Makefile 相关的生成器(构建系统)。例如。为
Ninja
工作可能需要对变量的其他引用。