【问题标题】:Current working directory of makefilemakefile 的当前工作目录
【发布时间】:2013-11-27 22:51:21
【问题描述】:
我有以下目录结构
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 ..
但这并没有改变工作目录,问题仍然存在。怎么办?
【问题讨论】:
标签:
makefile
working-directory
【解决方案1】:
这是 makefile 中常见的“陷阱”。每个命令都在其自己的 shell 中执行,因此“cd”只发生在该 shell 中,但后续命令会从 make 的当前目录再次运行。
您想要做的是将所有命令放在一行中(并且您不需要“cd ..”):
cd data && latex report.tex
或在行尾使用\ 告诉make 连接这些行并将它们全部传递给shell。请注意,您仍然需要; 或&& 来分隔命令。
cd data && \
latex report.tex
【解决方案2】:
latex 将它的输出文件放在哪里以及它期望在哪里找到输入文件的问题与 make 无关。您需要了解如何让 latex 以您想要的方式行事。大概有标志或类似的东西来控制将输出放在哪里以及在哪里找到包含的文件。在您的问题上使用latex 标签。
至于更改目录,配方的每一行都在不同的 shell 中运行,因此您不能在一行中更改目录,然后在下一行中生效:工作目录(在 UNIX 系统中) ) 是当前进程的函数,一旦该进程退出就会丢失。
你想写这样的东西:
reportdvi: outputparser
cd data && latex report.tex
(您不必cd ..,因为正如我所说,工作目录更改仅对当前命令生效)
【解决方案3】:
有一个类似的问题,我发现,在目录改变后执行程序时,它的目录“位置”的程序视图没有做任何事情,然后我发现可以这样解决:
(cd ../../../yourdir && ./yourprogram.exe parameters) > output &
如果没有括号,那么“yourprogram.exe”仍会将makefiles当前目录作为其目录位置视图。