多个文件扩展名的Makefile通配符规则

时间:2016-08-26 04:26:35

标签: makefile gnu-make

我在目录中有许多汇编和C源文件。我已经提到了要编译为C_OBJFILESASM_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用于所有源文件,而不是费心去使用。 (我猜)

1 个答案:

答案 0 :(得分:2)

使用静态模式并将对象拆分为两组,还有许多其他改进

  • 制作已有ASCC等内容的默认值,请使用它们。
  • 您已经正确使用ASFLAGSCFLAGS-c除外,见下文),对其他标志使用相同的模式
  • 您错过了表达bin-&gt; elf依赖性的机会
  • 即使您需要重新定义规则(LINK.oCOMPILE.c已经有-c标志),您也可以回收内置食谱,尽管.c规则目前是多余的,因为它与内置规则完全相同。
  • clean应为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)