侧边栏壁纸
博主头像
Billy 的技术空间博主等级

君子生非异也,善假于物也。

  • 累计撰写 17 篇文章
  • 累计创建 1 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

分布式编译-icecream

billy
2024-05-30 / 0 评论 / 1 点赞 / 175 阅读 / 4884 字

分布式编译-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 配置

  1. 仅使用 icecc

find_program(ICECC icecc)
if(ICECC)
    set(CMAKE_C_COMPILER_LAUNCHER ${ICECC})
    set(CMAKE_CXX_COMPILER_LAUNCHER ${ICECC})
endif()

  1. 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

1

评论区