make
是否可以在執行第一個目標之前創建臨時目錄?也許使用一些黑客,一些額外的目標等?如何自動創建(並刪除)Makefile中的臨時目錄?
Makefile中的所有命令都能夠將自動創建的目錄引用爲$TMPDIR
,並且當make
命令結束時將自動刪除該目錄。
make
是否可以在執行第一個目標之前創建臨時目錄?也許使用一些黑客,一些額外的目標等?如何自動創建(並刪除)Makefile中的臨時目錄?
Makefile中的所有命令都能夠將自動創建的目錄引用爲$TMPDIR
,並且當make
命令結束時將自動刪除該目錄。
我似乎記得能夠調用make遞歸,沿着線的東西:我已經做了類似的技巧使子目錄中
all:
-mkdir $(TEMPDIR)
$(MAKE) $(MLAGS) old_all
-rm -rf $(TEMPDIR)
old_all: ... rest of stuff.
:
all:
@for i in $(SUBDIRS); do \
echo "make all in $$i..."; \
(cd $$i; $(MAKE) $(MLAGS) 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
用GNU做,至少,
TMPDIR := $(shell mktemp -d)
會得到您的臨時目錄中。除了明顯的rmdir "$(TMPDIR)"
作爲all
目標的一部分之外,我無法想出最後清理它的好方法。
請參閱Getting the name of the makefile from the 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 [email protected]
else
# [your real Makefile]
%:
@echo Running target [email protected] with $(tmpdir)
endif
這些以前的答案要麼沒有工作,要麼顯得過於複雜。這是一個更直截了當的例子,我能弄清楚:
PACKAGE := "audit"
all:
$(eval TMP := $(shell mktemp -d))
@mkdir $(TMP)/$(PACKAGE)
rm -rf $(TMP)
如果所有的目標都是最新的,那麼評估`TMPDIR`將會創建目錄,`all`的規則將永遠不會被執行刪除它。 – 2010-09-27 14:17:58
@Josh Kelley:.PHONY會照顧到這一點。 – derobert 2010-09-29 05:07:46
你說得對,對不起。 – 2010-09-29 12:15:27