linux makefile 框架分析2
[194] ifeq need-sub-make = 0
该篇主要分析这部分主makefile内容
[1906] end need-sub-make
[211] C: 源代码check, KBUILD_CHECKSRC
[220] M: 指定外部模块目录,KBUILD_EXTMOD
extmod-prefix: 外部模块路径
ifeq ($(abs_srctree),$(abs_objtree))srctree := .building_out_of_srctree :=
elseifeq($(abs_srctree)/, $(dir $(abs_objtree)))srctree :=elsesrctree := $(abs_srctree)endifbuilding_out_of_srctree := 1
endif
objtree := .
VPATH := $(srctree) 为什么不直接用绝对路径
version_h
clearn-target :=
no-dot-config-targets
no-sync-config-targets
single-targets:
config-build:
默认空,如果KBUILD_EXTMOD为空,且MAKECMDGOALS包含%config,置1;
mixed-build:
默认空,
如果KBUILD_EXTMOD为空,且MAKECMDGOALS包含%config,且多于1个 goals,置1;
如果MAKECMDGOALS 包含有single-targets,且还包含有其他,置1;
如果MAKECMDGOALS包含有clean-targets,且还包含有其他,置1;
如果MAKECMDGOALS包含有install,和modules-install,置1;
need-config:
默认是1,如果MAKECMDGOALS 只包含 no-dot-config-targets,清空;
may-sync-config:
默认是1,如果MAKECMDGOALS 只包含no-sync-config-targets,清空;
如果KBUILD_EXTMOD被定义,清空;
single-build:
默认空,如果MAKECMDGOALS包含single-targets,置1;
[327]ifdef mixed-build
递归构建每一个goals
__build_one_by_one: for $(MAKECMDGOALS):make -f $(srctree)/Makefile each
[343]else mixend-build
单个构建的处理放在下面分析
[1905]end mixend-build
单个构建的处理分析
include scripts/kbuild.include: 各种makefile函数的定义
KERNELRELEASE KERNELVERSION
include scripts/subarch.include: 获取宿主机架构SUBARCH
ARCH ?= $SUBARCH: 交叉编译的话,需要提前指定ARCH
UTS_MACHINE := $ARCH
SRCATCH := $ARCH
KCONIFG_CONFIG ?= .config
KBUILD_DEFCONFIG := defconfig
HOST配置:编译选项,shell等
[430]交叉编译器配置:
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)gcc
.......
[472]各种FLAG:
CHECKFLAGS:
NOSTDINC_FLAGS:
CFLAGS_MODULE:
.........
[483]USERINCLUDE
LINUXINCLUDE
KBUILD_XXXX
[539]config 目标和 build 目标共享的规则
scripts_basic: 基础的辅助构建, make $(build)=scripts/basic
outputmakefile: 如果obj和src不是同一个目录,在obj目录生成makefile,根据前面定义的宏building_out_of_srctree来判断是否需要
CC_VERSION_TEXT
[592] end config 目标和 build 目标共享的规则
[594] ifdef config-build
include arch/$(SRCARCH)/Makefile: 获取KBUILD_DEFCONFIG定义
%config or config: outputmakefile scriptps 构建kconfig
make $build=scripts/kconfig $@
[611]else config-build
build目标构建分析
[1904]end config-build
build目标构建分析
[612]config-build = 0
__all: 如果定义KBUILD_EXTMOD,则依赖modules,否则依赖all
KBUILD_MODULES:
默认空;
如果MAKECMDGOALS包含 all modules nsdeps,则置1;
如果MAKECMDGOALS为空,则置1;
KBUILD_BUILTIN:
默认1;
如果MAKECMDGOALS 是 modules, 则清空;
include include/config/auto.conf: 如果定义 need-config,则包含。里面包含了kconfig生成的所有配置
[654]KBUILD_EXTMOD为空: 构建vmlinux
core-y := init/ usr/
drivers-y := drivers/ sound/
drivers-$(CONFIG_SAMPLES) += samples/
drivers-y += net/ virt/
libs-y := lib/
[661]end KBUILD_EXTMOD为空
all: vmlinux all 默认目标
[669] 一些编译选项的宏
include arch/$(SRCARCH)/Makefile: 可以在这个目录增加架构相关的配置
[690] ifdef need-config
[691]ifdef may-sync-config
include include/config/auto.conf.cmd: 定义了 kconfig文件的依赖关系,以及auto.conf,确保这些可以是最新的
%/config/auto.conf %/config/auto.conf.cmd %/generated/autoconf.h: $(KCONFIG_CONFIG)
make -f $(srctree)/Makefiel syncconfig
[715]else may-sync-config
include/config/auto.conf: ????
[730] end may-sync-config
[731] end ifdef need-config
kBUILD_xx: 编译选项控制
[961] include-y: scripts/Makefile.xxxx
KBUILD_IMAGR ?= vmlinux
INSTALL_PATH ?= /boot
INSTALL_DTBS_PATH = $(INSTALL_PATH)/dtbs/$(KERNELRELEASE)
MODLIB = $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
module strip compressed sign: 相关操作
[1096] MODORDER: $(extmod-prefix)modules.order
MODULES_NSDEPS: $(extmod-prefix)modules.nsdeps
[1099] if 没有定义KBUILD_EXTMOD
core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/
vmlinux-dir = core-y core-m drivers-y drivers-m libs-y libs-m
vmlinux-alldir = vmlinux-dir Documentation core- drivers- libs-
subdir-modorder = core-y/modules.order core-m/modules.order libxxx driversxxx
build-dirs = vmlinux-dir
clean-dirs = vmlinux-alldirs
KBUILD_VMLINUX_OBJS = head-y core-y/built-in.a libs-y/built-in.a drivers-y/built-in.a
ifdef CONFIG_MODULES(来自kconfig), += libs-y/lib.a
KBUILD_VMLINUX_LIBS =
ifdef CONFIG_MODULES, +=libs-y(非/结尾),否则libs-y/lib.a
KBUILD_LDS = arch/$(SRCARCH)/kernel/vmlinux.lds
KBUILD_ALLDIRS: 供 scripts/Makefile.package使用
vmlinux-deps = KBUILD_LDS KBUILD_VMLINUX_OBJS KBUILD_VMLINUX_LINBS
autoksyms_recursive:
ifdef CONFIG_TRIM_UNUSED_KSYMS
KBUILD_MODULES = 1
autoksyms_recursive: descend modules.order
shell $(srctree)/scripts/adjust_autoksyms.sh :
make -f $(srctree)/Makefile vmlinux
endif
autoksyms_h quiet_cmd_autoksyms_h cmd_autoksyms_h
autoksyms_h: xxxx
ARCH_POSTLINK: arm没有
cmd_link-vmlinux: ld
vmlinux: scripts/link-vmlinux.sh autoksyms_recursive $(vmlinux-deps)
targets := vmlinux
vmlinux-deps subdir-modorder : descend
archprepare: outputmakefile archheaders archscripts scripts include/cnfig/kernel.release ... include/generates/autoconf.h
prepare: prepare0 prepare-objtool preprare-resolve_btfids
asm-generic
[1270] kernel header:生成和安装
[1307] kernel selftest: 运行自检脚本
[1324] devicetree file:
[1370] modules ifdef CONFIG_MODULES
modules: vmlinux modules_check
make -f scriptes/Makefile.modpost
cmd_modules_order =
[1440] else CONFIG_MODULES
[1675] else KBUILD_EXTMOD
[1729] end KBUILD_EXTMOD
linux makefile 框架分析2相关推荐
- linux makefile 框架分析1
主Makefile [17] MAKECMDGOALS: 命令行传入的构建对象 [22] __all : 默认目标 [40] sub_make_done: 存在的意义,构建框架存在递归调用的行为,而对 ...
- linux音频框架分析,Alsa音频子系统Codec---al5623.c内核代码框架分析
驱动代码位于: sound/soc/codec/alc5623.c 随便找个Linux内核都会有. 1.首先进行i2c总线驱动加载在: static int __init alc5623_modini ...
- Linux v4l2框架分析
背景 说明: Kernel版本:4.14 ARM64处理器,Contex-A53,双核 使用工具:Source Insight 3.5, Visio 1. 概述 V4L2(Video for Linu ...
- contiki makefile框架分析 contiki学习之一
在linux下的工程编译,基本都可以使用makefile这个工具来完成.Contiki OS亦如此,下面分析contiki整个Makefile的框架,对makefile的具体内容暂不做分析.本文依赖于 ...
- Android/Linux Thermal框架分析及其Governor对比
https://www.cnblogs.com/arnoldlu/p/6388151.html 图表 1 Thermal框架 随着SoC性能的快速提升,功耗也极大提高,带来的负面影响是SoC的温度提高 ...
- Linux USB驱动框架分析 【转】
转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...
- linux v4l2系统详解,Linux摄像头驱动学习之:(一)V4L2_框架分析
这段时间开始搞安卓camera底层驱动了,把以前的的Linux视频驱动回顾一下,本篇主要概述一下vfl2(video for linux 2). 一. V4L2框架: video for linux ...
- OS相关驱动 Linux USB驱动框架分析
初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结当然不可缺,更何况我决定为嵌入式卖命了.好,言归正传,我说一说这段时间的收获,跟大家分享一下Linux的驱动开发 ...
- java连接linux服务器执行shell命令(框架分析+推荐)
java连接linux服务器执行shell命令(框架分析+推荐) 一.分类+连接方式 程序打成jar包,在本地服务器上执行shell命令.这种使用MyRuntimeUtil工具类 java程序远程li ...
最新文章
- 计算机网络安全防护体系研究
- Leetcode334反转字符串[C++题解]:双指针
- php 获取signature,PHP开发微信无法获取到signature,timestamp,nonce
- java用tkmapper分组查询_mybatis example group by count 分组求和 - java分组求和
- Spring Cloud与Duddo比较(非原创)
- linux 相关零碎知识整理
- 浅析Asp.net MVC 中Ajax的使用
- java webview框架_java - Android WebView 无法正常显示网页图表
- hdu5823 (附带数的二进制子集)
- --c语言运算符_C按位运算符-能力问题和解答
- 加加速度matlab,关于加加速度的若干机械运动分析及MATLAB模拟
- GitHub推出云端IDE,可在浏览器里使用VS Code了
- 钉钉作弊,被判5年!
- quickselect java,实现快速选择
- 关于QT中的音频通信问题
- 机器人开发--技术路线简介
- VRP--车辆路径问题 c++
- 四个小故事—体验经济:互联网生存的秘密
- 超级计算机运行吃鸡,pdd花6万买的超级电脑,第二天玩吃鸡显卡被击穿,网友:人傻钱多...
- Codeforces 558C Amr and Chemistry 暴力 - -
热门文章
- 【有奖话题】一场因疫苗引发的技术风波?
- 药监局:强化疫苗批签发管理 加大生产企业检查力度
- 解决find命令报错: paths must precede expression(转)
- 世界各国实际利率存款利率支付利息收入所得税率利息差贷款利率(1960-2022)
- 第9课时 自由行走的机器人
- linux下qt的odbc库编译,linux qt QODBC连接sql server 驱动 有关问题 ,实在是没辙了
- uniapp多端小程序中中各部分尺寸的计算方法
- LeetCode笔记:Biweekly Contest 83
- coreldraw x5 选择工具快捷键_CorelDRAW-X5快捷键
- php soapclient 参数,序列化 – 序列化PHP SOAPClient对象