如何在 makefile 中获取 cd 后的工作目录?

How do get the working directory after a cd in a makefile?

我只需要能够将 cd 之后的 pwd 的值分配给一个变量,这样我就可以在我的网络浏览器中打开一个文件,但我似乎无法弄清楚如何在 Makefile 中做到这一点。有趣的是,当搜索关于想要在 cd 之后获取当前-运行ning Makefile 目录的人的其他答案时(与我想要做的相反,这是获取实际的当前工作目录,而不管Makefile 是),执行他们所说的在 cd 之后不起作用的事情似乎仍然指向 Makefile,而不是我 cd 进入的目录。

我 运行在 Mac OS 10.15 上安装 GNU Make 3.81,如果这很重要的话。

这是我的目录设置:

whatever/
|
├── foo/
│    ├── Makefile
│    └── make_a_file.py
└── bar/
     └── Makefile

make_a_file.py 生成 output.txt。 make_a_file.py 可以从 /foo/Makefile 通过 make bizz 变成 运行,结果是:

whatever/
|
├── foo/
│    ├── Makefile
│    ├── make_a_file.py
│    └── output.txt
└── bar/
     └── Makefile

如果我手动将 output.txt 复制到 bar 目录,以及 运行 /bar/Makefile 的 make html,我最终会得到一个 html 文件栏,即

whatever/
|
├── foo/
│    ├── Makefile
│    ├── make_a_file.py
│    └── output.txt
└── bar/
     ├── Makefile
     ├── output.txt
     └── output.html

我的问题是我想在我的网络浏览器中使用 /foo/Makefile 打开 output.html,但我似乎无法获得 absolute 路径/bar/output.html,所以我不能调用 python -mwebbrowser file:///$(WHATEVER)/bar/output.htmlpython -mwebbrowser file:///$(FULLPATH)/output.html 之类的东西。我不想硬编码绝对路径;我只能指望 bar/ 和 foo/ 不会更改它们的名称,不一定是它们上面的任何名称。

这就是 /foo/Makefile 目前的样子。

bizz:
    python make_a_file.py

compile:
    cp outputs/outfile.txt ../bar/output.txt
    cd ../bar/; \
    echo "$(PWD)"; \
    echo "$(shell pwd)"; \
    echo "$(CURDIR)"; \
    make html; \
    python -mwebbrowser file:///$(CURDIR)/_build/html/output.html

当我 运行 来自 foo/:

(venv) foo user$ make compile
cp output.txt ../bar/output.txt
cd ../bar/; \
    echo "/whatever/foo"; \
    echo "/whatever/foo"; \
    echo "/whatever/foo"; \
    make html; \
    python -mwebbrowser file:////whatever/foo/output.html
/whatever/foo
/whatever/foo
/whatever/foo
Running Sphinx v4.4.0
[and other miscellaneous output from the makefile in bar]
build succeeded.

0:85: execution error: File some object wasn’t found. (-43)

我知道 cd 一定起作用了,并且 make html 必须在与 cd 相同的子 shell 中执行,因为 make html 不先进入 bar 就无法工作。然而,所有的回声你会相信你还在 foo 中。

这是怎么回事?有没有办法在不对绝对路径进行硬编码的情况下解决这个问题?

在执行 shell 命令之前,您尝试过的所有方法都由 make 评估。您需要编写一个 shell 命令来输出当前目录,该命令在 cd.

之后执行

最简单的选项是pwd:

compile:
    cp outputs/outfile.txt ../bar/output.txt
    cd ../bar/; \
    pwd; \
    make html; \
    python -mwebbrowser file:///$$(pwd)/_build/html/output.html

或者,您可以通过转义 $ 来延迟 $PWD 的评估,以便 shell 评估它而不是 make:

compile:
    cp outputs/outfile.txt ../bar/output.txt
    cd ../bar/; \
    echo $$PWD; \
    make html; \
    python -mwebbrowser file:///$$PWD/_build/html/output.html