我想使用一个临时目录,这个版本将是唯一的。我怎样才能在Makefile中获得make命令的pid?如何在Makefile中获得make命令的pid?
我想:
TEMPDIR = /tmp/myprog.$$$$
但这似乎存储TEMPDIR
为/tmp/myprog.$$
然后EVAL作为其参考文献该每一个命令一个新的PID!我如何得到所有人的一个pid(我更喜欢make pid,但任何独特的都可以)。
在此先感谢。
我想使用一个临时目录,这个版本将是唯一的。我怎样才能在Makefile中获得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)的引用的表达式。)
您可以使用日期字符串。除非你在同一时间开始多个构建,否则应该非常接近。
像下面
pid_standin := $(shell date +%Y-%m-%d_%H-%M-%S)
file:
echo $(pid_standin)
$ Make
2010-10-04_21-01-58
更新:正如评论指出,如果你设定名称的变量= VAL语法是re-evaluated each time it's used。 :=语法设置它并且不重新评估该值,尽管使用back-ticks似乎可以解决这个问题。你真的想为这样的东西使用$(shell CMD)构造。
这不起作用。它每次使用$(pid_standin)时都会传递'date ...',因此会创建不同的目录。 – sligocki 2010-10-05 00:50:33
显示当我尝试一个简单的测试用例时发生了什么,用修正更新了问题 – 2010-10-05 12:59:21
make
为每个启动的命令启动一个新的shell。使用bash(没有检查其他shell)echo $PPID
给出了父进程ID(这是make)。
all: subtarget
echo $$PPID
echo $(shell echo $$PPID)
subtarget:
echo $$PPID
TEMPDIR := $(shell mktemp)
的问题是:每次运行时做,它会创建一个临时文件。不管你是否使用它,也不管你使用的目标是什么。这意味着:要么在每个目标中删除此文件,要么您不会随时删除它们。
我宁愿加-u参数:
TEMPDIR := $(shell mktemp -u)
这使得mktemp的不创建文件来创建一个唯一的文件名。现在您可以在需要它们的目标中创建文件。当然,有一个竞争条件的机会,在创建它之前该文件被另一个进程使用。这是不太可能的,但不要使用它在一个提升的命令,如make install
。
这里是回答你的问题,这似乎没有人想给你:
TEMPDIR := /tmp/myprog.$(shell echo $$$$)
当然,这是不能保证是唯一的。
原始问题:如何在Makefile中获取进程ID。如果有人知道,我很乐意回答。但是,这解决了我的根本问题。 – sligocki 2011-11-09 21:32:48