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 ...)
. 之类的命令
有没有办法在构建时运行命令,并设置一个环境变量以供构建的其余部分使用?
你不能用
set($ENV{FOO} BAR)
做到这一点。根据文档:
此命令只影响当前的CMake进程,不影响调用CMake的进程,也不影响整个系统环境,也不影响后续构建或测试过程的环境。
但是您可以使用
a build preset的
environment
字段。这是文档的简短摘录(请参阅文档以获取完整信息):
环境变量的可选映射。 key 是变量名(不能为空字符串),value 为 null 或表示变量值的字符串。