16

我想使用这个构建唯一的临时目录。如何在 Makefile 中获取 make 命令的 pid?

我试过了:

TEMPDIR = /tmp/myprog.$$$$

但这似乎存储TEMPDIR/tmp/myprog.$$然后 eval 作为每个引用它的命令的新 pid!我如何为所有这些获得一个 pid(我更喜欢 make pid,但任何独特的都可以)。

提前致谢。

4

6 回答 6

26

尝试使用mktemp创建唯一的临时文件名。该-d选项将创建一个目录而不是文件。

TEMPFILE := $(shell mktemp)
TEMPDIR := $(shell mktemp -d)

注意冒号。(编者注:这会导致 make 对函数进行一次评估并为其赋值,而不是为每个对 $(TEMPDIR) 的引用重新评估表达式。)

于 2010-10-05T00:43:08.773 回答
10
TEMPDIR := $(shell mktemp)

问题是:每次运行 make 时,都会创建一个临时文件。无论您是否使用它,也无论您使用什么 make 目标。这意味着:要么您在每个目标中删除此文件,要么您随时都不会删除它们。

我更喜欢添加 -u 参数:

TEMPDIR := $(shell mktemp -u)

这使得 mktemp 无需创建文件即可创建唯一的文件名。现在您可以在需要它们的目标中创建文件。当然,有可能出现竞争条件,即文件在创建之前被另一个进程使用。这不太可能,但不要在提升的命令中使用它,例如make install.

于 2011-11-10T14:52:02.600 回答
10

make为它启动的每个命令启动一个新的 shell。使用 bash(不检查其他 shell)echo $PPID给出父进程 ID(即 make)。

all: subtarget 
        echo $$PPID
        echo $(shell echo $$PPID)

subtarget:
        echo $$PPID
于 2011-11-10T14:41:18.853 回答
4

这是您的问题的答案,似乎没有人愿意给您:

TEMPDIR := /tmp/myprog.$(shell ps -o ppid $$$$)

当然,这不保证是唯一的。

于 2017-11-19T06:00:24.743 回答
1

您可以使用日期字符串。除非您同时启动多个构建,否则这应该非常接近。

类似于以下内容

pid_standin := $(shell date +%Y-%m-%d_%H-%M-%S)

file: 
    echo $(pid_standin)

$ Make
2010-10-04_21-01-58

更新:如评论中所述,如果您使用 name = val 语法设置变量,则每次使用时都会重新评估它。:= 语法设置它并且不重新评估该值,尽管使用反引号 `` 似乎以某种方式解决了这个问题。您真的想将 $(shell CMD) 构造用于此类内容。

于 2010-10-05T00:43:55.103 回答
-2

此外,您可以像这样获得您的make pid。

PID := $(shell ps | tail -n 6 | head -n 1 | cut -f1 -d' ')

于 2018-03-24T11:57:27.020 回答