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

Posted 嵌入式up笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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-

九、调用构建文件

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

以上是关于Linux系统移植:Kernel 顶层 Makefile(上)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Linux系统移植:U-Boot 顶层 Makefile 分析(上)

Linux系统移植:U-Boot 顶层 Makefile 分析(下)

Linux系统移植:原厂 Kernel 移植到开发板

Linux系统移植:原厂 Kernel 移植到开发板