如何使用 CMake 配置要在构建期间使用的环境变量?

问题描述 投票:0回答:1

我正在使用

distcc
来加速构建我的 C++ 项目。

我使用

cmake
变量配置
distcc
使用
CMAKE_CXX_COMPILER_LAUNCHER

set(CMAKE_CXX_COMPILER_LAUNCHER "distcc")

有时,

distcc
池中的某些主机不可用,因此,在构建时,我想使用
lsdistcc
来查找当前可用的主机。

下面是我尝试生成一个环境变量,

DISTCC_HOSTS
,在构建时可用,其中 distcc 主机当前在线。

我想在我的

cmake
脚本中执行此操作,以便在构建时使用 IDE 生成和运行 Makefile 的同事与使用命令行的同事都可以从获取最新的构建主机列表中受益。

这是我目前所拥有的:

我有一个 cmake 脚本,

distcc_hosts.cmake
使用
lsdistcc
找到当前可用的 distcc 主机集,并使用结果设置环境变量:

distcc_hosts.cmake

execute_process(
    COMMAND
        sh -c "lsdistcc $LSDISTCC_HOSTS | sed \"s/.*/&\\/8,lzo /g\" | tr -d '\n'"
    OUTPUT_VARIABLE
        DISTCC_HOSTS
    )

set(ENV{DISTCC_HOSTS} ${DISTCC_HOSTS})

我已将其配置为在构建时使用

add_custom_target
运行:

add_custom_target(distcc_hosts
    ALL
    COMMAND
        {CMAKE_COMMAND} -P ${CMAKE_SCRIPTS_DIR}/distcc_hosts.cmake
)

我已经创建了一个依赖链接,以便它在其他一切之前运行:

add_dependencies(my_core_target distcc_hosts)

一切正常,因为它创建了一个虚假目标,

distcc_hosts
运行我的脚本等:

生成

Makfile

CMakeFiles/distcc_hosts:
    /usr/bin/cmake -P /src/cmake/distcc_hosts.cmake

我遇到的问题是,显然上面运行

cmake
的命令在子shell中执行,并且导出的环境变量
${DISTCC_HOSTS}
仅存在于该子shell中。

因此,当其余构建命令运行时,

${DISTCC_HOSTS}
未设置。

理想情况下,我可以

eval
脚本,以便修改父环境,或者我可以执行诸如
export DISTCC_HOSTS := $(shell lsdistcc ...)
.

之类的命令

有没有办法在构建时运行命令,并设置一个环境变量以供构建的其余部分使用?

cmake makefile distcc
1个回答
0
投票

你不能用

set($ENV{FOO} BAR)
做到这一点。根据文档

此命令只影响当前的CMake进程,不影响调用CMake的进程,也不影响整个系统环境,也不影响后续构建或测试过程的环境。

但是您可以使用

a build preset
environment 字段。这是文档的简短摘录(请参阅文档以获取完整信息):

环境变量的可选映射。 key 是变量名(不能为空字符串),value 为 null 或表示变量值的字符串。

© www.soinside.com 2019 - 2024. All rights reserved.