2013-07-24 41 views
19

Tôi có một thư mục (root_dir), có chứa một số thư mục con (subdir1, subdir2, ...).Chạy trong mỗi thư mục con

Tôi muốn chạy make trong mỗi thư mục trong root_dir, sử dụng Makefile được đặt trong đó. (Rõ ràng là mỗi subdir... có bên trong Makefile của riêng nó).

Vì vậy, về cơ bản có hai câu hỏi:

  1. Làm thế nào để có được một danh sách các thư mục trong Makefile (tự động)?
  2. Làm cách nào để chạy cho mỗi thư mục bên trong tệp tạo?

Như tôi knwow để chạy thực hiện trong một thư mục cụ thể tôi chú ý phải làm như sau:

$(MAKE) -C subdir 

Trả lời

33

Có những vấn đề khác nhau với làm tiểu làm cho bên trong một vòng lặp for trong một công thức duy nhất. Cách tốt nhất để thực hiện nhiều thư mục con như sau:

SUBDIRS := $(wildcard */.) 

all: $(SUBDIRS) 
$(SUBDIRS): 
     $(MAKE) -C [email protected] 

.PHONY: all $(SUBDIRS) 

(Chỉ cần nêu ra đây là GNU cụ thể; bạn không đề cập đến bất kỳ hạn chế nào về phiên bản bạn đang sử dụng).

ETA Đây là phiên bản hỗ trợ nhiều mục tiêu cấp cao nhất.

TOPTARGETS := all clean 

SUBDIRS := $(wildcard */.) 

$(TOPTARGETS): $(SUBDIRS) 
$(SUBDIRS): 
     $(MAKE) -C [email protected] $(MAKECMDGOALS) 

.PHONY: $(TOPTARGETS) $(SUBDIRS) 
+1

gì nếu tôi cũng muốn mục tiêu sạch sẽ? – Claudio

+0

Tại sao $ (SUBDIRS) ở trong .PHONY? Đó có phải là do ngày/thời gian sửa đổi thư mục không quan trọng? Tôi có câu hỏi này, bởi vì các thư mục không phải là hàng giả. .PHONY được cho là dành cho mục tiêu giả. – shuva

+0

'.PHONY' là cho các mục tiêu mà bạn muốn được xây dựng mỗi khi makefile chạy, bất kể nó tồn tại hay không hoặc đã lỗi thời. – MadScientist

3

Hãy thử điều này:

SUBDIRS = foo bar baz 

subdirs: 
    for dir in $(SUBDIRS); do \ 
     $(MAKE) -C $$dir; \ 
    done 

này có thể giúp bạn link

Chỉnh sửa: bạn cũng có thể làm:

Cách đơn giản nhất là để làm:

CODE_DIR = code 

.PHONY: project_code 

project_code: 
     $(MAKE) -C $(CODE_DIR) 

Nguyên tắc .PHONY nghĩa là project_code không phải là một tập tin mà cần phải được xây dựng, và cờ C chỉ ra một sự thay đổi trong thư mục (tương đương với chạy mã cd trước khi gọi điện thoại thực hiện). Bạn có thể sử dụng cùng một cách tiếp cận để gọi các mục tiêu khác trong mã Makefile.

Ví dụ:

clean: 
    $(MAKE) -C $(CODE_DIR) clean 

Source

+0

Thật sự tôi không muốn có một danh sách các thư mục trong makefile – Alex

0

Có một thư viện gọi prorab cho GNU làm mà hỗ trợ bao gồm của makefiles độc lập trong các thư mục con.

Một số thông tin về github: https://github.com/igagis/prorab/blob/master/wiki/HomePage.md

Về cơ bản, với prorab gọi tất cả makefiles trong thư mục con trông như thế này:

include prorab.mk 

$(eval $(prorab-build-subdirs)) 
Các vấn đề liên quan