2011-05-18 36 views
7

Tôi có một số tiện ích con được biểu thị bằng một số config.xml trong số root in a directory layout của chúng.Tìm phụ thuộc của makefile

Tệp GNUmakefile mà tôi có ở đây có thể tạo chúng. Mặc dù nếu tôi cập nhật các thư mục, các phụ thuộc không được theo dõi. Tôi không muốn phụ thuộc vào một mục tiêu rõ ràng rõ ràng, vậy làm thế nào để tôi theo dõi các nội dung của mỗi thư mục?

WGTS := $(shell find -name 'config.xml' | while read wgtdir; do echo `dirname $$wgtdir`.wgt; done) 
all: $(WGTS) 
%.wgt: 
    @cd $* && zip -q -r ../$(shell basename $*).wgt . 
    @echo Created [email protected] 
clean: 
    rm -f $(WGTS) 

Tôi hy vọng một cái gì đó như:

%.wgt: $(shell find $* -type f) 

sẽ hoạt động, nhưng nó không. Help.

+0

Vì vậy ... bạn muốn 'foo.wgt' phụ thuộc vào mọi thứ trong' foo/'? – Beta

+0

Đúng vậy ... – hendry

Trả lời

4

Kết hợp Beta's idea với tôi:

 
WGTS := $(shell find -name config.xml) 
WGTS := $(WGTS:/config.xml=.wgt) 
WGTS_d := $(WGTS:.wgt=.wgt.d) 

all: $(WGTS) 
clean: 
    rm -f $(WGTS) $(WGTS_d) 

-include $(WGTS_d) 

define WGT_RULE 
$(1): $(shell find $(1:.wgt=)) 
$(1:.wgt=)/%: 
    @ 
endef 
$(foreach targ,$(WGTS),$(eval $(call WGT_RULE,$(targ)))) 
%.wgt: 
    @echo Creating [email protected] 
    @(echo -n "[email protected]: "; find $* -type f | tr '\n' ' ') > [email protected] 
    @cd $* && zip -q -r ../$(shell basename $*).wgt . 

Ví dụ:

 
$ mkdir -p foo bar/nested 
$ touch {foo,bar/nested}/config.xml 
$ make 
Creating bar/nested.wgt 
Creating foo.wgt 
$ make 
make: Nothing to be done for `all'. 
$ touch foo/a 
$ make 
Creating foo.wgt 
$ rm foo/a 
$ make 
Creating foo.wgt 
$ make 
make: Nothing to be done for `all'. 

Chỉ có vấn đề tiềm năng ở đây là các quy tắc giả cho phép thực hiện các mục tiêu bỏ qua nó không biết làm thế nào để xây dựng được lồng trong các thư mục. (foo/a trong ví dụ của tôi.) Nếu đó là những mục tiêu thực sự cần biết cách xây dựng, định nghĩa công thức trùng lặp có thể là một vấn đề.

+0

Tôi cần có tài khoản để thêm các tệp mới. on't khá hiểu cần phải viết ra rằng điều .wgt.d, nó trông giống như cruft với tôi. Sẽ không có trường hợp nào với config.xml bên trong một tệp config.xml. :) – hendry

+0

@hendry: Viết ra các tệp phụ thuộc cho phép đơn giản bao gồm chúng trong các lần chạy tiếp theo mà không phải tạo lại tất cả thông tin đó. Nó hoạt động tốt cho hầu hết các trường hợp (và thường được sử dụng để tạo ra các phụ thuộc nguồn C trên các tiêu đề); nhưng nó không thể xử lý việc thêm các tệp với các mục tiêu chỉ phụ thuộc vào trạng thái hệ thống tệp. –

+0

@thomas Makefile này có thể tính đến việc thêm cũng như xóa các tệp, tuy nhiên tôi không thể điều chỉnh nó cho tài khoản cho cấu trúc thư mục tùy ý mà các tiện ích của tôi có trong http://tests.wacapps.net/?p=wac2tests;a= blob; f = mẫu/Makefile; Tôi nghĩ rằng nếu chúng tôi hiểu http://www.gnu.org/s/hello/manual/make/Secondary-Expansion.html, chúng tôi sẽ tìm câu trả lời – hendry

1

Có lẽ cách tốt nhất để làm điều này là để tạo ra các danh sách điều kiện tiên quyết một cách rõ ràng, trước:

define WGT_RULE 
$(1).wgt: $(wildcard $(1)/*) 
endef 

$(foreach targ,$(WGTS),$(eval $(call WGT_RULE,$(targ)))) 

Có một cách khác đó là rất thông minh (một cụm từ mà làm cho một lập trình viên tốt cảnh giác). Nhiều năm trước, tôi đã đưa ra một kludge thuận tay trái để xử lý một thư mục như một điều kiện tiên quyết. Tôi sẽ xem liệu tôi có thể đào các cuốn sổ tay cũ của mình nếu như trên không đủ tốt.

CHỈNH SỬA:
Rất tiếc, tôi không xem xét các thư mục con. Đây là một makefile hoàn chỉnh (tôi rời ra quy tắc clean) mà nên làm các trick.

WGTS := $(shell find -name 'config.xml' | while read wgtdir; do echo `dirname $\ 
$wgtdir`.wgt; done) 
all: $(WGTS) 

# This constructs a rule without commands ("foo.wgt: foo/bar.txt foo/baz.dat..."). 
define WGT_RULE 
$(1).wgt: $(shell find $(1)) 
endef 

# This invokes the above to create a rule for each widget. 
$(foreach targ,$(WGTS),$(eval $(call WGT_RULE,$(targ)))) 

%.wgt: 
    @cd $* && zip -q -r ../$(shell basename $*).wgt . 
    @echo Created [email protected] 
+0

Tôi vừa thử tạo một tệp mới trong thư mục con và tệp makefile không nhận được. :(Có cách nào để tránh điều này WGT_RUL? Có vẻ như một chút không cần thiết cho tôi.Tôi muốn nó phải của '% .wgt:' Xin lỗi là khó khăn ... – hendry

+0

Điều này không hoạt động: 'hendry @ x201 foo $ mkdir bar hendry @ x201 foo $ touch bar/config.xml hendry @ x201 foo $ make tìm: './bar.wgt ': Không có tệp hoặc thư mục nào như vậy Tạo bar.wgt hendry @ x201 foo $ make thực hiện: Không có gì phải làm cho 'tất cả ' Hendry @ X201 foo $ vim Makefile Hendry @ X201 foo $ touch bar/foo Hendry @ X201 foo $ make thực hiện:. Không có gì phải làm cho' tất cả'. hendry @ x201 foo $ ' – hendry

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