制作-将规则应用于动态创建的文件

时间:2018-11-17 04:12:14

标签: makefile gnu-make

我有以下规则:

%.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规则将被忽略,而选择了隐式规则...那么(如果有的话)什么是解决此问题的标准方法。

1 个答案:

答案 0 :(得分:2)

它被忽略,因为它没有构建正确的文件。

文件vector.Ssrc/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 > $@
相关问题