2009-12-26 36 views
14

Tôi muốn viết một makefile (gmake) cho trình biên dịch - không giống như gcc - đặt tất cả các tệp đầu ra vào một thư mục cụ thể. Rất tiếc, không thể thay đổi hành vi này.Makefile, Pattern-Rules và Thư mục

Nguồn của tôi nằm trong nhiều thư mục. Làm cách nào để viết một quy tắc mẫu cho phép tôi biên dịch các nguồn.

OK, có một chút không rõ ràng. Đây là một ví dụ. nguồn của tôi trông có thể giống như này:

./folder1/foo.c 
./folder2/bar.c 

và các tập tin đầu ra sẽ kết thúc như thế này:

./obj/foo.obj 
./obj/bar.obj 

Làm thế nào nên quy tắc của tôi để biên dịch nguồn của tôi trông như thế nào?

%.obj : %.c 
    $(COMPILER) -c $< 

sẽ không hoạt động.

Bất kỳ ý tưởng nào? Tôi muốn tránh một quy tắc ngầm cho mỗi file nguồn ...

+0

Bạn có thể sử dụng 'VPATH' cho rằng = hoặc = bạn có thể tạo' thư mục1/Makefile' và 'obj/Makefile' sẽ' include ../ Makefile.inc', chứa các quy tắc chung (ví dụ: bạn đã cho). –

Trả lời

23

Trích từ một số Makefile của tôi:

OBJS := $(sort $(patsubst %.cpp,$(OBJECT_DIRECTORY)/%.o,$(patsubst %.c,$(OBJECT_DIRECTORY)/%.o,$(notdir $(SRCS)))))

đâu OBJECT_DIRECTORY điểm đến thư mục đối tượng và SRCS là danh sách các nguồn tệp (thậm chí bạn có thể điền bằng cách sử dụng $(wildcard)).

Sau đó, trong Makefile, tôi có:

define define_compile_rules 
$(OBJECT_DIRECTORY)/%.o: $(1)%.c 
    @echo " + Compiling '$$<'" 
    @mkdir -p $$(@D) 
    $(CC) $$(CFLAGS) -o [email protected] -c $$< 
endef 

$(foreach directory,$(sort $(dir $(SRCS))),$(eval $(call define_compile_rules,$(directory)))) 

Xem the $(eval) function.

+1

Hàm eval và foreach là một tính năng không được sử dụng nghiêm trọng của gmake. – JesperE

+0

có thể là do lỗi trước GNU 3.81? –

+0

có vẻ tốt. Tôi sẽ thử ... –

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