2010-07-18 27 views
15

Tôi cố gắng để nói "việc tải các kho git sẽ chỉ làm việc nếu yank thư mục/tồn tại Nếu yank thư mục/không tồn tại sau đó làm cho nó."Có thể makefile có một thư mục làm mục tiêu không?

yank/gist.el/gist.el : yank 
    cd yank ; git clone http://github.com/defunkt/gist.el.git 

yank: 
    mkdir yank 

Tôi đang sử dụng makepp - http://makepp.sf.net và đang gặp lỗi:

[[email protected] ~/edan/pkg/gist.el] makepp 
makepp: Loading makefile `/home/metaperl/edan/pkg/gist.el/Makeppfile' 
makepp: Entering directory `/home/metaperl/edan/pkg/gist.el' 
mkdir yank 
mkdir: cannot create directory `yank': File exists 
makepp: error: Failed to build target `/home/metaperl/edan/pkg/gist.el/yank' [1] 
makepp: 0 files updated, 0 phony targets built and 1 target failed 
[[email protected] ~/edan/pkg/gist.el] 

Nhưng tại sao nó cố gắng tạo thư mục yank nếu nó tồn tại? "Nguồn" đã được tạo ...

+0

Chúng tôi đã có một cuộc thảo luận về việc tạo thư mục: http://stackoverflow.com/questions/1950926/create-directories-using-make-file. Bạn cũng có thể muốn biết rằng [cách bạn tạo thư mục không an toàn cho luồng] (http://stackoverflow.com/questions/1894427/makefile-with-directory-tree-creation-suitable-for-parallel-j- xây dựng). –

+0

@Pavel: cách thư mục được tạo là tốt, vì đó là sự phụ thuộc của tệp. Trong ví dụ bạn trích dẫn, vấn đề chính xác là thư mục không phải là sự phụ thuộc của các mục tiêu sử dụng nó mà là một mục tiêu khác, mà không làm được gì tốt. – Gilles

+0

@Gilles, ok, bạn nói đúng, tôi trộn lẫn các vấn đề. Chỉ muốn thuyết phục bạn rằng các thư mục như mục tiêu không phải là một lựa chọn tốt ... –

Trả lời

16

Có, một Makefile có thể có thư mục làm mục tiêu.

Vấn đề của bạn có thể là các cd không làm những gì bạn muốn: nó cdgit clone được thực hiện trong thư mục gốc (một trong những bạn cd ed từ, không một trong những bạn cd ed đến) . Điều này là bởi vì cho mỗi lệnh trong Makefile một vỏ thêm được tạo ra. Giải pháp thay thế là chạy cd và sao chép dưới dạng một lệnh với số && của vỏ.

này nên làm việc:

bla/f: dir 
    cd dir && touch f 

dir: 
    mkdir dir 
+1

Đúng, và trên nguyên tắc chung makefiles nên luôn luôn '&&' chứ không phải là ';'. Tuy nhiên, đây không phải là vấn đề ở đây: 'cd' chỉ chạy * sau * mục tiêu' yank' đã được làm lại. – Gilles

+6

Tôi thường sử dụng mục tiêu 'dir/.dirstamp' thay vì' dir' bằng quy tắc 'mkdir -p dir && touch $ @'. Dấu thời gian trên dirs trong thay đổi unix khi nội dung của thư mục thay đổi ngăn chặn các quy tắc phụ thuộc chạy. –

1

makefile của bạn nên làm những gì bạn mong đợi. Vì yank không phụ thuộc, nó sẽ không được làm lại nếu nó tồn tại. Vì vậy, điều này trông giống như một lỗi trong makepp. Bạn có thể xác nhận điều này bằng cách thử makefile của bạn với một thực hiện truyền thống thực hiện.

+0

Tôi đã thử và không được sao chép. –

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