我正在将一个使用CMake构建的组件添加到一个当前使用makefile的大型项目中。有一个“配置”makefile,它包含一些逻辑,其中包括以make变量的形式设置目标目录。配置makefile通过设置MAKEFILES env var包含在当前版本中,并且实际构建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)
的子目录中。有解决方案吗?
答案 0 :(得分:2)
通过${ENV[...]}
这很容易做到,因为Make auto-exports都会将变量带入环境。
一个例子:
[ttt] cat CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(ttt)
add_custom_target(t
COMMAND echo `printenv ZZZZ`...
#VERBATIM
)
那么,我们可以在{/ 1}}时间生成步骤之后改变ZZZZ
:
make
检查生成的makefile(特别是出现问题时)是很有启发性的:
[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
答案 1 :(得分:0)
不,你不能告诉CMake生成的Makefile使用来自其他非CMake Makefile的变量。他们也不能从shell中解析传递的参数。
您可以在配置期间通过cmake -D<variable>=<value>
传递变量。但通常你不想在make运行期间进行配置。