使用 Makefile 强制编译依赖项

使用 Makefile 强制编译依赖项

我使用 Makefile 编译了一个项目。不知何故(在阅读了大量有关 Makefile 的内容后),我无法解决以下问题:

我有一个主文件edu.tex和一个文件edu-tut.tex,该文件被导入edu.tex使用\input{edu-tut.tex}。因此edu.pdf取决于edu.texedu-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)

笔记:

  1. 如果复制粘贴上述内容,请确保缩进是用制表符完成的。
  2. $(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]

这似乎也有效。

相关内容