完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 柠檬守护 于 2016-8-19 21:02 编辑
写在前面的话: 下定决心,好好啃一下uboot这块骨头,要感谢分享视频的小伙伴,还有朱老师的视频这一周的学习下来,对于以往的知识,不仅仅是回顾那么简单,而是夯实基础。 这个后续看看自己是不是时间充裕,充裕的话,在把整个过程分享给大家,如果坛友们能够有所收获,那将是对我最大的赞赏。 ************************************************************************************ Makefile 篇之Makefile 80%的基础篇。 你必须的知道的内容:当执行make指令时,我们的系统会默认到当前的目录去寻找GNUMakefile, 没有找到的话,就去找makefile,没有找到的话,就去找Makefile,找到的话,就执行。 所以我们一般也是定义为Makefile。 Makefile从字面意思上来思考,其实就是make+file,中文讲就是制作文件,那么既然是制作文件,我们第一个反应出来的问题,file的类型以及制作的方法。 那么我们接下来就从结合这2个问题,来展示一下,makefile基础的一些内容。 Makefile 制作的文件属性: 其实makefile制作出来的文件属性,它的类型可以是自己根据需求定义,从源文件到.o文件, 从.o文件到elf文件,从elf文件到.bin文件,从.bin文件到前16k文件,涉及到嵌入式开发领域中,可以讲, 编译环节中的每一个过程需要的文件,都可以经过这个makefile来制作出来 Makefile的制作方法: 讲方法,那我们首先就要开讲规律或者说是makefile的基本原则,这个是makefile的核心中的核心,是指导我们完成相关file制作的理论依据。 而对应文件的产生,则是整个思维过程的收获。 Makefile制作要点一:三要素。 目标 :依赖 [TAB] 命令 这三者就是makefile的三要素,值得注意的是,三者的基本关系是, 目标文件与依赖文件的属性新旧相比(日期或者改动),如果目标文件新,则不执行命令;反之,就执行命令。 举一个例子: lemon@ubuntu:~/uboot_code/myboot$cat Makefile mystart.o : mystart.S ARM-linux-gcc -c mystart.S make 之后会生成mystart.o lemon@ubuntu:~/uboot_code/myboot$make arm-linux-gcc -c mystart.S 若Mystart.o 比mystart.S 新 重新make的话,是不会执行命令的。 举例: lemon@ubuntu:~/uboot_code/myboot$make make: `mystart.o' is up todate. 这个例子就很好的说明了makefile的最为基本的规则:三要素。评分
|
||
相关推荐
|
||
Makefile制作要点二:makefile默认只运行第一个目标。
举例说明: lemon@ubuntu:~/uboot_code/myboot$ cat Makefile mystart.o : mystart.S arm-linux-gcc -c mystart.S mylowlevel_init.o : mylowlevel_init.S arm-linux-gcc -c mylowlevel_init.S 我们把前面生成的mystart.o 与mylowlevel_init.o删掉。 lemon@ubuntu:~/uboot_code/myboot$ rm my*.o -f lemon@ubuntu:~/uboot_code/myboot$ ls dd.sh get16k.sh Makefile mkv210 mylowlevel_init.S mystart.S myuboot myuboot.bin myuboot.lds u-boot.16k 重新make。 lemon@ubuntu:~/uboot_code/myboot$ make arm-linux-gcc -c mystart.S lemon@ubuntu:~/uboot_code/myboot$ ls dd.sh get16k.sh Makefile mkv210 mylowlevel_init.S mystart.o mystart.S myuboot myuboot.bin myuboot.lds u-boot.16k 发现make指令下达之后,仅仅只有第一个目标被执行了,即mystart.o生成了,而第二个目标没有执行。 那这样的情况,我们想要两个目标都实现,该怎么办呢? |
|
|
|
|
|
Makefile制作要点三: 伪目标 all和他的依赖关系
我们想要实现两个目标都实现,我们可以使用一个伪目标all,然后设置它的依赖为我们要设定或者实现的目标,那么这个问题就可以解决了。 案例: lemon@ubuntu:~/uboot_code/myboot$ cat Makefile all: mystart.o mylowlevel_init.o echo "Gritek Lemon!" mystart.o : mystart.S arm-linux-gcc -c mystart.S mylowlevel_init.o : mylowlevel_init.S arm-linux-gcc -c mylowlevel_init.S lemon@ubuntu:~/uboot_code/myboot$ make arm-linux-gcc -c mystart.S arm-linux-gcc -c mylowlevel_init.S echo "Gritek Lemon!" Gritek Lemon! lemon@ubuntu:~/uboot_code/myboot$ ll my*.o -rw-rw-r-- 1 lemon lemon 622 8月 19 20:08 mylowlevel_init.o -rw-rw-r-- 1 lemon lemon 796 8月 19 20:08 mystart.o 生成了mylowlevel_init.o与mystart.o。 知识点: 伪目标不同于真正的目标,伪目标肯定是不存在的,当伪目标作为makefile要去执行的目标的时候,makefile会优先去寻找伪目标的依赖,会从文件往下的目标中,去寻找这个依赖,直到找到为止,找到了就执行这个目标关系,生成伪目标需要的依赖。 如果没有找到,那就提示,依赖不存在,make stop。 lemon@ubuntu:~/uboot_code/myboot$ cat Makefile all:uboot.o echo "Gritek Lemon!" mystart.o : mystart.S arm-linux-gcc -c mystart.S mylowlevel_init.o : mylowlevel_init.S arm-linux-gcc -c mylowlevel_init.S lemon@ubuntu:~/uboot_code/myboot$ make make: *** No rule to make target `uboot.o', needed by `all'. Stop. |
|
|
|
|
|
Makefile制作要点四:复杂命令的制作
当目标依赖关系满足,依赖比目标新时,执行三要素中的命令语句;而这个语句可以是多行组合在一起的。 案例: lemon@ubuntu:~/uboot_code/myboot$ cat Makefile all:mystart.o mylowlevel_init.o echo "Gritek Lemon!" arm-linux-ld -Tmyuboot.lds -o myuboot mystart.o mylowlevel_init.o ld -o |
|
|
|
|
|
Makefile制作要点五: 善用自动化变量
所谓变量,其实跟C语言中的变量意义是一样的,我们常见的自动化变量主要由3个。 $@:表示目标 $< :表示依赖中的第一个依赖 $^ :表示所有的依赖 基于此,上面案例中的代码我们可以做略微的修改: lemon@ubuntu:~/uboot_code/myboot$ cat Makefile all:mystart.o mylowlevel_init.o echo "Gritek Lemon!" arm-linux-ld -Tmyuboot.lds -o myuboot $^ arm-linux-objcopy -O binary myuboot myuboot.bin ./get16k.sh mystart.o : mystart.S arm-linux-gcc -c $< mylowlevel_init.o : mylowlevel_init.S arm-linux-gcc -c $< Makefile制作要点六: 模式匹配 所谓模式匹配就是把所有有相同规律的目标,集合成一起,来执行。例如案例中,mystart.o&mylowlevel_init.o都是基于.s文件进行编译而成。 我们可以使用%.o表示所有的.o文件的目标,然后依赖关系写成%.s 那么上面案例的代码可以修改如下: lemon@ubuntu:~/uboot_code/myboot$ cat Makefile all: mystart.o mylowlevel_init.o echo "Gritek Lemon!" arm-linux-ld -Tmyuboot.lds -o myuboot $^ arm-linux-objcopy -O binary myuboot myuboot.bin ./get16k.sh %.o : %.S arm-linux-gcc –o $@ -c $< 调整一下。 all:myuboot %.o : %.S arm-linux-gcc -o $@ -c$< myuboot: mystart.o mylowlevel_init.o myuboot.lds arm-linux-ld-Tmyuboot.lds -o myuboot $^ arm-linux-objcopy -Obinary myuboot myuboot.bin ./get16k.sh |
|
|
|
|
|
Makefile制作要点七: make传参执行其他的目标
这个是为了清除编译生成的文件。 all:myuboot %.o : %.S arm-linux-gcc -o $@ -c $< myuboot: mystart.o mylowlevel_init.o myuboot.lds arm-linux-ld -Tmyuboot.lds -o myuboot $^ arm-linux-objcopy -O binary myuboot myuboot.bin ./get16k.sh clean: rm -f my*.o myuboot myuboot.bin lemon@ubuntu:~/uboot_code/myboot$ ls dd.sh get16k.sh Makefile mkv210 mylowlevel_init.o mylowlevel_init.S mystart.o mystart.S myuboot myuboot.bin myuboot.lds u-boot.16k lemon@ubuntu:~/uboot_code/myboot$ make clean rm -f my*.o myuboot myuboot.bin 我们知道,makefile中默认只是执行第一个目标,其他的目标就要靠传参来实现,上述指令中的make clean就是如此。 补充:Makefile其实还有很多的内容,比如支持shell脚本语言,上面我的代码中就有.sh脚本,但是如果掌握了我写的内容,基本上makefile 80%的内容就能够掌握了,如果需要深入学习,可以参考陈皓老师写的《跟我一起学习写makefile》。 |
|
|
|
|
|
|
|
|
|
|
|
我也在学Linux,好累。
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
「含关键代码」基于AM3352/AM3354/AM3359的Linux开发案例分享
4873 浏览 0 评论
87365 浏览 0 评论
【高手问答】如何做到精通linux技术?资深工程师带你突破难点
4686 浏览 2 评论
3572 浏览 2 评论
解读Linux :先从创建一个文件夹用来存放jdk压缩文件开始
2459 浏览 0 评论
1956浏览 3评论
这是i.mx6ull的关于usb的宏定义,能解释下这些宏定义的意思
1323浏览 1评论
1233浏览 1评论
求解:aarch64交叉编译工具已经安装成功,环境变量已经配置,怎么将系统架构切换为ARM的架构
1301浏览 0评论
电脑和虚拟机可以互ping,电脑和开发板也可以互ping,但是虚拟机和开发板ping不通是什么原因
1215浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-29 05:03 , Processed in 1.184626 second(s), Total 98, Slave 80 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号