19

make最初のターゲットを実行する前に一時ディレクトリを作成することはできますか? たぶん、いくつかのハック、追加のターゲットなどを使用していますか?

Makefile 内のすべてのコマンドは、自動的に作成されたディレクトリを として参照でき、コマンドが終了$TMPDIRするとディレクトリは自動的に削除されます。make

4

4 に答える 4

22

少なくとも GNU make では、

TMPDIR := $(shell mktemp -d)

一時ディレクトリを取得します。ターゲットrmdir "$(TMPDIR)"の一部として明らかな以外に、最後にそれをクリーンアップする良い方法を思いつくことはできません。all

于 2009-02-26T05:50:03.567 に答える
11

トリックについては、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
于 2013-01-30T16:10:29.797 に答える
9

次のように、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
于 2009-02-26T05:51:22.533 に答える