Makefile目标匹配

时间:2011-09-15 12:46:23

标签: makefile gnu-make

我的Makefile遇到了麻烦: - (

我需要将汇编和C源代码混合在一起。我需要针对这两种类型的不同构建指令。由于汇编程序和C编译器输出* .o文件,我不能使用示例Makefiles中常见的%.o:%。c构造

这就是我现在正在尝试的事情:

获取所有C文件及其生成的输出文件的列表:

C_SRCFILES := $(shell find $(SRCDIRS) -type -f -name "*.c")
C_OBJFILES := $(patsub %.c,%.o,$(C_SRCFILES))

获取所有asm文件及其生成的输出文件的列表:

A_SRCFILES := $(shell find $(SRCDIRS) -type -f -name "*.asm")
A_OBJFILES := $(patsub %.asm,%.o,$(A_SRCFILES))

当我将这些变量回显到屏幕时,它们似乎是正确的,但我现在如何定义目标?

我试过这样的事情

$(A_OBJFILES): ($A_SRCFILES)
  $(AS) $(AFLAGS) -o $@  $*

$(C_OBJFILES): ($C_SRCFILES)
  $(CC) $(CFLAGS) -c -o $@ $*

all: $(A_OBJFILES) $(C_OBJFILES)
  $(LD) $(LDFLAGS) $(A_OBJFILES) $(C_OBJFILES) -o $(TARGET_OUTPUT)

但是当然,这不起作用......

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

第一个问题:错误的括号或两个。

$(A_OBJFILES): ($A_SRCFILES)

请注意$中的(内有($A_SRCFILES)。扩展$A,这是什么都没有,事情发生了变化。我认为你的意思是$(A_SRCFILES),而另一个规则也是如此。

第二个问题:我不知道汇编程序的语法,但编译器命令的语法错误:

$(CC) $(CFLAGS) -c -o $@ $*

如果我们不在模式规则中,那么变量$*就没有了,我们还没有。无论如何,如果我们处于模式规则中并且您尝试构建foo.o,则此命令将查找源文件foo,并且没有此类文件。这样做:

$(CC) $(CFLAGS) -c -o $@ $<

第三个问题:每个目标文件都依赖于所有源文件(在每个规则中)。试试这个:

$(A_OBJFILES): %.o : %.asm
    ...

$(C_OBJFILES): %.o : %.c
    ...

现在这是一种模式规则。)

第四个问题:最后一条规则中有很多冗余。将其更改为:

all: $(A_OBJFILES) $(C_OBJFILES)
    $(LD) $(LDFLAGS) $^ -o $(TARGET_OUTPUT)

或更好:

all: $(TARGET_OUTPUT)

$(TARGET_OUTPUT): $(A_OBJFILES) $(C_OBJFILES)
    $(LD) $(LDFLAGS) $^ -o $@

答案 1 :(得分:2)

  

由于汇编程序和C编译器输出* .o文件,我不能使用示例Makefiles中常见的%.o:%。c构造

当然可以:

%.o : %.c
    # commands to make .o from a corresponding .c

%.o : %.asm
    # commands to make .o from a corresponding .asm