原理:
1.b:E F
2.a:b c
生成 a:需要依赖于 b和c ,但是生成b需要依赖 E F 层层递归依赖到最后最基础的那个文件最终生成 a,生成时候执行gcc相关的指令(这部分做成通配规则)
文件内容:
#宏替换
CROSS_COMPILE=logic33-elf-
CC=$(CROSS_COMPILE)gcc
AS=$(CROSS_COMPILE)as
LD=$(CROSS_COMPILE)ld
SIZE=$(CROSS_COMPILE)size
OBJCOPY=$(CROSS_COMPILE)objcopy
OBJDUMP=$(CROSS_COMPILE)objdump
#GCC指令的配置参数
SIM=l33-sim
#RUN_CIRCLES=-c 10
#Gcc 配置参数
CFLAGS += -msoft-mul
LDFLAGS += -msoft-mul
LDFLAGS += -nostartfiles
LDSCRIPT = -T linker.ld
#宏 BUILD_DIR 替换build
BUILD_DIR=build/
# app
C_SRC += $(notdir ./main.c)
C_SRC += $(notdir ./uart.c)
CFLAGS += $(addprefix -I,$(INCDIR))
# C_SRC:%.c 的所有.c文件替换成 build/%.o
COBJS = $(C_SRC:%.c=$(BUILD_DIR)%.o)
# Assembly source file
ASM_SRC += crt0.S
#ASM_SRC += ttt.S
AOBJS = $(ASM_SRC:%.S=$(BUILD_DIR)%.o)
ifdef OPT
CFLAGS += -O$(OPT)
else
CFLAGS += -O2
endif
#输出a.bin 需要依赖rom.data 和ram.data
all: a.bin rom.data ram.data
a.out: $(AOBJS) $(COBJS)
$(CC) $(LDFLAGS) -o a.out $^ -Wl,-Map=app.map $(LDSCRIPT)
a.bin: a.out
$(OBJCOPY) -O binary $< $@
#通配规则
#%.data 输出依赖于%.bin 执行bin2V 指令
%.data: %.bin
bin2v $< > $@
#rom.bin 输出依赖于a.out 执行objcopy指令生成 $< $@ '$<'(单个输入) '$@'(目标输出)
rom.bin: a.out
$(OBJCOPY) -j.text -O binary $< $@
#objcopy -j.text -O binary $< $@
ram.bin: a.out
$(OBJCOPY) -j.data -O binary $< $@
size: a.out
$(SIZE) $<
#通配规则
$(BUILD_DIR)%.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
$(BUILD_DIR)%.o: %.S
#gcc -c -o %.o %.S 通过Gcc -c - o 将%.S文件 生成%.o文件
$(CC) -c -o $@ $<
#通用的规则
%.s: %.c
#gcc -xxx -xx -S %.c 输出:%.s
$(CC) $(CFLAGS) -S $<
tags:
ctags -R
sim: a.bin
$(SIM) -bin a.bin -kbd-en $(RUN_CIRCLES)
simd: a.bin
$(SIM) -bin a.bin -kbd-en -d $(RUN_CIRCLES)
dis: a.out
$(OBJDUMP) -D a.out
clean:
$(RM) -rf $(BUILD_DIR)*.o a.out *.map *.o tags *.bin dis.txt *.data *.mif dis.txt
.PHONY: all sim simd dis tags clean