SONiC的编译架构如下:
(结合编译架构,更易理解)
此处以集成libcare组件为例,以sonic-buildimage为根目录
一、通过SONiC编译生成deb包
在src目录下创建sonic-libcare/libcare目录,创建编译deb包的debian目录,用于存放控制文件和脚本等,其中包含以下5个文件:
changelog文件(用于记录deb包的变更日志):
compat文件(一般为9或10):
其中核心文件有control、rules和libcare.install
control文件(用于描述软件包的基本信息和依赖关系等):
rules文件:
其中的make -C src,其作用到libcare源码的src目录进行编译,生成相应的二进制文件;
由于这里的软件包是基于源代码的,所以我们在debian目录中创建个名为 rules 的文件,并使用dh make工具来帮助你自动生成构建脚本。
libcare.install文件:
左侧为libcare源码中的对应文件;右侧为安装deb包后文件将会被安装到系统的对应位置
然后在此目录下创建编译文件Makefile:
src/sonic-libcare/libcare/Makefile:
从这个Makefile中的命令可以看出其基本流程:通过拉取源代码,并将debian目录拷贝至源代码目录中,并通过dpkg-buildpackage命令生成对应的deb包。
此时,在rules目录下创建libcare.mk文件,定义一些关于libcare的deb名以及deb版本等信息
注意,最后需要加上export LIBCARE,否则在slave.mk中无法识别LIBCARE变量,会导致编译出错。
此时,需要在slave.mk文件的对应位置上添加LIBCARE变量,如下图所示:
最初确定要在bullseye目录下生成的deb包,因此,需要到sonic-slave-bullseye/Dockerfile.j2中添加编译libcare组件需要依赖的工具(若已存在,则无需重复添加),此处,需要安装的工具如下:
综上操作,通过SONiC编译,就可以在target/debs/bullseye下生成libcare对应的deb包。
二、将deb包安装到host和docker中
在host宿主机下安装libcare的deb包,需要在files/build_templates/sonic_debian_extension.j2中添加相关命令,如下图:
在各个docker容器中安装libcare的deb包,只需要在rules/docker-base-bullseye.mk和docker-base-buster.mk文件的$(DOCKER_BASE_BULLSEYE)_DEPENDS后添加LIBCARE变量即可,此处的LIBCARE变量即是libcare.mk中定义的LIBCARE。如下图所示: