Make - 将规则应用于动态创建的文件
Make - Apply rule to a dynamically created file
我有以下规则:
%.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
规则被忽略而隐含的规则被选择...以及解决问题的标准方法是什么(如果有的话)这个。
它被忽略了,因为它没有构建正确的文件。
文件 vector.S
与 src/vector.S
不是同一个文件。您已通过将 src/vector.S
列为先决条件来要求 make 构建 src/vector.S
,并且您已经定义了告诉 make 如何构建 vector.S
的规则,但该规则对 make 毫无用处,因为那不是您要创建的文件想要建造。
Makefile 的第二条规则说,配方应该始终更新您告诉它的目标,即 $@
。如果您的食谱更新的内容不完全是 $@
,那就错了。
那么,您希望您的规则是这样的:
$(BINDIR)%.o: $(SRCDIR)%.S
$(CC) $(ASFLAGS) -c $< -o $@
$(SRCDIR)vectors.S: $(SRCDIR)vectors.pl
$(SRCDIR)vectors.pl > $@
我有以下规则:
%.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
规则被忽略而隐含的规则被选择...以及解决问题的标准方法是什么(如果有的话)这个。
它被忽略了,因为它没有构建正确的文件。
文件 vector.S
与 src/vector.S
不是同一个文件。您已通过将 src/vector.S
列为先决条件来要求 make 构建 src/vector.S
,并且您已经定义了告诉 make 如何构建 vector.S
的规则,但该规则对 make 毫无用处,因为那不是您要创建的文件想要建造。
Makefile 的第二条规则说,配方应该始终更新您告诉它的目标,即 $@
。如果您的食谱更新的内容不完全是 $@
,那就错了。
那么,您希望您的规则是这样的:
$(BINDIR)%.o: $(SRCDIR)%.S
$(CC) $(ASFLAGS) -c $< -o $@
$(SRCDIR)vectors.S: $(SRCDIR)vectors.pl
$(SRCDIR)vectors.pl > $@