Linux系统移植:Kernel 顶层 Makefile(上)

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-
1
2
九、调用构建文件
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
十二、导出变量
后面就是一堆导出变量,用于给子 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
————————————————
版权声明:本文为CSDN博主「Top嵌入式」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_45396672/article/details/123239728

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值