我想使用这个构建唯一的临时目录。如何在 Makefile 中获取 make 命令的 pid?
我试过了:
TEMPDIR = /tmp/myprog.$$$$
但这似乎存储TEMPDIR
为/tmp/myprog.$$
然后 eval 作为每个引用它的命令的新 pid!我如何为所有这些获得一个 pid(我更喜欢 make pid,但任何独特的都可以)。
提前致谢。
我想使用这个构建唯一的临时目录。如何在 Makefile 中获取 make 命令的 pid?
我试过了:
TEMPDIR = /tmp/myprog.$$$$
但这似乎存储TEMPDIR
为/tmp/myprog.$$
然后 eval 作为每个引用它的命令的新 pid!我如何为所有这些获得一个 pid(我更喜欢 make pid,但任何独特的都可以)。
提前致谢。
尝试使用mktemp创建唯一的临时文件名。该-d
选项将创建一个目录而不是文件。
TEMPFILE := $(shell mktemp)
TEMPDIR := $(shell mktemp -d)
注意冒号。(编者注:这会导致 make 对函数进行一次评估并为其赋值,而不是为每个对 $(TEMPDIR) 的引用重新评估表达式。)
TEMPDIR := $(shell mktemp)
问题是:每次运行 make 时,都会创建一个临时文件。无论您是否使用它,也无论您使用什么 make 目标。这意味着:要么您在每个目标中删除此文件,要么您随时都不会删除它们。
我更喜欢添加 -u 参数:
TEMPDIR := $(shell mktemp -u)
这使得 mktemp 无需创建文件即可创建唯一的文件名。现在您可以在需要它们的目标中创建文件。当然,有可能出现竞争条件,即文件在创建之前被另一个进程使用。这不太可能,但不要在提升的命令中使用它,例如make install
.
make
为它启动的每个命令启动一个新的 shell。使用 bash(不检查其他 shell)echo $PPID
给出父进程 ID(即 make)。
all: subtarget
echo $$PPID
echo $(shell echo $$PPID)
subtarget:
echo $$PPID
这是您的问题的答案,似乎没有人愿意给您:
TEMPDIR := /tmp/myprog.$(shell ps -o ppid $$$$)
当然,这不保证是唯一的。
您可以使用日期字符串。除非您同时启动多个构建,否则这应该非常接近。
类似于以下内容
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) 构造用于此类内容。
此外,您可以像这样获得您的make pid。
PID := $(shell ps | tail -n 6 | head -n 1 | cut -f1 -d' ')