gpt4 book ai didi

cmake - 在 CMake 脚本中使用 makefile 变量

转载 作者:行者123 更新时间:2023-12-01 09:25:03 24 4
gpt4 key购买 nike

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

# 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 为我生成一个在变量 MY_TARGET_LIB_DIR 引用的目录中构建库(在本例中为静态)和另一个链接到库的 makefile在那个目录中。

我试过做类似的事情
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY $(MY_TARGET_LIB_DIR))

但没有运气 - 这只会导致生成的 makefile 输出到字面上称为 $(MY_TARGET_LIB_DIR) 的子目录中.有解决方案吗?

最佳答案

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

一个例子:

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

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

那么,我们可以改变 ZZZZ在生成步骤之后,在 make时间:
[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 - 在 CMake 脚本中使用 makefile 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29489904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com