makefile中命令的目的

purpose of command in makefile

Makefile 中的这段代码究竟做了什么,有没有办法避免使用它并仍然使代码编译成功?

work-obj93.cf: sources.mk
$(RM) $@
(for i in $(SOURCES); do \
    $(GHDLC) -i $(GHDLFLAGS) $$i; \
done) || ($(RM) $@; exit 1)

work-obj93.cf: sources.mk

第一行告诉“make”文件“work-obj93.cf”依赖于“sources.mk”。如果更改后者,则需要重建前者,如以下行所定义。您的 Makefile 很可能包含“sources.mk”,它定义了 SOURCES.

$(RM) $@

执行的第一个命令删除目标文件。 $(RM) 为您的系统插入适当的真实命令,可能 rm 在您的 OS 上。 $@ 是目标文件的占位符,一个自动生成的变量。

目标文件是 GHDL 的“库”。如果源集发生变化,要进行干净的构建,似乎应该删除并重建此文件。

(for i in $(SOURCES); do $(GHDLC) -i $(GHDLFLAGS) $$i; done) || ($(RM) $@; exit 1)

第二条规则使用“import option”调用 GHDL 来解析所有源并将其添加到其库中。

第一部分 for i in $(SOURCES); do ...; done 遍历 SOURCES 中给出的所有文件。循环命令 $(GHDLC) -i $(GHDLFLAGS) $$i 调用 GHDL。如果 GHDL 发现错误,它会 returns 和 shell ((...) || ($(RM) $@; exit 1)) 使用的非零值来删除目标文件(库)并停止构建。 编辑: 正如 HardcoreHenry 指出的那样,这是一个错误,因为循环遍历所有源;仅当最后一次调用 GHDL returns 错误代码时,才会发生反应。


此规则是否必要由您决定。您可能想阅读 GHDL 的文档,并做一些实验,如果删除规则仍然可以在所有情况下提供正确的构建。尝试在“sources.mk”中添加一个新的源文件,重命名一个源文件,或者删除一些源文件,当然不会引入 VHDL 错误。