在CMake脚本中使用makefile变量

4

我正在将一个使用CMake构建的组件添加到一个目前使用makefiles的大型项目中。项目中有一个名为“配置”的单一makefile,其中包含一些逻辑,其中之一是设置目标目录以形成make变量。通过设置MAKEFILES环境变量将配置makefiles包含在当前构建中,并且实际的构建makefiles在构建和链接到这些目录中的工件时引用这些变量,例如:

# 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个回答

4

通过使用${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

0

不,您不能告诉CMake生成的Makefile使用其他非CMake Makefile中的变量。它们也无法解析来自shell的传递参数。

您可以通过 cmake -D<variable>=<value> 在配置期间传递变量,但通常您不希望在make运行期间进行配置。


你好像误解了我的问题 - 我并不是试图解析从shell传递的任何参数。我想做的是使用在现有makefile中定义的变量,可能是通过在CMake生成的makefile中有一个字面上的、非转义的$(variable_name)字符串来实现的。通过-D传递值可能是一个解决方案,但是我如何获取变量的值呢?我是否需要从一个makefile中运行CMake来生成另一个makefile? - AndrzejJ
我收到了你的问题,我的回答太简短了。使用-D选项,你可以在CMake文件中直接使用变量。但通常情况下,你不希望为每次构建运行cmake(即configure)。 - usr1234567
我知道-D的用法,但是我需要变量的值才能设置它,对吧?问题是我正在从shell中运行CMake,而我没有从那里获取值 - 它是一个makefile变量,因此(除非我漏掉了什么),只有在运行make时才能使用它的值(通过从我的示例中包含config.mk)。 - AndrzejJ
是的,这就是为什么我设置了你不想使用-D。我看不到实现你想要的功能的方法。 - usr1234567

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接