首先我们可以把编译内核分为入侵式和非入侵式,以jetson Nano 这款英伟达的板子为例,官网给的编译方式为侵入式,即将编译后的文件输出到指定输出目录。
实际操作中由于输出到指定的目录,每次都需要重编,所有的文件都会重新编译,时间非常长,这里 我们可以使用脚本的方式去编译linux内核
例如工作中常见的Makefile文件,直接修改 Makefile 可能会导致编译系统认为需要重新构建更多目标,从而触发全量编译,花费很多时间。
而脚本通常只修改或执行必要的步骤,利用内核编译系统的增量编译特性,只编译变化的部分,从而缩短编译时间。这种方式可以减少不必要的全量重编译,从而大大缩短编译时间。同时,脚本还能自动将生成的镜像和模块复制到烧写目录,避免手动拷贝的繁琐步骤。
下面这段Shell命令就是建立一个脚本,修改所需的变量参数后,复制到目标路径,并让其实现自动编译,可以省去每次修改时的时间。
vim bulid.sh /* 创建脚本
export CROSS_COMPILE=aarch64-linux-gnu-
export LOCALVERSION=-tegra
make ARCH=arm64 tegra_defconfig
make ARCH=arm64 -j4
cp arch/arm64/boot/Image ~/Linux_for_Tegra/kernel/
cp -rf arch/arm64/boot/dts/*.dt* ~/Linux_for_Tegra/kernel/dtb/
sudo make ARCH=arm64 modules_install INSTALL_MOD_PATH=~/Linux_for_Tegra/rootfs */
$ sudo chmod 777 bulid.sh $ ./bulid.sh //运行脚本,自动完成编译和拷贝到烧写目录
究其原因,牵涉到Linux中的增量编译模式,这个模式和文件依赖关系和时间戳(timestamp)检测
一、文件依赖关系
在 Makefile 中,你会为每个目标文件(如可执行文件、库或中间目标)定义它所依赖的源文件和头文件。例如,一个目标文件 main.o 可能依赖于 main.c 和 utils.h。当这些依赖关系在 Makefile 中明确列出后,make 知道如果某个依赖文件发生变化,相关目标就需要重新生成。
二 时间戳检测
每个文件都有一个最后修改时间戳。make 在构建过程中会比较目标文件与它依赖文件的时间戳。如果依赖文件的时间戳比目标文件更新(即依赖文件被修改过),make 会判断目标文件过时,需要重新编译生成。例如,如果 utils.h 的时间戳比 main.o 更新,那么 make 会重新编译 main.c 来生成新的 main.o。

被折叠的 条评论
为什么被折叠?



