在CMake脚本中使用makefile变量

时间:2015-04-07 10:57:23

标签: cmake

我正在将一个使用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)的子目录中。有解决方案吗?

2 个答案:

答案 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运行期间进行配置。