将命令行实用程序的输出传递给 compiler/linker

Pass output of command line utility to compiler/linker

我想在自定义分配器声明中以 -DPAGESIZE=`getconf PAGESIZE` for [[gnu::assume_aligned(PAGESIZE)]] 的形式将 getconf PAGESIZE 命令输出的结果作为预处理器定义传递给我的程序。

我尝试了以下方法:

add_definitions(-DPAGESIZE=`getconf PAGESIZE`)

但它完全按照 -DPAGESIZE="\`getconf" ... PAGESIZE` 展开,其中 ... 是其他 CMAKE_CXX_FLAGS* 的内容。 IE。 CMakeLists.txt 文件中的反引号转义存在问题。

如何正确地将这样的参数传递给 CMakeLists.txt 文件中的 compiler/linker?也许还有其他方法可以达到预期效果?

我也尝试了 add_definitions(-DPAGESIZE="$$(getconf PAGESIZE)")$$cmake 扩展为 $),但是 -DPAGESIZE 和其余部分被 [=23 分开了=]. add_definitions("-DPAGESIZE=$$(getconf PAGESIZE)") 使 cmake 转义每个美元符号。

根据 add_definitions 命令的文档,传递给此命令的预处理器定义附加到 COMPILE_DEFINITIONS 属性:

Flags beginning in -D or /D that look like preprocessor definitions are automatically added to the COMPILE_DEFINITIONS directory property for the current directory.

COMPILE_DEFINITIONS 属性 的内容,根据它的 documentation 总是被 CMake 转义,所以你不能在构建命令中保留反引号的特殊含义:

CMake will automatically escape the value correctly for the native build system

您可以手动修改 CMAKE_CXX_FLAGS,如评论中所示。

更好的方法是在配置阶段对运行需要的命令使用execute_process命令,并将其输出用于add_definitions命令. (或者使用此输出通过 configure_file 创建额外的头文件)。