1.3 Makefile 工程管理

时间:2023-03-08 17:11:51

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