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

问题描述 投票:0回答:1

我有以下规则:

%.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规则并选择隐式选择......以及解决此问题的标准方法是什么(如果有的话)。

makefile gnu-make
1个回答
2
投票

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

文件vector.Ssrc/vector.S不是同一个文件。你已经要求make通过将它列为先决条件来构建src/vector.S,并且你已经定义了一个规则来告诉如何构建vector.S,但是该规则没有用,因为那不是你想要构建的文件。

Makefile的第二条规则说,配方应该总是更新你告诉它的目标,即$@。如果你的食谱更新的东西不仅仅是$@,那就错了。

所以,你希望你的规则是这样的:

$(BINDIR)%.o: $(SRCDIR)%.S
        $(CC) $(ASFLAGS) -c $< -o $@

$(SRCDIR)vectors.S: $(SRCDIR)vectors.pl
        $(SRCDIR)vectors.pl > $@
© www.soinside.com 2019 - 2024. All rights reserved.