如何在Makefile中获取make命令的pid?

sli*_*cki 15 pid makefile temporary-directory

我想使用一个对于此构建而言唯一的临时目录.如何在Makefile中获取make命令的pid?

我试过了:

TEMPDIR = /tmp/myprog.$$$$
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Mat*_*lin 27

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

TEMPFILE := $(shell mktemp)
TEMPDIR := $(shell mktemp -d)
Run Code Online (Sandbox Code Playgroud)

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

  • TEMPDIR:= $(shell mktemp).注意冒号. (3认同)
  • 请注意,没有参数的调用`mktemp`在MacOS/BSD兼容系统上不起作用.使用`mktemp -t tempfile.XXXXXX`将是一个更好的便携式选项. (2认同)

Kon*_*rad 10

TEMPDIR := $(shell mktemp)
Run Code Online (Sandbox Code Playgroud)

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

我更喜欢添加-u参数:

TEMPDIR := $(shell mktemp -u)
Run Code Online (Sandbox Code Playgroud)

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


Kon*_*rad 9

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

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

subtarget:
        echo $$PPID
Run Code Online (Sandbox Code Playgroud)


vy3*_*y32 6

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

TEMPDIR := /tmp/myprog.$(shell ps -o ppid $$$$)
Run Code Online (Sandbox Code Playgroud)

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