Как я могу автоматически создать (и удалить) временный каталог в Makefile?
возможно ли иметь make
создать временный каталог, прежде чем он выполнит первую цель? Возможно, используя какой-то Хак, некоторую дополнительную цель и т. д.?
все команды в Makefile смогут ссылаться на автоматически созданный каталог как $TMPDIR
, и каталог будет автоматически удален, когда заканчивается.
4 ответов
Я, кажется, помню, что могу вызвать 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
С GNU сделать, по крайней мере,
TMPDIR := $(shell mktemp -d)
получит ваш временный каталог. Я не могу придумать хороший способ, чтобы очистить его в конце, кроме очевидного rmdir "$(TMPDIR)"
в рамках all
цель.
посмотреть получение имени файла makefile из файла makefile на $(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
эти предыдущие ответы либо не работали, либо казались слишком сложными. Вот гораздо более прямой пример, который я смог выяснить:
PACKAGE := "audit"
all:
$(eval TMP := $(shell mktemp -d))
@mkdir $(TMP)/$(PACKAGE)
rm -rf $(TMP)