在执行第一个目标之前,让make
创建一个临时目录是否可能?也许可以使用一些技巧、额外的目标等等来实现?
Makefile 中的所有命令都可以将自动创建的目录称为$TMPDIR
,当make
命令结束时,该目录会被自动删除。
在执行第一个目标之前,让make
创建一个临时目录是否可能?也许可以使用一些技巧、额外的目标等等来实现?
Makefile 中的所有命令都可以将自动创建的目录称为$TMPDIR
,当make
命令结束时,该目录会被自动删除。
之前的答案要么无法正常工作,要么过于复杂。下面是我找到的一个更为简单明了的示例:
PACKAGE := "audit"
all:
$(eval TMP := $(shell mktemp -d))
@mkdir $(TMP)/$(PACKAGE)
rm -rf $(TMP)
至少在GNU make中,
TMPDIR := $(shell mktemp -d)
使用sys_get_temp_dir()
函数可以获取临时目录。我想不到一个好的方法来在结束时清理它,除了在all
目标的一部分中明显地加入rmdir "$(TMPDIR)"
。
TMPDIR
将创建该目录,并且 all
的规则将永远不会执行删除它的操作。 - Josh Kelley.PHONY
目标如何处理删除TMPDIR
? - Ari Sweedlerall
是唯一的目标,我想。或者只有几个目标,所以你可以从每个目标中删除。 - derobertmktemp -p myprefix -d
和 rm -rf myprefix*
。 - IljaBek请参考如何从Makefile获取其文件名,其中介绍了$(self)
技巧。
ifeq ($(tmpdir),)
location = $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
self := $(location)
%:
@tmpdir=`mktemp --tmpdir -d`; \
trap 'rm -rf "$$tmpdir"' EXIT; \
$(MAKE) -f $(self) --no-print-directory tmpdir=$$tmpdir $@
else
# [your real Makefile]
%:
@echo Running target $@ with $(tmpdir)
endif
我记得能够递归调用make,大概是这样的:
all:
-mkdir $(TEMPDIR)
$(MAKE) $(MFLAGS) old_all
-rm -rf $(TEMPDIR)
old_all: ... rest of stuff.
我曾经为在子目录中调用make做过类似的技巧:
all:
@for i in $(SUBDIRS); do \
echo "make all in $$i..."; \
(cd $$i; $(MAKE) $(MFLAGS) all); \
done
刚刚验证过,这个方法可行:
$ cat Makefile
all:
-mkdir tempdir
-echo hello >tempdir/hello
-echo goodbye >tempdir/goodbye
$(MAKE) $(MFLAGS) old_all
-rm -rf tempdir
old_all:
ls -al tempdir
$ make all
mkdir tempdir
echo hello >tempdir/hello
echo goodbye >tempdir/goodbye
make old_all
make[1]: Entering directory '/home/pax'
ls -al tempdir
total 2
drwxr-xr-x+ 2 allachan None 0 Feb 26 15:00 .
drwxrwxrwx+ 4 allachan None 0 Feb 26 15:00 ..
-rw-r--r-- 1 allachan None 8 Feb 26 15:00 goodbye
-rw-r--r-- 1 allachan None 6 Feb 26 15:00 hello
make[1]: Leaving directory '/home/pax'
rm -rf tempdir
$ ls -al tempdir
ls: cannot access tempdir: No such file or directory
make
忽略命令的返回代码。否则,失败会导致make
停止。 - paxdiablo