1. 为什么得用Makefile
单步命令生成led.bin
[root@cfm880 lesson1]# cd ..
[root@cfm880 Part1]# mkdir lesson3
[root@cfm880 Part1]# cd lesson3
[root@cfm880 lesson3]# chmod 777 ./
[root@cfm880 lesson3]# ls
led.lds led.S Makefile
[root@cfm880 lesson3]# arm-linux-gcc -g -c led.S led.o
[root@cfm880 lesson3]# arm-linux-ld -Tled.lds -o led.elf led.o
[root@cfm880 lesson3]# ls
led.elf led.lds led.o led.S Makefile
[root@cfm880 lesson3]# arm-linux-objcopy -O binary led.elf led.bin
[root@cfm880 lesson3]# ls
led.bin led.elf led.lds led.o led.S Makefile
如果是命令太多,我们不可能手动输入太多命令
我们需要更有效的工具
[root@cfm880 lesson3]# make clean
rm *.o led.elf led.bin
[root@cfm880 lesson3]# make
arm-linux-gcc -g -o led.o -c led.S
arm-linux-ld -Tled.lds -o led.elf led.o
arm-linux-objcopy -O binary led.elf led.bin
[root@cfm880 lesson3]# ls
led.bin led.elf led.lds led.o led.S Makefile
把很多命令合成一个命令
make
需要自己编写Makefile文件完成自动编译
Makefile文件
all: led.o
arm-linux-ld -Tled.lds -o led.elf led.o
arm-linux-objcopy -O binary led.elf led.bin
led.o : led.S
arm-linux-gcc -g -o led.o -c led.S
.PHONY: clean
clean:
rm *.o led.elf led.bin
Makefile规则
Target:prerequisites
Commad #一个tab
目标:依赖
命令
Led.elf: led.o
arm-linux-ld -Tled.lds -o led.elf led.o
伪目标:只有命令没有依赖用.PHONY标明伪目标
clean:
rm *.o led.elf led.bin
arm-linux-gcc -g -o led.o -c led.S
[root@cfm880 lesson3]# ls
led.lds led.o led.S Makefile
[root@cfm880 lesson3]# make
arm-linux-ld -Tled.lds -o led.elf led.o
arm-linux-objcopy -O binary led.elf led.bin
make后没有参数默认第一条命令
变量
App1: app1.o func1.o func2.o
Gcc app1.o func1.o func3.o –o app1
App2: app2.o func1.o func2.o –o app2
使用默认变量
Obj=func1.0 func2.o
App1: app1.o $(obj)
Gcc app1.o $(obj) –o app1
App2:app2.o $(obj)
Gcc app2.o $(obj) –o app2
直接使用系统定义的默认变量
$^:代表所有的依赖文件
$@:代表目标
$<:第一个依赖文件
简化Makefile
all: led.o
arm-linux-ld -Tled.lds -o led.elf $^
arm-linux-objcopy -O binary led.elf led.bin
led.o : led.S
arm-linux-gcc -g -o $@ -c $^
.PHONY: clean
clean:
rm *.o led.elf led.bin
通用规则
led.o : led.S
arm-linux-gcc -g -o $@ -c $^
main.o : main.S
arm-linux-gcc -g -o $@ -c $^
两条规则他们的命令一样,目标与依赖的名字只有后缀名不样
%.o : %.S
arm-linux-gcc -g -o $@ -c $^
可以替换上面两条语句
3. 使用技巧
回显:不需要打印命令
all: led.o
@arm-linux-ld -Tled.lds -o led.elf $^
@arm-linux-objcopy -O binary led.elf led.bin
led.o : led.S
@arm-linux-gcc -g -o $@ -c $^
.PHONY: clean
clean:
rm *.o led.elf led.bin
[root@cfm880 lesson3]# make
[root@cfm880 lesson3]# ls
led.bin led.elf led.lds led.o led.S Makefile
Makefile文件名加 –f 选项
[root@cfm880 lesson3]# mv Makefile file
[root@cfm880 lesson3]# make
make: *** 没有指明目标并且找不到 makefile。 停止。
[root@cfm880 lesson3]# make -f file
[root@cfm880 lesson3]# ls
file led.bin led.elf led.lds led.o led.S