使用隐式规则而不是显式?

时间:2015-03-07 20:46:55

标签: makefile gnu-make

这是我的整个Makefile:

TGT = call
OBJS = main.o

.PHONY : clean

$(TGT) : $(OBJS)
        $(CC) -o $@ $^

%.o : %.s
        $(AS) -o $@ $<

%.s : %.c
        $(CC) -S -o $@ $<

clean :
        $(RM) $(TGT) *.o *.s

当我跑步时,我在期待:

  • main.s从main.c构建
  • main.o从main.s构建。
  • 调用是从main.o
  • 构建的

相反,正在做的是:

$ make
cc    -c -o main.o main.c
cc -o call main.o

为什么它使用* .o文件的隐式规则而不是我指定的显式规则?请注意,如果我首先手动创建* .s文件,它将使用我的显式规则:

$ make main.s
cc -S -o main.s main.c
$ make
as -o main.o main.s
cc -o call main.o

我是否只是从根本上误解了Make的某些内容?难道它不应该认识到main.s是main.o的先决条件,并使用我指定的规则构建main.s?

1 个答案:

答案 0 :(得分:0)

您可以通过为后缀目标设置空值来禁用所有内置后缀规则:

.SUFFIXES:

然后设置自己的后缀:

.SUFFIXES: .o .s

使用标志 -r - no-builtin-rules 运行make也应该这样做。见here