我在目录中有许多汇编和C源文件。我已经提到了要编译为C_OBJFILES
和ASM_OBJFILES
的文件列表。我已将规则添加为
%.o: %.S
$(AS) $(ASFLAGS) -o $@ $<
%.o: %.c
$(CC) $(CFLAGS) -o $@ $<
用于生成目标文件。某些程序集文件的扩展名为.s。有些人有.S和剩余的.asm。有没有办法在单个规则中指定这些不同的扩展名而不是单独的%。o:%。asm和%.o:%。s?
虽然可以通过make之前的简单prename解决,但我想用Makefile探索这些选项。下面是我写的完整Makefile。
ASM_OBJLIST:=startup.o vectors.o lowlevel.o
C_OBJLIST:=test.o
LD_SCRIPT:=test.ld
CROSS_COMPILE:=arm-none-eabi-
AS:=$(CROSS_COMPILE)as
CC:=$(CROSS_COMPILE)gcc
LD:=$(CROSS_COMPILE)ld
OBJCOPY:=$(CROSS_COMPILE)objcopy
CFLAGS:= -c -mcpu=arm926ej-s -g
ASFLAGS:= -mcpu=arm926ej-s -g
BIN_TARGET:=test.bin
$(BIN_TARGET): $(C_OBJLIST) $(ASM_OBJLIST)
$(LD) -T $(LD_SCRIPT) -o $@.elf $^
$(OBJCOPY) -O binary $@.elf $@
%.o: %.S
$(AS) $(ASFLAGS) -o $@ $<
%.o: %.c
$(CC) $(CFLAGS) -o $@ $<
clean:
rm -f *.o *.elf *.bin
如果可以在单个规则中处理多个扩展,我可以将gcc用于所有源文件,而不是费心去使用。 (我猜)
答案 0 :(得分:2)
使用静态模式并将对象拆分为两组,还有许多其他改进
AS
和CC
等内容的默认值,请使用它们。ASFLAGS
和CFLAGS
(-c
除外,见下文),对其他标志使用相同的模式LINK.o
,COMPILE.c
已经有-c
标志),您也可以回收内置食谱,尽管.c
规则目前是多余的,因为它与内置规则完全相同。PHONY
*
的内容,明确删除您负责的文件。我只是使用GCC进行链接,但如果您需要链接LD
,那么您需要更改配方。
ASM_OBJLIST := startup.o
S_OBLIST := vectors.o lowlevel.o
C_OBJLIST := test.o
LD_SCRIPT := test.ld
CROSS_COMPILE := arm-none-eabi-
AS := $(CROSS_COMPILE)$(AS)
CC := $(CROSS_COMPILE)$(CC)
OBJCOPY := $(CROSS_COMPILE)objcopy
CFLAGS := -mcpu=arm926ej-s -g
ASFLAGS := -mcpu=arm926ej-s -g
LDFLAGS := -Wl,-T $(LD_SCRIPT)
OBJFLAGS := -O binary
BIN_TARGET := test.bin
$(BIN_TARGET): $(BIN_TARGET).elf
$(OBJCOPY) $(OBJFLAGS) $< $@
$(BIN_TARGET).elf: $(C_OBJLIST) $(ASM_OBJLIST)
$(LINK.o) $^ $(LDLIBS) -o $@
$(ASM_OBJLIST): %.o: %.asm
$(S_OBJLIST): %.o: %.S
$(ASM_OBJLIST) $(S_OBJLIST):
$(COMPILE.S) -o $@ $<
%.o: %.c
$(COMPILE.c) -o $@ $<
.PHONY: clean
clean:
$(RM) $(C_OBJLIST) $(ASM_OBJLIST) $(BIN_TARGET).elf $(BIN_TARGET)