在 CMake 脚本中使用 makefile 变量

Use makefile variables in CMake script

我正在将一个使用 CMake 构建的组件添加到当前使用 makefile 的更大项目中。有一个单独的 "configuration" makefile,其中包含一些逻辑,其中包括以 make 变量的形式设置目标目录。通过设置 MAKEFILES 环境变量,配置 makefile 包含在当前构建中,实际构建 makefile 在构建和链接到这些目录中的工件时引用这些变量,例如:

# in config.mk
...
MY_TARGET_LIB_DIR=...

# in a build makefile
TGT_LIB=$(MY_TARGET_LIB_DIR)/libsomething.so

# in another build makefile
LDFLAGS=-L$(MY_TARGET_LIB_DIR)

我想做的是在 CMake 生成的 makefile 中使用它,即让 CMake 为我生成一个 makefile,在变量引用的目录中构建一个库(在这种情况下是静态的)MY_TARGET_LIB_DIR 和另一个链接到该目录中的库的链接。

我试过

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY $(MY_TARGET_LIB_DIR))

但运气不佳 - 这只会导致生成的 makefile 输出到字面上称为 $(MY_TARGET_LIB_DIR) 的子目录中。有解决办法吗?

不,您不能告诉 CMake 生成的 Makefile 使用来自其他非 CMake Makefile 的变量。他们也不能解析从 shell.

传递的参数

您可以在配置期间通过cmake -D<variable>=<value> 传递变量,仅此而已。但通常您不想在 make 运行.

期间进行配置

通过 ${ENV[...]} 很容易做到这一点,因为 Make 会自动将所有 make 变量导出到环境中。

一个例子:

[ttt] cat CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(ttt)

add_custom_target(t
    COMMAND echo `printenv ZZZZ`...
    #VERBATIM
    )

那么,我们可以在 make 时间 ZZZZ 生成步骤后 改变:

[ttt] cmake .
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/ttt
[ttt]
[ttt]
[ttt] make ZZZZ=foobar t
foobar...
Built target t
[ttt] ZZZZ=buzzquux make t
buzzquux...
Built target t
[ttt]
[ttt]
[ttt] export ZZZZ=bbb
[ttt] make t
bbb...
Built target t

检查生成的 makefile 很有启发性(尤其是当出现问题时):

[ttt] grep -C2 ZZZZ CMakeFiles/t.dir/build.make

CMakeFiles/t:
    echo `printenv ZZZZ`...

t : CMakeFiles/t