分布式编译-icecream
1、环境安装
apt install icecc icecc-monitor -y
2、部署 icecc-scheduler(Server 节点)
icecc-scheduler -d -n Compilation-Alliance -p 10086 -l /tmp/icecc-scheduler.log -u nobody -vvv --persistent-client-connection
# -d 后台运行
# -n 网络名称,scheduler 和 work 需在同一个网络内
# -p scheduler 对外的端口
# -l 日志路径
# -u 指定运行的用户名,可以设置为 nobody
# -vvv debug 日志等级
# --persistent-client-connectio 保持客户端长链接
3、部署 iceccd(Work 节点, 代码编译的机器需要运行此 Work 节点)
iceccd -d -n Compilation-Alliance -N server-10.151.187.48 -u nobody -vvv -l /tmp/iceccd.log -s 10.151.187.48:10086
# -d 后台运行
# -n 网络名称
# -N work 节点的名称
# -u 指定运行的用户名,可以设置为 nobody
# -vvv debug 日志等级
# -l 日志路径
# -s scheduler的 IP 地址和端口
4、docker 部署(替代前面1 2 3 步骤)
scheduler image 制作
FROM ubuntu:24.04
RUN apt-get update && apt-get install icecc icecc-monitor -y
# 设置 CMD 指令
CMD sh -c "icecc-scheduler -n ${NET_NAME} -p ${PORT} -l /tmp/icecc-scheduler.log -u nobody -vvv --persistent-client-connection"
iceccd image 制作
FROM ubuntu:24.04
RUN apt-get update && apt-get install icecc icecc-monitor -y
# 设置 CMD 指令
CMD sh -c "iceccd -n ${NET_NAME} -N ${NODE_NAME} -s ${SCHEDULER_HOST_PORT} -l /tmp/iceccd.log -u nobody -vvv"
你可以拉取这两个镜像替代上面的步骤
docker pull billyany/distributed-compilation-icecc:v1.0
docker pull billyany/distributed-compilation-scheduler:v1.0
我有三台机器,执行步骤如下
# 机器 A 执行
docker run -itd --restart=always --net=host -e NET_NAME=build -e PORT=10086 billyany/distributed-compilation-scheduler:v1.0
# 机器 A 执行
docker run -itd --restart=always --net=host -e NET_NAME=build -e NODE_NAME=server-10.151.187.48 -e MAX_PROCESSES=6 -e SCHEDULER_HOST_PORT=10.151.187.48:10086 billyany/distributed-compilation-icecc:v1.1
# 机器 B 执行
docker run -itd --restart=always --net=host -e NET_NAME=build -e NODE_NAME=yanyan-10.151.179.155 -e MAX_PROCESSES=10 -e SCHEDULER_HOST_PORT=10.151.187.48:10086 billyany/distributed-compilation-icecc:v1.1
# 机器 C 执行
docker run -itd --restart=always --net=host -e NET_NAME=build -e NODE_NAME=laping-10.151.179.119 -e MAX_PROCESSES=8 -e SCHEDULER_HOST_PORT=10.151.187.48:10086 billyany/distributed-compilation-icecc:v1.1
5、icemon(GUI 监控界面)
icemon -s 10.151.187.48 -p 10086 -n Compilation-Alliance
# -s scheduler的IP地址
# -p scheduler的端口
# -n 网络名称
6、CMake 配置
仅使用 icecc
find_program(ICECC icecc)
if(ICECC)
set(CMAKE_C_COMPILER_LAUNCHER ${ICECC})
set(CMAKE_CXX_COMPILER_LAUNCHER ${ICECC})
endif()
icecc 搭配 ccache
# 如果CMake有使用了 cache,则在编译时声明CCACHE_PREFIX 变量为 icecc 即可
# export CCACHE_PREFIX=icecc
find_program(CCACHE "ccache")
if(CCACHE)
set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE})
set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE})
endif()
7、创建统一的编译工具链
# 此处以交叉编译工具链为例子
icecc-create-env --clang /usr/local/mdc_sdk/dp_gea/mdc_cross_compiler/bin/clang /usr/local/mdc_sdk/dp_gea/mdc_cross_compiler/bin/clang++
# 将会在执行命令的目录下生成一个工具链压缩文件
f827220d1bd5b480d9c7ce43dc35e5db.tar.gz
# --------------------------------
# 对于默认的编译工具链可以使用如下命令(例如不同机器下,A机器时gcc-7版本,B机器时gcc-9版本)
icecc --build-native
8、代码编译
# 声明编译环境包的绝对路径
export ICECC_VERSION=${PACKAGE_PATH}/f827220d1bd5b480d9c7ce43dc35e5db.tar.gz
# 声明 cache 前缀,搭配 cache 使用
export CCACHE_PREFIX=icecc
# 开始编译
cmake ..
make -j
评论区