2009-02-26 19 views

Respuesta

5

Me parece recordar que pueda llamar a realizar de forma recursiva, algo a lo largo de las líneas de:

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

old_all: ... rest of stuff. 

que he hecho trucos similares para hacer en subdirectorios:

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

acaba de comprobar y esto funciona bien:

$ 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

Eso funciona, pero por supuesto solo si el usuario dice 'hacer' sin especificar un objetivo. Entonces 'make all' no funcionará, etc. – Frank

+0

Espero que el usuario sepa lo que están haciendo :-) para que usen "make" o "make toplevel". En cualquier caso, puede cambiar "all" a "old_all" y "toplevel" a "all" si desea ese comportamiento. – paxdiablo

+0

Actualizado para que pueda "hacer todo", que también es la regla predeterminada. – paxdiablo

9

Con GNU Make, al menos,

TMPDIR := $(shell mktemp -d) 

le conseguirá el directorio temporal. No puedo encontrar una buena manera de limpiarlo al final, aparte del obvio rmdir "$(TMPDIR)" como parte del objetivo all.

+0

Si todos los objetivos están al día, y luego evaluar 'TMPDIR' creará el directorio, y' nunca se ejecutarán las reglas de all' para borrarlo –

+1

@Josh Kelley: .PHONY se encargará de eso. – derobert

+0

Tienes razón, lo siento. –

3

Estas respuestas anteriores o bien no funcionan o parecían excesivamente complicado. Aquí es un ejemplo de avance mucho más recta yo era capaz de averiguar:

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

Funciona como un encanto en la marca GNU. Pero no en BSD. – Dereckson

Cuestiones relacionadas