2009-02-26 5 views

Antwort

5

Ich scheine rekursiv machen in der Lage, wieder zu nennen, etwas entlang der Linien von:

all: 
    -mkdir $(TEMPDIR) 
    $(MAKE) $(MLAGS) old_all 
    -rm -rf $(TEMPDIR) 

old_all: ... rest of stuff. 

ich ähnliche Tricks für die Herstellung in Unterverzeichnisse getan haben:

all: 
    @for i in $(SUBDIRS); do \ 
     echo "make all in $$i..."; \ 
     (cd $$i; $(MAKE) $(MLAGS) all); \ 
    done 

habe gerade überprüft es und das funktioniert gut:

$ 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 
+0

Das funktioniert, aber natürlich nur, wenn der Benutzer 'make' sagt, ohne ein Ziel anzugeben. Also 'make all' wird nicht funktionieren usw. – Frank

+0

Ich erwarte, dass der Benutzer weiß, was er tut :-), also würden sie "make" oder "make toplevel" verwenden. In jedem Fall können Sie "all" in "old_all" und "toplevel" in "all" ändern, wenn Sie dieses Verhalten möchten. – paxdiablo

+0

Aktualisiert, damit Sie "alle" erstellen können, was auch die Standardregel ist. – paxdiablo

9

Mit GNU machen, zumindest,

TMPDIR := $(shell mktemp -d) 

werden Sie Ihr temporäres Verzeichnis. Ich kann mir keinen guten Weg vorstellen, es am Ende zu säubern, außer dem offensichtlichen rmdir "$(TMPDIR)" als Teil des Ziels all.

+0

Wenn alle Ziele auf dem neuesten Stand sind, dann die Bewertung 'TMPDIR' das Verzeichnis erstellen, und' all' Regeln werden nie ausgeführt werden um es zu löschen. –

+1

@Josh Kelley: .PHONY wird sich darum kümmern. – derobert

+0

Sie haben Recht, tut mir leid. –

3

Diese früheren Antworten entweder nicht funktioniert oder schien zu kompliziert. Hier ist ein weit geradeaus Beispiel konnte ich herausfinden:

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

Funktioniert wie ein Charme in GNU machen. Aber nicht in BSD machen. – Dereckson

Verwandte Themen