linux 从环境变量替换编译时宏

cbeh67ev  于 2023-05-16  发布在  Linux
关注(0)|答案(1)|浏览(131)

如何在编译期间从环境变量设置编译器宏,即当make运行时(而不是生成时),等效行为

g++ main.cpp -DFOO="${FOO}"

用法是这样的:
1.运行cmake(仅运行一次)。
1.设置环境变量。
1.运行make并生成一个使用环境变量值的二进制文件。
1.更改环境变量并重新生成。新的二进制文件应使用环境变量的新值。

kupeojn6

kupeojn61#

您可以使用(CMAKE_)<LANG>_COMPILER_LAUNCHER来实现此目的,但我强烈建议不要这样做,因为生成的项目无法判断是否需要重新编译源代码。此外,如果涉及到环境变量,则使用最后一次配置重新构建项目并非易事。此外,当使用环境变量时,只构建项目的一部分基本上是不可能的;很难判断项目的哪一部分是用环境变量的给定值编译的。
相反,我建议添加一个cmake缓存变量,可以通过简单地重新配置项目来调整,这确实会导致cmake进行必要的更新,以确保重新编译预处理器定义的文件。

...

set(MY_EXE_FOO "bar" CACHE STRING "The value to use for the FOO preprocessor define for my_exe")

add_executable(my_exe main.cpp)
target_compile_definitions(my_exe PRIVATE "FOO=${MY_EXE_FOO}")

使用方法:

# set up with default (you could pass -D MY_EXE_FOO=... immediately to change the default)
cmake -S source_dir -B build_dir
cmake --build build_dir

# reconfigure the cmake project changing the define from bar to baz
cmake -D MY_EXE_FOO=baz build_dir
# rebuild with the new configuration
cmake --build build_dir

注意:你甚至可以为你的项目并行设置多个构建目录。(这里假设没有任何cmake逻辑在源代码树中生成文件。)

cmake -D MY_EXE_FOO=bar -S source_dir -B build_dir_bar
cmake -D MY_EXE_FOO=baz -S source_dir -B build_dir_baz
cmake --build build_dir_bar
cmake --build build_dir_baz

相关问题