我有以下规则:
%.o: $(SRCDIR)%.S
$(CC) $(ASFLAGS) -c $< -o $(BINDIR)$@
它很好用,除了动态创建源文件vectors.S
之一的情况之外。在运行以下规则之前,该文件不存在:
vectors.S: $(SRCDIR)vectors.pl
$(SRCDIR)vectors.pl > $(SRCDIR)vectors.S
该规则创建文件src/vectors.S
。为什么以前的规则没有应用到这个新文件? (改为使用默认的隐式规则)。我该怎么做才能使其适用?
作为参考,以下是Makefile输出的示例:
gcc -m32 -gdwarf-2 -Wa,-divide -c src/swtch.S -o bin/swtch.o
gcc -m32 -gdwarf-2 -Wa,-divide -c src/trapasm.S -o bin/trapasm.o
src/vectors.pl > src/vectors.S
gcc -m32 -gdwarf-2 -Wa,-divide -c -o vectors.o vectors.S
gcc: error: vectors.S: No such file or directory
gcc: fatal error: no input files
compilation terminated.
make: *** [vectors.o] Error 4
-更新-
我通过为vectors.o
指定显式规则使它起作用:
vectors.o: vectors.S
$(CC) $(ASFLAGS) -c $(SRCDIR)$< -o $(BINDIR)$@
我仍然很好奇为什么,自定义%.o: $(SRCDIR)%.S
规则将被忽略,而选择了隐式规则...那么(如果有的话)什么是解决此问题的标准方法。
答案 0 :(得分:2)
它被忽略,因为它没有构建正确的文件。
文件vector.S
与src/vector.S
不同。您已经要求make通过列出src/vector.S
作为先决条件来进行构建,并且您定义了一条规则,该规则告诉make如何构建vector.S
,但是该规则无济于事,因为这不是您要使用的文件要建造。
Makefile的第二条规则说,配方应该总是更新您告诉它可以达到的目标,即$@
。如果您的食谱更新的内容不只是完全$@
,那是错误的。
因此,您希望自己的规则是这样:
$(BINDIR)%.o: $(SRCDIR)%.S
$(CC) $(ASFLAGS) -c $< -o $@
$(SRCDIR)vectors.S: $(SRCDIR)vectors.pl
$(SRCDIR)vectors.pl > $@