Как я могу автоматически создать (и удалить) временный каталог в Makefile? - PullRequest
9 голосов
/ 26 февраля 2009

Можно ли make создать временный каталог до того, как он выполнит первую цель? Может быть, использовать какой-нибудь хак, какую-то дополнительную цель и т. Д.? 1002

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

Ответы [ 4 ]

12 голосов
/ 26 февраля 2009

С GNU make, по крайней мере,

TMPDIR := $(shell mktemp -d)

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

9 голосов
/ 19 октября 2016

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

PACKAGE := "audit"
all:
    $(eval TMP := $(shell mktemp -d))
    @mkdir $(TMP)/$(PACKAGE)
    rm -rf $(TMP)
9 голосов
/ 26 февраля 2009

Мне кажется, я помню рекурсивную возможность вызова 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
6 голосов
/ 30 января 2013

См. Получение имени make-файла из make-файла для $(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 $@

else
# [your real Makefile]
%:
    @echo Running target $@ with $(tmpdir)
endif
...