Makefile的当前工作目录

13

我有以下目录结构

project
|-- Makefile
|-- data
    |-- report.tex
    |-- plot_1.eps

Makefile中的一条规则执行latex data/report.tex。由于工作目录是project,我只能在那里获取report.dvi和其他输出文件。如何将它们获取到./data

此外,我已经在报告中包含了plot_1.eps。但它仍然希望路径为data/plot_1.eps。我们需要相对于当前工作目录来提供文件路径吗?还是相对于执行latex的位置以及report.tex的位置?

Makefile中,我尝试了

reportdvi: outputparser
        cd data
        latex report.tex
        cd ..

但这并没有改变工作目录,问题仍然存在。该怎么办?


1
可能是如何在Makefile中编写cd命令的重复问题。 - n.st
3个回答

27

在makefile中这是一个常见的坑点。每个命令都在自己的shell中执行,因此“cd”只在该shell中发生作用,而后续命令将再次从make的当前目录中运行。

你需要做的是将所有命令放在一行上(你不需要使用“cd ..”):

cd data && latex report.tex

或者在行末使用 \ ,告诉make将这些行连接起来并传递给shell。请注意,仍然需要使用 ;&& 分隔命令。

cd data && \
latex report.tex

1
latex的输出文件放置位置和期望找到输入文件的问题与make无关。您需要了解如何使latex按照您的要求运行。可能有标志或类似的东西来控制输出位置和查找包含文件的位置。在问题中使用latex标记。
至于更改目录,配方的每个单独行都在不同的shell中运行,因此您不能在一行中更改目录,然后在下一行中生效:工作目录(在UNIX系统中)是当前进程的函数,并且在该进程退出后将丢失。
您想编写类似以下内容的内容:
reportdvi: outputparser
         cd data && latex report.tex

你不需要执行 cd ..,因为正如我所说,工作目录的更改仅对当前命令生效。


1

我遇到了类似的问题,当改变目录后执行程序时,程序对其目录“位置”的视图没有任何作用,然后我发现可以通过以下方法解决:

(cd ../../../yourdir && ./yourprogram.exe parameters) > output &

如果没有括号,那么"yourprogram.exe"仍将把makefile的当前目录作为其目录位置视图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接