2010-10-05 32 views
13

我想使用一个临时目录,这个版本将是唯一的。我怎样才能在Makefile中获得make命令的pid?如何在Makefile中获得make命令的pid?

我想:

TEMPDIR = /tmp/myprog.$$$$ 

但这似乎存储TEMPDIR/tmp/myprog.$$然后EVAL作为其参考文献该每一个命令一个新的PID!我如何得到所有人的一个pid(我更喜欢make pid,但任何独特的都可以)。

在此先感谢。

+1

原始问题:如何在Makefile中获取进程ID。如果有人知道,我很乐意回答。但是,这解决了我的根本问题。 – sligocki 2011-11-09 21:32:48

回答

25

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

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

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

+0

谢谢,这看起来很不错。我对Makefile语法比较陌生,如何使用shell命令(mktemp)定义变量(TEMPDIR)? – sligocki 2010-10-05 00:55:25

+2

TEMPDIR:= $(shell mktemp)。注意冒号。 – 2010-10-05 01:04:34

+0

这不回答这个问题。 – badzil 2011-09-30 20:22:07

1

您可以使用日期字符串。除非你在同一时间开始多个构建,否则应该非常接近。

像下面

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)构造。

+0

这不起作用。它每次使用$(pid_standin)时都会传递'date ...',因此会创建不同的目录。 – sligocki 2010-10-05 00:50:33

+1

显示当我尝试一个简单的测试用例时发生了什么,用修正更新了问题 – 2010-10-05 12:59:21

6

make为每个启动的命令启动一个新的shell。使用bash(没有检查其他shell)echo $PPID给出了父进程ID(这是make)。

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

subtarget: 
     echo $$PPID 
10
TEMPDIR := $(shell mktemp) 

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

我宁愿加-u参数:

TEMPDIR := $(shell mktemp -u) 

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

1

这里是回答你的问题,这似乎没有人想给你:

TEMPDIR := /tmp/myprog.$(shell echo $$$$) 

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