2009-02-26 31 views
6

Có thể để make tạo thư mục tạm thời trước khi nó thực hiện mục tiêu đầu tiên không? Có thể sử dụng một số hack, một số mục tiêu bổ sung, vv?Làm thế nào tôi có thể tự động tạo (và xóa) một thư mục tạm thời trong một Makefile?

Tất cả các lệnh trong Makefile sẽ có thể tham khảo thư mục được tạo tự động dưới dạng $TMPDIR và thư mục sẽ tự động bị xóa khi lệnh make kết thúc.

Trả lời

5

tôi dường như nhớ lại việc có thể gọi thực hiện đệ quy, một cái gì đó dọc theo dòng:

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

old_all: ... rest of stuff. 

tôi đã thực hiện thủ đoạn tương tự để làm trong thư mục con:

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

Chỉ cần kiểm tra nó và điều này hoạt động tốt:

$ 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

Điều đó hoạt động, nhưng tất nhiên chỉ khi người dùng nói 'làm' mà không chỉ định mục tiêu. Vì vậy, 'làm cho tất cả' sẽ không hoạt động, vv. – Frank

+0

Tôi hy vọng người dùng biết họ đang làm gì :-) để họ sử dụng "làm" hoặc "làm cho toplevel". Trong mọi trường hợp, bạn có thể thay đổi "tất cả" thành "old_all" và "toplevel" thành "all" nếu bạn muốn hành vi đó. – paxdiablo

+0

Đã cập nhật để bạn có thể "tạo tất cả" cũng là quy tắc mặc định. – paxdiablo

9

Với GNU thực hiện, ít nhất,

TMPDIR := $(shell mktemp -d) 

sẽ giúp bạn thư mục tạm thời của bạn. Tôi không thể đưa ra một cách tốt để làm sạch nó ở cuối, khác với rõ ràng rmdir "$(TMPDIR)" như một phần của mục tiêu all.

+0

Nếu tất cả các mục tiêu được cập nhật, thì việc đánh giá 'TMPDIR' sẽ tạo thư mục và các quy tắc' all' sẽ không bao giờ được thực thi để xóa nó. –

+1

@Josh Kelley: .PHONY sẽ lo việc đó. – derobert

+0

Bạn nói đúng, xin lỗi. –

3

Những câu trả lời trước đây không hoạt động hoặc có vẻ quá phức tạp. Dưới đây là một ví dụ xa hơn về phía trước tôi đã có thể tìm ra:

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

Làm việc như một nét duyên dáng trong GNU. Nhưng không phải trong BSD. – Dereckson

Các vấn đề liên quan