IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> uboot Makefile 实用解读,看完了都会手写 Makefile 了(一) -> 正文阅读

[嵌入式]uboot Makefile 实用解读,看完了都会手写 Makefile 了(一)

源文件的管理,是架构能力的一个体现。
——题记


写在前面

之前一直做单片机,在 Keil、IAR、CCS 上写代码/编代码。
最近在转战 Linux 移植,裸机什么的还算顺利,遇到的第一个瓶颈是 uboot。
为了较清楚的读懂 uboot 的 Makefile,把鸟哥的私房菜的第三部分《学习shell与shell script》认真读了一遍。当然也少不了那篇经典的《跟我一起写Makefile》。

原则上,Makefile 正经的学习途径是看 GNU makefile 的官方介绍:
GNU make
但是鉴于时间关系,看中文的会更快一些。并且可以先了解 make 的主线机制,细节在使用的时候再查。
《跟我一起写Makefile》的架构就是按照 GNU 的官方文档组织的,已经很够用了。

做开发的硬件环境是正点原子的 IMX6 的开发板,借题感谢下正点原子团队,为国内的嵌入式普及做出了极大的贡献。开发过程中也充分借鉴了开发板的文档和资料。

这篇博客的切入点是 make 的输入命令。而不是更多文章里选择的——按照 Makefile 的行号从上到下进行分析。


make clean、make mrproper、make distclean

一般在进行编译之前,会先执行一下清理:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean

这这条命令中
“ARCH=arm” 和 “CROSS_COMPILE=arm-linux-gnueabihf-”
是向 Makefile 传递两个变量,这是向 Makefile 传递变量的标准做法。

distclean 是这条 make 命令要执行的目标,是这条命令的核心。

可以这样理解:当 make 执行一个目标时,Makefile 中,这个目标以外的代码,要么是为这个目标服务的,要么就和这个目标无关。

clean 相关的注释

如注释所说,cleaning is done on three levels.
清理程度最深的是 distclean

# 代码段 1:1390 行
###
# Cleaning is done on three levels.
# make clean     Delete most generated files
#                Leave enough to build external modules
# make mrproper  Delete the current configuration, and all generated files
# make distclean Remove editor backup files, patch leftover files and the like

make clean

先看下 clean 的规则:

# 代码段 2:1427 行
clean: $(clean-dirs)
	$(call cmd,rmdirs)
	$(call cmd,rmfiles)
	@find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
		\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
		-o -name '*.ko.*' -o -name '*.su' -o -name '*.cfgtmp' \
		-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
		-o -name '*.symtypes' -o -name 'modules.order' \
		-o -name modules.builtin -o -name '.tmp_*.o.*' \
		-o -name '*.gcno' \) -type f -print | xargs rm -f

原谅我的中英文混杂,直接用英文词汇更不容易产生歧义
这是被分析的第一条 Rule,把 Rule 的 Syntax 列在下面:

targets : prerequisites
        recipe
        …

这是 Makefile 最基本的语法了。

上面的代码:targets 是 “clean”;prerequisites 是 $(clean-dirs);recipe 有三条
下面依次分析:

$(clean-dirs)

对 $(clean-dirs) 的描述是在代码段2的之前的。

# 代码段 3:1418 行
clean-dirs	:= $(foreach f,$(u-boot-alldirs),$(if $(wildcard $(srctree)/$f/Makefile),$f))
clean-dirs      := $(addprefix _clean_, $(clean-dirs) doc/DocBook)

PHONY += $(clean-dirs) clean archclean
$(clean-dirs):
	$(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)

第一行,对变量 clean-dirs 进行直接赋值。

文中对 Makefile 知识的插播会以这样的形式出现
关于 Makefile 变量的赋值1:
“=” :延时赋值,该变量只有在调用的时候,才会被赋值
“:=” :直接赋值,与延时赋值相反,使用直接赋值的话,变量的值定义时就已经确定了。

等号的右边调用了 foreach 函数。

Makefile 是可以使用函数的,关于函数的更多宏观描述,此处不展开。具体分析下 foreach:
$(foreach < var >, < list >, < text >)
该函数提供循环处理功能,把参数 < list > 中的单词逐一取出,赋给 < var >, 然后带入到 < text > 中。< list > 有多少个元素,就会循环多少次,每次循环 < text > 都会返回一个字符串,循环过程中 < text > 所返回的每个字符串会以空格分隔的形式作为 foreach 函数的返回值。
例子:
dirs := a b c d
files := $ ( foreach dir, $ (dirs), $ (wildcard $ (dir)/ * ))
展开后等于:
files := $(wildcard a/* b/* c/* d/*)

第二行,又一次对变量 clean-dirs 进行直接赋值。这里有点像 C 语言中的 value = value + 3 的意思。

在 clean 的目标编写之前,定义了四个变量

# Directories & files removed with 'make clean'
CLEAN_DIRS  += $(MODVERDIR) \
	       $(foreach d, spl tpl, $(patsubst %,$d/%, \
			$(filter-out include, $(shell ls -1 $d 2>/dev/null))))

CLEAN_FILES += include/bmp_logo.h include/bmp_logo_data.h \
	       boot* u-boot* MLO* SPL System.map

# Directories & files removed with 'make mrproper'
MRPROPER_DIRS  += include/config include/generated spl tpl \
		  .tmp_objdiff
MRPROPER_FILES += .config .config.old include/autoconf.mk* include/config.h \
		  ctags etags TAGS cscope* GPATH GTAGS GRTAGS GSYMS

未完待续。。。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-08 11:29:42  更:2021-08-08 11:30:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:18:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码