Linux系统移植:Kernel 顶层 Makefile(上)
一、版本号二、MAKEFLAGS 变量三、命令输出四、静默输出五、编译结果输出目录六、代码检查七、模块编译八、设置目标架构和交叉编译器九、调用构建文件十、交叉编译工具链设置十一、头文件路径变量十二、导出变量
Linux系统移植:Kernel 顶层 Makefile(上)之前分析过 uboot 源码目录下的顶层 makefile 文件,uboot 的顶层 makefile 参考了了许多 linux 顶层 makefile 的代码,前面有很多代码思路基本差不多
一、版本号版本信息不多说
二、MAKEFLAGS 变量makeflags 用来查找相对于内核 src 根目录的 make include 文件,他的值 始终自动的传递给子 make,我们可以在代码中看到 MAKEFLAGS:
三、命令输出Linux 编译的时候可以通过 “V=1” 来输出完整的命令,和 uboot 一样
代码老样子,V 为 1, quiet 和 Q 为空,输出完整命令,V 为 0 ,则 quiet=quiet_、Q = @,屏蔽掉完整命令
四、静默输出编译的时候使用 “make -s” 就可实现静默编译,编译的时候就不会打印任何的信息:
quiet 为 silent_ 时不会打印任何信息
后面还有一行
用来传递参数给子 make
五、编译结果输出目录编译时使用 “O=xxx” 可将编译产生的过程文件输出到指定的目录中
代码判断 O 存在且来自命令行后就会将 O 的值赋值给 KBUILD_OUTPUT (编译输出目录),然后判断 KBUILD_OUTPUT 不为空的话,则创建该目录,并将所有的 make 结果设置为该目录
六、代码检查使用参数 “ C=1” 使能代码检查,检查那些需要重新编译的文件,“C=2”用于检查所有的源码文件
代码逻辑和前面的相同
七、模块编译Linux 允许单独编译某个模块,使用命令 “make M=dir” 或者旧语法 “make SUBDIRS=dir”,相关代码如下:
代码对两个指令都支持
根据 KBUILD_EXTMOD 决定编译部分还是全部模块,然后设置 srctree、objtree、VPATH 这三个变量并输出
八、设置目标架构和交叉编译器Linux 编译要设置目标板架构 ARCH 和交叉编译器 CROSS_COMPILE
编译时要把这两个参数传进去,对于 IMX 板子可以直接先设置成下面参数,减少编译指令长度
ARCH ?= arm CROSS_COMPILE ?= arm-linux-gnueabihf-九、调用构建文件
Linux 顶层 Makefile 也会调用文件 scripts/Kbuild.include,里面是一些辅助调用的代码:
十、交叉编译工具链设置下面的代码是配置交叉编译工具的代码,比如 LD-链接器、gcc 编译器等等
十一、头文件路径变量顶层 Makefile 定义了两个变量 保存头文件路径:USERINCLUDE 和 LINUXINCLUDE
在默认输入情况下,srctree=.,hdr-arch=arm,KBUILD_SRC 为空,带入后展开代码:
USERINCLUDE :=
-I./arch/arm/include/uapi
-Iarch/arm/include/generated/uapi
-I./include/uapi
-Iinclude/generated/uapi
-include ./include/linux/kconfig.h
LINUXINCLUDE :=
-I./arch/arm/include
-Iarch/arm/include/generated/uapi
-Iarch/arm/include/generated
-Iinclude
-I./arch/arm/include/uapi
-Iarch/arm/include/generated/uapi
-I./include/uapi
-Iinclude/generated/uapi
-include ./include/linux/kconfig.h
十二、导出变量
后面就是一堆导出变量,用于给子 make 使用
export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION export ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC export CPP AR NM STRIP OBJCOPY OBJDUMP export MAKE AWK GENKSYMS INSTALLKERNEL PERL PYTHON UTS_MACHINE export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV CFLAGS_KASAN export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL export KBUILD_ARFLAGS



