13

我有以下目录结构

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

Makefileexecutes中的规则之一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 ..

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

4

3 回答 3

27

这是 makefile 中常见的“陷阱”。每个命令都在其自己的 shell 中执行,因此“cd”仅在该 shell 中发生,但后续命令将从 make 的当前目录再次运行。

您想要做的是将所有命令放在一行中(并且您不需要“cd ..”):

cd data && latex report.tex

\在行尾使用以告诉 make 连接这些行并将它们全部传递给 shell。请注意,您仍然需要;&&分隔命令。

cd data && \
latex report.tex
于 2013-11-14T19:04:27.513 回答
1

latex 将其输出文件放在哪里以及它期望在哪里找到输入文件的问题与 make 无关。您需要了解如何让乳胶以您想要的方式行事。大概有标志或类似的东西来控制将输出放在哪里以及在哪里找到包含的文件。在您的问题上使用latex标签。

至于更改目录,配方的每一行都在不同的 shell 中运行,因此您不能在一行中更改目录,然后在下一行中生效:工作目录(在 UNIX 系统中)是当前进程的功能,一旦该进程退出就会丢失。

你想写这样的东西:

reportdvi: outputparser
         cd data && latex report.tex

(您不必这样做cd ..,因为正如我所说的工作目录更改仅对当前命令生效)

于 2013-11-14T19:03:53.787 回答
0

有一个类似的问题我发现,在目录更改后执行程序时,它对其目录“位置”的程序视图没有任何作用,然后我发现它可以这样解决:

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

如果没有括号,则“yourprogram.exe”仍将生成文件当前目录作为其目录位置视图。

于 2014-05-21T19:47:55.423 回答