1 编写 Makefile
-
第 4 行是使用 arm-linux-gnueabihf-ld 进行链接,链接起始地址是 0X87800000,但是这一行用到了自动变量“^”的意思是所有依赖文件的集合,在这里就是 objs 这个变量的值:start.o 和 main.o。链接的时候 start.o 要链接到最前面
objs := start.o main.o ledc.bin:$(objs) -
arm-linux-gnueabihf-ld -Ttext 0X87800000 -o ledc.elf $^
-
arm-linux-gnueabihf-ld -Ttext 0X87800000 -o ledc.elf start.o main.o -
第 5 行使用 arm-linux-gnueabihf-objcopy 来将 ledc.elf 文件转为 ledc.bin,本行也用到了自动变量“@”的意思是目标集合,在这里就是“ledc.bin”,那么本行就相当于:
-
arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@
-
arm-linux-gnueabihf-objcopy -O binary -S ledc.elf ledc.bin -
第 9 行就是具体的命令,这行也用到了自动变量“<”,其中“$<”的意思是依赖目标集合的第一个文件。比如start.s 要编译成 start.o 的话第 8 行和第 9 行就相当于:
-
start.o:start.s
-
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o start.o start.s
1.1 Makefile完整工程
```
1 objs := start.o main.o
2
3 ledc.bin:$(objs)
4 arm-linux-gnueabihf-ld -Ttext 0X87800000 -o ledc.elf $^
5 arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@
6 arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis
7
8 %.o:%.s
9 arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
10
11 %.o:%.S
12 arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
13
14 %.o:%.c
15 arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
16
17 clean:
18 rm -rf *.o ledc.bin ledc.elf ledc.dis
```
2 工程化编写 Makefile
-
项目工程化管理
-
Makefile静态模式语法
-
模式字符串替换函数
2.1 脚本详细分析
2.2 工程化完整脚本
1 CROSS_COMPILE ?= arm-linux-gnueabihf-
2 TARGET ?= bsp
3
4 CC := $(CROSS_COMPILE)gcc
5 LD := $(CROSS_COMPILE)ld
6 OBJCOPY := $(CROSS_COMPILE)objcopy
7 OBJDUMP := $(CROSS_COMPILE)objdump
8
9 INCDIRS := imx6ul \
10 bsp/clk \
11 bsp/led \
12 bsp/delay
13
14 SRCDIRS := project \
15 bsp/clk \
16 bsp/led \
17 bsp/delay
18
19 INCLUDE := $(patsubst %, -I %, $(INCDIRS)) //INCLUDE := -I imx6ul -I bsp/clk -I bsp/led -I bsp/delay
20
21 SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S)) //SFILES := project/start.S
22 CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
23
24 SFILENDIR := $(notdir $(SFILES))
25 CFILENDIR := $(notdir $(CFILES))
26
27 SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o)) //COBJS = obj/main.o obj/bsp_clk.o obj/bsp_led.o obj/bsp_delay.o
28 COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
29 OBJS := $(SOBJS) $(COBJS)
30
31 VPATH := $(SRCDIRS)
32
33 .PHONY: clean
34
35 $(TARGET).bin : $(OBJS)
36 $(LD) -Timx6ul.lds -o $(TARGET).elf $^
37 $(OBJCOPY) -O binary -S $(TARGET).elf $@
38 $(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis
39
40 $(SOBJS) : obj/%.o : %.S
41 $(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
42
43 $(COBJS) : obj/%.o : %.c
44 $(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
45
46 clean:
47 rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)