我使用 Makefile 编译了一个项目。不知何故(在阅读了大量有关 Makefile 的内容后),我无法解决以下问题:
我有一个主文件edu.tex
和一个文件edu-tut.tex
,该文件被导入edu.tex
使用\input{edu-tut.tex}
。因此edu.pdf
取决于edu.tex
和edu-tut.tex
。
如果edu-tut.tex
编辑了,则会调用子目录中的另一个 Makefile doc/
,从而创建许多图形。
总而言之,如果我想构建,它应该这样工作edu.pdf
:
edu.tex
编辑:编译edu.tex
edu-tut.tex
编辑:调用里面的 Makefiledoc/
然后编译edu.tex
这是我当前状态的摘录,但它不起作用:
all: edu.pdf
edu.pdf: edu-tut.tex edu.tex
[build edu.pdf -- this works!]
edu-tut.tex:
make -C doc/
我希望这是可以理解的。我对 Makefile 还只是门外汉……
答案1
以下(未经测试的)运行戳文件的使用对我来说看起来很简单:
# Either some file(s) generated by "make -C doc" or some run-stamp file
EXFIGS = doc/exfigs.done
all: edu.pdf
edu.pdf: edu-tut.tex edu.tex $(EXFIGS)
# Your build commands go here
$(EXFIGS): edu-tut.tex
$(MAKE) -C doc/
# If the above does not actually create $(EXFIGS), add:
touch $(EXFIGS)
笔记:
- 如果复制粘贴上述内容,请确保缩进是用制表符完成的。
$(EXFIGS)
应该是真实文件,所以不要将它们标记为.PHONY
。
答案2
在我发布问题的第二天(@ccorn 回答之前),我做了一些与这个问题相关的测试。我想我找到了另一个(相当简单的)解决方案。
这个想法是检查edu.cls
内部的依赖关系doc/Makefile
:
/ (根目录)中的 Makefile
all: edu.pdf
edu.pdf: edu-tut.tex edu.tex
[build stuff ...]
make -C doc/
[build stuff ...]
/doc 中的 Makefile
%.pdf: ../edu-tut.tex
[build stuff]
这似乎也有效。