原博主发布的时候将Makefile分成了四章,为了读取方便,将其转载汇总为一章,并分别以一、二、三、四分隔。
转载地址:https://www.cnblogs.com/yr-linux/p/5361887.html
转载地址:https://www.cnblogs.com/yr-linux/p/5361886.html
转载地址:https://www.cnblogs.com/yr-linux/p/5361885.html
转载地址:https://www.cnblogs.com/yr-linux/p/5361822.html
一、版本号 u_boot_version(U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL).$(EXTRAVERSION)) (24-29行)
BSP支持包(https://yunpan.cn/cqB5i8LCAMzhM 访问密码 c425,解压后/uboot目录下的Makefile)
VERSION = 1 //主版本号
PATCHLEVEL = 3 //修补版本号
SUBLEVEL = 4 //次版本号
EXTRAVERSION = //附加信息,一般默认为空,我们可以自己设置
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL).$(EXTRAVERSION)
//uboot版本 1.3.4 ,之间用.隔开
VERSION_FILE = $(obj)include/version_autogenerated.h
//版本号文件,是根据主makefile中的第365行的规则创建的
编译过后, version_autogenerated.h 文件的路径是:根目录下面include/version_autogenerated.h。这个文件中引用了变量U_BOOT_VERSION的值; version_autogenerated.h这个文件是在编译时自动生成的,通过vi可以看到里面的 内容是一个宏:#define U_BOOT_VERSION "U-Boot 1.3.4"
二、环境变量之:主机的操作系统和主机架构(HOSTOS、HOSTARCH)(31-43行)
HOSTARCH := $(shell uname -m | \
sed -e s/i.86/i386/ \
-e s/sun4u/sparc64/ \
-e s/arm.*/arm/ \
-e s/sa110/arm/ \
-e s/powerpc/ppc/ \
-e s/ppc64/ppc/ \
-e s/macppc/ppc/)
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
sed -e 's/\(cygwin\).*/cygwin/')
export HOSTARCH HOSTOS //导出CPU的架构和CPU操作系统这两个环境变量,下面备用。
Makefile中的shell函数的用法(《跟我一起学makefile_陈皓》第53页 ):
contents := $(shell cat foo)
files := $(shell echo *.c)
(1)shell函数和反引号" ` "是相同的功能。在shell中执行 uname -m可以打印出主机的硬件架构名称
(2)shell中的| 叫做管道,管道:将管道前面的运算式的输出作为后面一个的输入再去处理。最终输出才是我们整个式子的输出。
(3)HOSTARCH
cpu架构 ARCH就是architecture,架构的意思。
三、静默编译
第45-54行:
45 # Deal with colliding definitions from tcsh etc.
46 VENDOR=
47
48 #########################################################################
49 # Allow for silent builds
50 ifeq (,$(findstring s,$(MAKEFLAGS))) //判断findstring函数是否为空
51 XECHO = echo //如果有就echo
52 else
53 XECHO = : //如果没有就为空,即不打印
54 endif
55
这一段 主要是关于静默编译的内容
uboot允许静默编译,开启静默编译主要是通过判断ifeq (,$(findstring s,$(MAKEFLAGS))) 。
使用方法:在编译时,使用make -s -会作为MAKEFLAGS传给Makefile.
关于makefile知识点:
条件判断:主makefile50行 :ifeq (,$(findstring s,$(MAKEFLAGS)))
《跟我一起学Makefile》第42页:
条件表达式的语法为:
<conditional-directive>
<text-if-true>
endif
以及
<conditional-directiv>
<text-if-ture>
else
<text-if-false>
endif
其中<conditional-directiv>表示条件关键字,如“ifeq”。
第一个关键字ifeq:
ifeq(<arg1>, <arg2>)
ifeq 'arg1' 'arg2'
ifeq “arg1” 'arg2'
ifeq 'arg1' ”arg2”
ifeq ”arg1” “arg2”
比较参数“arg1” 和“arg2”的值是否相同。相同为真。
第二个关键字ifneq:
ifneq (<arg1>, <arg2>)
ifneq 'arg1' 'arg2'
ifneq “arg1” 'arg2'
ifneq 'arg1' ”arg2”
ifneq ”arg1” “arg2”
比较参数“arg1” 和“arg2”的值是否相同。不同为真。
第三个关键字ifdef:
ifdef <variable-name>
如果变量的值非空,那么表达式为真,否则为假。
findstring函数
函数调用语法:
$(<funciton> <arguments>)
或者
${<function> <arguments>}
$(findstring <find>, <in>)
功能:在字串<in>中查找<find>字串。
返回:如果找到,那么返回<find>,否则返回空字符串。
所以这里ifeq (,$(findstring s,$(MAKEFLAGS)))
这里的意思就是如果findstring函数的返回值为空。如果为空,那么ifeq函数的两个参数相等,条件判断为真。执行<text-if-true>.
第57-123行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
|
编译复杂项目:makefile提供两种编译管理方法,默认情况是原地编译。
原地编译的缺点:
第一:污染源文件目录。第二:一套源代码只能按照一种配置和编译方法进行处理,无法同时维护超过两个或两个以上的配置编译方法。
输出文件夹编译:
为了解决以上缺陷,采用单独输出文件夹的方式编译,Linux kernel支持这样的方法,具体实现思路是:将所有编译生成的.o文件或者
其他文件全部输出到指定好的目录。uboot也学习了这样的方法。
具体做法:
见57行---76行的注释:
①在命令行编译时制定make O=输出目录(注意配置时也要加O=输出目录)
make O=/tmp/build all
1 |
|
root@ubuntu:/usr/local/arm/qt_x210v3/uboot/output# mkdir board/samsung/x210 -p
然后重新配置。
make O=output/ all
最后发现还是有问题。应该是整个uboot移植时还是不行的。我们以后使用三星版本的uboot进行移植再来研究。
②设置环境变量BUILD_DIR指出期望的输出目录。
1 2 |
|
第二种方法也可以通过MAKEALL脚本实现。
1 2 3 |
|
两种编译方法的makefile代码实现在78---123行