在 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
我正在将一个使用 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