2009-02-26 1 views
6

Возможно ли, что make создать временную директорию, прежде чем она выполнит первую цель? Может быть, с помощью какого-то взлома, некоторой дополнительной цели и т. Д.?Как я могу автоматически создать (и удалить) временную директорию в Makefile?

Все команды в файле Makefile могут ссылаться на автоматически созданный каталог как $TMPDIR, и каталог будет автоматически удален при завершении команды make.

ответ

5

я припоминаю, будучи в состоянии вызвать сделать рекурсивно, то вдоль линий:

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

Это работает, но, конечно, только если пользователь говорит «make», не указав цель. Так что «сделать все» не получится. – Frank

+0

Я ожидаю, что пользователь узнает, что они делают :-), поэтому они будут использовать «make» или «make toplevel». В любом случае вы можете изменить «все» на «old_all» и «toplevel» на «all», если вы хотите этого поведения. – paxdiablo

+0

Обновлено так, что вы можете «сделать все», что также является стандартом по умолчанию. – paxdiablo

9

С GNU сделать, по крайней мере,

TMPDIR := $(shell mktemp -d) 

поможет вам временный каталог. Я не могу придумать хороший способ очистить его в конце, кроме очевидного rmdir "$(TMPDIR)" как часть цели all.

+0

Если все цели находятся в актуальном состоянии, то оценка 'TMPDIR' создаст каталог и' правила all' никогда не будет выполнен для удаления. –

+1

@ Josh Kelley: .PHONY позаботится об этом. – derobert

+0

Вы правы, извините. –

3

Эти предыдущие ответы либо не работают, или казалось слишком сложным. Здесь гораздо более прямой пример, который я смог выяснить:

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

Работает как шарм в GNU make. Но не в BSD. – Dereckson

Смежные вопросы