2009-02-26 107 views

回答

5

我似乎記得能夠調用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 
9

用GNU做,至少,

TMPDIR := $(shell mktemp -d) 

會得到您的臨時目錄中。除了明顯的rmdir "$(TMPDIR)"作爲all目標的一部分之外,我無法想出最後清理它的好方法。

+0

如果所有的目標都是最新的,那麼評估`TMPDIR`將會創建目錄,`all`的規則將永遠不會被執行刪除它。 – 2010-09-27 14:17:58

+1

@Josh Kelley:.PHONY會照顧到這一點。 – derobert 2010-09-29 05:07:46

+0

你說得對,對不起。 – 2010-09-29 12:15:27

3

這些以前的答案要麼沒有工作,要麼顯得過於複雜。這是一個更直截了當的例子,我能弄清楚:

PACKAGE := "audit" 
all: 
    $(eval TMP := $(shell mktemp -d)) 
    @mkdir $(TMP)/$(PACKAGE) 
    rm -rf $(TMP)