关键词:
目录
Linux系统移植:U-Boot 顶层 Makefile 分析(下)
继续沿着上的代码内容往下研读
一、调用 scripts/Kbuild.include
下面的代码就是在 Makefile 会调用文件 scripts/Kbuild.include 这个文件
“include” 包含了文件 scripts/Kbuild.include,此文件里面定义了很多变量,我们打开看一下
这些变量在编译工过程中会被调用
二、导出交叉编译工具变量设置
下面的代码就是设置交叉编译器的各种工具
三、导出其他变量
之后的代码导出各种变量
export VERSION PATCHLEVEL SUBLEVEL UBOOTRELEASE UBOOTVERSION
export ARCH CPU BOARD VENDOR SOC CPUDIR BOARDDIR
export CONFIG_SHELL HOSTCC HOSTCFLAGS HOSTLDFLAGS CROSS_COMPILE AS LD CC
export CPP AR NM LDR STRIP OBJCOPY OBJDUMP
export MAKE AWK PERL PYTHON
export HOSTCXX HOSTCXXFLAGS DTC CHECK CHECKFLAGS
export KBUILD_CPPFLAGS NOSTDINC_FLAGS UBOOTINCLUDE OBJCOPYFLAGS LDFLAGS
export KBUILD_CFLAGS KBUILD_AFLAGS
重点是第二行的几个变量:
export ARCH CPU BOARD VENDOR SOC CPUDIR BOARDDIR
我们在程序中加入自己的代码,把这些变量打印出来:
var_test:
@echo 'ARCH=' $(ARCH)
@echo 'CPU=' $(CPU)
@echo 'BOARD=' $(BOARD)
@echo 'VENDOR=' $(VENDOR)
@echo 'SOC=' $(SOC)
@echo 'CPUDIR=' $(CPUDIR)
@echo 'BOARDDIR=' $(BOARDDIR)
使用 make var_test 执行后的结果如下:
- ARCH :架构信息
- CPU :具体CPU架构
- BOARD :开发板信息
- VENDOR :厂商
- SOC :芯片型号
- CPUDIR :CPU 架构文件目录
- BOARDDIR:开发板文件目录
这几个变量在 uboot 根目录下 config.mk 里面定义
四、 make xxx_config过程
uboot 可以使用 “make xxx_defconfig” 命令来配置 uboot,配置代码如下:
# To make sure we do not include .config for any of the *config targets
# catch them early, and hand them over to scripts/kconfig/Makefile
# It is allowed to specify more targets when calling make, including
# mixing *config targets and build targets.
# For example 'make oldconfig all'.
# Detect when mixed targets is specified, and make a second invocation
# of make so .config is not included in this case either (for *config).
version_h := include/generated/version_autogenerated.h
timestamp_h := include/generated/timestamp_autogenerated.h
no-dot-config-targets := clean clobber mrproper distclean \\
help %docs check% coccicheck \\
ubootversion backup
config-targets := 0
mixed-targets := 0
dot-config := 1
开头定义了变量 version_h,这变量保存版本号文件(此文件是自动生成的),内容如下:
后面定义了变量 timestamp_h,保存时间戳文件,同时定义了其他的一些变量 no-dot-config-targets、config-targets、mixed-targets 并赋予了初值
下面的代码将 MAKECMDGOALS 中不符合 no-dot-config-targets 的部分过滤掉,剩下的如果不为空的话条件就成立
ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
dot-config := 0
endif
endif
判断KBUILD_EXTMOD 是否为空,如果KBUILD_EXTMOD为空的话条件成立,将 MAKECMDGOALS 中不符合“config”和“%config”的部分过滤掉,如果剩下的部分不为空条件就成立,然后统计 MAKECMDGOALS 中的单词个数,如果不为 1 的话条件成立
ifeq ($(KBUILD_EXTMOD),)
ifneq ($(filter config %config,$(MAKECMDGOALS)),)
config-targets := 1
ifneq ($(words $(MAKECMDGOALS)),1)
mixed-targets := 1
endif
endif
endif
words 匹配函数格式如下:
$(words <text>)
判断完成后,几个变量值如下:
config-targets = 1
mixed-targets = 0
dot-config = 1
后面的代码根据值进行进一步执行,下面的代码分析直接写在注释内:
ifeq ($(mixed-targets),1)
# ===========================================================================
# We're called with mixed targets (*config and build targets).
# Handle them one by one.
PHONY += $(MAKECMDGOALS) __build_one_by_one
$(filter-out __build_one_by_one, $(MAKECMDGOALS)): __build_one_by_one
@:
__build_one_by_one:
$(Q)set -e; \\
for i in $(MAKECMDGOALS); do \\
$(MAKE) -f $(srctree)/Makefile $$i; \\
done
else
ifeq ($(config-targets),1)
# ===========================================================================
# *config targets only - make sure prerequisites are updated, and descend
# in scripts/kconfig to make the *config target
KBUILD_DEFCONFIG := sandbox_defconfig
export KBUILD_DEFCONFIG KBUILD_KCONFIG
#最终要执行的脚本
config: scripts_basic outputmakefile FORCE
$(Q)$(MAKE) $(build)=scripts/kconfig $@
%config: scripts_basic outputmakefile FORCE
$(Q)$(MAKE) $(build)=scripts/kconfig $@
else
# ===========================================================================
# Build targets only - this includes vmlinux, arch specific targets, clean
# targets and others. In general all targets except *config targets.
ifeq ($(dot-config),1)
# Read in config
-include include/config/auto.conf
输入的指令最终执行下面的两句
①、scripts_basic 目标对应的命令
make -f ./scripts/Makefile.build obj=scripts/basic
②、%config 目标对应的命令
make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig
其具体的执行流程如下:
五、make过程
先直接看 make 的执行流程示意图
流程解释如下:
使用 make 命令后,先使用默认目标 _all,如下:
目标_all 又依赖于 all,然后加载 all 依赖
在主 Makefile 中 all 目标规则如下
具体 All-y 规则:
ALL-y 主要包含 u-boot.srec、u-boot.bin、u-boot.sym、System.map、u-boot.cfg 和 binary_size_check 这几个文件。根据 uboot 的配置情况也可能包含其他的文件
ALL-y 里面有个 u-boot.bin,这个就是我们最终需要的 uboot 二进制可执行文件,目标 u-boot.bin 依赖于 u-boot-nodtb.bin 文件,所以又先生成 u-boot-nodtb.bin 文件,在 Makefile 中代码如下:
而目标 u-boot-nodtb.bin 又依赖于 u-boot,u-boot 相关规则如下:
规则就相当于将以 u-boot.lds 为链接脚本,将 arch/arm/cpu/armv7/start.o 和各个子目录下的 built-in.o 链接在一起生成 u-boot
表现在程序上最终是用 arm-linux-gnueabihf-ld.bfd 命令将 arch/arm/cpu/armv7/start.o 和其他众多的 built_in.o 链接在一起,形成 u-boot,以上就是 make 的大致流程,其 Makefile 主要就下面两个功能
- make xxx_defconfig:配置 uboot,生成.config 文件
- make:编译 uboot,生成二进制的 u-boot.bin 文件和其他的一些与 uboot 有关的文件,比如 u-boot.imx 等等
linux系统移植:kernel顶层makefile(下)(代码片段)
文章目录Linux系统移植:Kernel顶层Makefile(下)一、makedefconfig过程二、Makefile.build脚本分析三、make过程四、built-in.o文件编译生成过程五、makezImage过程Linux系统移植:Kernel顶层Makefile(下)继续分析Linux内核... 查看详情
linux系统移植:kernel顶层makefile(上)(代码片段)
文章目录Linux系统移植:Kernel顶层Makefile(上)一、版本号二、MAKEFLAGS变量三、命令输出四、静默输出五、编译结果输出目录六、代码检查七、模块编译八、设置目标架构和交叉编译器九、调用构建文件十、交叉编译... 查看详情
04.移植u-boot
1.读readme获取信息 1.1由BuildingtheSoftware可知,需修改顶层makefile,指定架构和编译器 ifeq($(HOSTARCH),$(ARCH)) CROSS_COMPILE?=arm-linux- endif 查看详情
u-boot-2016.07移植(第一篇)初步分析
...m-linux-gcc443安装环境Ubuntu910下载u-boot-201607并解压分析顶层Makefile1找出目标依赖关系2总结初次编译u-boot1配置2编译分析u-boot启动流程1分析startS 查看详情
linux内核顶层makefile详解
...c;在具体移植之前,我们先来学习一下Linux内核的顶层Makefile文件,因为顶层Makefile控制着Linux内核的编译流程。 查看详情
linux系统移植:u-boot工程创建(代码片段)
...件夹2.2board文件夹2.3config文件夹2.4.u-boot.xxx_cmd文件2.5顶层Makefile文件2.6u-boot.xxx文件2.7.config文件2.8README文件三、U-Boot过程创建3.1打开工程文件夹3.2保存工作区3.3建立构建关系Linux系统移植:U-Boot工程创建本章用于分析U-Boot的工... 查看详情
u-boot顶层makefile分析
...本执行后会生成以下3个文件,这些文件中提供的变量会在Makefile中其它地方使用。116#loadARCH,BOARD,andCPUconfiguration117include$ 查看详情
u-boot顶层makefile介绍(*)(代码片段)
参考:U-Boot顶层Makefile介绍作者:一只青木呀发布时间:2020-10-2216:22:17网址:https://blog.csdn.net/weixin_45309916/article/details/109218569目录1、准备好uboot源码2、分析顶层Makefile2.1、版本号2.2、MAKEFLAGS变量2.3、 查看详情
u-boot-2016.09顶层makefile分析
##SPDX-License-Identifier: GPL-2.0+#VERSION=2016PATCHLEVEL=09SUBLEVEL=EXTRAVERSION=NAME=#*DOCUMENTATION*#Toseealistoftypicaltargetsexecute"makehelp"#Moreinfocanbelocatedin./README#Commentsinthisfilear 查看详情
嵌入式linux第二部分-裸机开发/系统移植/驱动开发/内核开发
...间:2022年11月13日【嵌入式Linux】裸机开发篇LinuxC语言及Makefile基础【嵌入式Linux】1.shell概念及常用命令行【嵌入式Linux】2.LinuxC语言基础【嵌入式Linux】3.VisualStudioCode插件的安装(C/C++)U-Boot专题【嵌入式Linux】4.U-Boot入门【嵌入式... 查看详情
嵌入式linux7.u-boot顶层makefile分析(代码片段)
...用ifeq来判断"$(originV)"和"commandline"是否相等。这里用到了Makefile中的函数originorigin和其他的函数不一样,它不操作变量的值, 查看详情
嵌入式开发(s5pv210)——u-boot的顶层makefile分析(代码片段)
前言本文分析的是u-boot的主Makefile以及主Makefile调用到的一些关键文件,此Makefile可能和你手里的u-boot的Makefile不一样,这是正常的,但是从逻辑上都是一样的,无非就是把同样功能的脚本放在了不同的位置或者子Ma... 查看详情
linux系统移植博文导航
Linux系统移植专栏更新很久了,博主今天就把以前的博文整理一下,希望对感兴趣的朋友有所帮助,在此感谢CSDN这个平台给出了这个一个交流的机会,也感谢大家的支持。Linux相关的网站U-BootLinux内核busyboxLinux系统移植Linux系统移... 查看详情
嵌入式linux7.u-boot顶层makefile分析(代码片段)
1.版本号5VERSION=20166PATCHLEVEL=037SUBLEVEL=8EXTRAVERSION=9NAME=VERSION是主版本号,PATCHLEVEL是补丁版本号,SUBLEVEL是次版本号,这三个一起构成了uboot的版本号,比如当前的uboot版本号就是“2016.03”。EXTRAVERSION是附加版本信息,NAME是和名字有... 查看详情
linux内核移植入门(代码片段)
文章目录基本概念内核源码目录结构内核配置主目录Makefile各子目录Makefile如何配置内核?1.配置仓库选取2.交叉编译器的修改3.体系结构体的选择4.修改配置文件内核编译编译结果:几种linux内核文件的区别开发板上U-Boot启动linux内核... 查看详情
linux系统移植:正点原子u-boot移植(代码片段)
文章目录Linux系统移植:正点原子U-Boot移植一、What‘sU-Boot?1.1U-Boot简介1.2U-Boot选择二、正点原子U-Boot编译2.1编译环境2.2编译脚本三、U-Boot烧写与启动Linux系统移植:正点原子U-Boot移植一、What‘sU-Boot?1.1U-Boot简介Linux系统启... 查看详情
linux系统移植:u-boot启动流程(下)(代码片段)
目录Linux系统移植:U-Boot启动流程(下)一、run_main_loop函数详解二、cli_loop函数详解三、cmd_process函数详解Linux系统移植:U-Boot启动流程(下)一、run_main_loop函数详解uboot启动以后会进入3秒倒计时,如果... 查看详情
linux系统移植:u-boot链接脚本(代码片段)
文章目录Linux系统移植:U-Boot链接脚本一、u-boot.lds介绍二、u-boot.lds分析Linux系统移植:U-Boot链接脚本一、u-boot.lds介绍前面提到的U-Boot的本质就是一个大的裸机程序,执行的时候需要先找到程序入口,而程序的链接... 查看详情