《跟我一起写Makefile》读书笔记

  • 第二章 关于程序的编译和链接

编译时,编译器检查语法,函数和变量是否被声明。编译器把源文件(.c)编译成中间代码文件(.o)。

链接时,链接器链接函数和全局变量。链接器会在所有的obj中找寻函数的实现。

  • 第三章 Makefile介绍

一,Makefile的规则

target ... :prerequisites ...

          command

          ...

          ...

prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则,也就是Makefile中最核心的内容。

三,make是如何工作的

make会一层又一层的去找文件的依赖关系,直到最终编译出第一个目标文件。make只管文件的依赖性。

demo.hex: demo.axf
	fromelf --i32 --output demo.hex demo.axf	


main.o: command.h main.c 
	armcc -c --cpu Cortex-M3 -g -O0 --apcs=interwork main.c    -o main.o
command.o: command.c 
	armcc -c --cpu Cortex-M3 -g -O0 --apcs=interwork command.c -o command.o
startup.o: startup.s
	armasm   --cpu Cortex-M3 -g     --apcs=interwork startup.s -o startup.o
demo.axf: main.o command.o startup.o   
	armlink --cpu Cortex-M3 *.o --strict --scatter "demo.sct" \
	        --summary_stderr --info summarysizes --map --xref --callgraph --symbols \
			--info sizes --info totals --info unused --info veneers \
			--list ".\demo.map" \
			-o demo.axf



clean:
	rm demo.axf main.o startup.o command.o demo.htm demo.map 

四,makefile中使用变量

objects = main.o command.o startup.o
	

demo.hex: demo.axf
	fromelf --i32 --output demo.hex demo.axf	


main.o: command.h main.c 
	armcc -c --cpu Cortex-M3 -g -O0 --apcs=interwork main.c    -o main.o
command.o: command.c 
	armcc -c --cpu Cortex-M3 -g -O0 --apcs=interwork command.c -o command.o
startup.o: startup.s
	armasm   --cpu Cortex-M3 -g     --apcs=interwork startup.s -o startup.o
demo.axf: $(objects)   
	armlink --cpu Cortex-M3 *.o --strict --scatter "demo.sct" \
	        --summary_stderr --info summarysizes --map --xref --callgraph --symbols \
			--info sizes --info totals --info unused --info veneers \
			--list ".\demo.map" \
			-o demo.axf



clean:
	rm $(objects) demo.axf demo.htm demo.map 

五,让make自动推导

只要make看到一个.o文件,它就会地总的把.c文件加在依赖关系中。比如make找到一个whatever.o,那么whatever.c就会是whatever.o的依赖文件。

六,另类风格的makefile

objects = main.o command.o startup.o
	

demo.hex: demo.axf
	fromelf --i32 --output demo.hex demo.axf	


main.o command.o: command.h main.c  command.c 
	armcc -c --cpu Cortex-M3 -g -O0 --apcs=interwork main.c  command.c  -o main.o command.o
startup.o: startup.s
	armasm   --cpu Cortex-M3 -g     --apcs=interwork startup.s -o startup.o
demo.axf: $(objects)   
	armlink --cpu Cortex-M3 *.o --strict --scatter "demo.sct" \
	        --summary_stderr --info summarysizes --map --xref --callgraph --symbols \
			--info sizes --info totals --info unused --info veneers \
			--list ".\demo.map" \
			-o demo.axf



clean:
	rm $(objects) demo.axf demo.htm demo.map 

七,清空目标文件的规则

一般风格

     clean:

             rm edit $(objects)

更为稳健的做法是:

            .PHONY: clean

            clean: 

                    -rm edit $(objects)

  • 第四章 Makefile总述

Makefile里主要包含了五个东西:显示规则/隐晦规则/变量定义/文件指示/注释。

其中文件指示包括三个部分:一个是在Makefile中引用另一个Makefile(类似C语言的include);另一个是指根据某些情况制定Makefile的有效部分(类似C语言的#if);还有一个是定义一个多行的命令(这里先不讲)。

  • 第五章,书写规则

规则包含两个部分,一个是依赖关系,一个是生成目标的方法。

规则举例

foo.o : foo.c defs.h          # foo模块 
            cc -c -g foo.c

在规则中使用通配符

如果我们想定义一系列比较类似的文件,我们很自然地就想起使用通配符。make支持三种通配符 * ? [...]

波浪号~字符在文件名种也有比较特殊的用途。


#objects = main.o command.o startup.o
	
objects := $(patsubst %.c,%.o,$(wildcard *.c)) 
objects += $(patsubst %.s,%.o,$(wildcard *.s)) 
$(warning $(objects))


demo.hex: demo.axf
	fromelf --i32 --output demo.hex demo.axf	


#main.o: command.h main.c o
#	armcc -c --cpu Cortex-M3 -g -O0 --apcs=interwork main.c    -o main.o
#command.o: command.c 
#	armcc -c --cpu Cortex-M3 -g -O0 --apcs=interwork command.c -o command.o


%.o:%.c
	armcc -c --cpu Cortex-M3 -g -O0 --apcs=interwork $< -o $@


#startup.o: startup.s
#	armasm   --cpu Cortex-M3 -g     --apcs=interwork startup.s -o startup.o

%.o:%.s 
	armasm   --cpu Cortex-M3 -g     --apcs=interwork $< -o $@ 
demo.axf: $(objects)   
	armlink --cpu Cortex-M3 *.o --strict --scatter "demo.sct" \
	        --summary_stderr --info summarysizes --map --xref --callgraph --symbols \
			--info sizes --info totals --info unused --info veneers \
			--list ".\demo.map" \
			-o demo.axf


.PHONY:clean 
clean:
	-rm $(objects) demo.axf demo.htm demo.map 

第七章,使用变量

变量的基础

变量在声明时需要给予初值,而在使用时,需要给在变量名前加上$符号,单最好用小括号()或大括号{}把变量给包括起来。变量会在使用它的地方精确的展开,就像C种的宏一样。

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值