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 分析(上)