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)的引用的表达式.)
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.
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)
这是您问题的答案,似乎没有人愿意给您:
TEMPDIR := /tmp/myprog.$(shell ps -o ppid $$$$)
Run Code Online (Sandbox Code Playgroud)
当然,这不能保证是唯一的。