dockerfile
FROM ubuntu:focal
COPY ./sources.list /etc/apt/sources.list
RUN chmod 777 /tmp
RUN apt update
RUN apt install -y build-essential ncurses-dev python3 bison flex libssl-dev bc && ln -s /bin/python3 /bin/python
RUN apt install u-boot-tools -y
其中sources.list是apt依赖源,我将宿主的文件拷至当前编译路径下,由dockerfile导入镜像
ubuntu:focal这个镜像是编译适用的,不应该用ubuntu:latest,它会产生apt依赖问题
u-boot-tools用于arm相关编译uboot引导加载
镜像编译
docker build -t kbuild:v1 .
参数可以自行更换,包括镜像名和编译路径。
之后运行容器
docker run -it -v /home/work:/share kbuild:v1
创建容器,并映射宿主文件夹给容器
环境变量
如果编译时依赖工具链,使用export增加可执行文件搜索路径:
newpath={这里输入工具链路径}
export PATH=$PATH:${newpath}
这些工作可以考虑加入到dockerfile尾部,好处是产生一层layer并能让其他编译链复用前一级依赖layer。
配置处理
如果需要交叉编译,需要在arch/xxx/目录下找到对应处理器架构的配置。
如果是想直接编译当前运行机的内核,可以去宿主机目录/proc/config.gz下拷贝配置文件。
然后执行配置类相关建立预处理编译命令,分别是menu界面模式和自动默认模式:
make menuconfig
make defconfig
menuconfig是一种UI选项型工具,所有的配置都基于内核的kconfig系统,支持选项、关系依赖、层级等元素。
编译
如果非交叉编译,则直接完成如下:
make
交叉还需要指定编译器CROSS_COMPILE和ARCH两个变量,还可以通过指定-j参数多处理器参与编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8