2009-12-30 26 views
7

Tôi muốn tạo tệp phụ thuộc duy nhất bao gồm tất cả các phụ thuộc của tệp nguồn sử dụng cờ gcc -M thông qua Makefile. Tôi googled cho giải pháp này nhưng, tất cả các giải pháp được đề cập là để tạo ra nhiều tập tin deps cho nhiều đối tượng.Tạo tất cả các phụ thuộc của dự án trong một tệp đơn bằng cờ gcc -MM

DEPS = make.dep 

$(OBJS): $(SOURCES) 
    @$(CC) -MM $(SOURCEs) > $(DEPS) 
    @mv -f $(DEPS) $(DEPS).tmp 
    @sed -e 's|[email protected]:|[email protected]:|' < $(DEPS).tmp > $(DEPS) 
    @sed -e 's/.*://' -e 's/\\$$//' < $(DEPS).tmp | fmt -1 | \ 
     sed -e 's/^ *//' -e 's/$$/:/' >> $(DEPS) 
    @rm -f $(DEPS).tmp 

Nhưng nó không hoạt động bình thường. Hãy cho tôi biết tôi đang phạm sai lầm ở đâu.

Trả lời

7

cái gì đó dọc những dòng này là những gì tôi sử dụng để có được tất cả phụ thuộc của tôi trong một tập tin duy nhất:

program_H_SRCS := $(wildcard *.h) 
program_C_SRCS := $(wildcard *.c) 
DEPS = make.deps 

make.deps: $(program_C_SRCS) $(program_H_SRCS) 
    $(CC) $(CPPFLAGS) -MM $(program_C_SRCS) > make.deps 

include $(DEPS) 

này về cơ bản gây ra tất cả người sử dụng (như trái ngược với hệ thống) phụ thuộc được xây dựng lại thành một tập tin duy nhất bất cứ khi nào bất kỳ tệp C hoặc H nào trong dự án đều được sửa đổi.

+++++++++ EDIT +++++++++++

Tôi đã kể từ khi tìm thấy một cách tốt hơn để làm việc. Tôi tạo một tệp riêng biệt cho từng tệp nguồn. Đây là makefile cơ bản:

program_NAME := myprogram 
program_SRCS := $(wildcard *.c) 
program_OBJS := ${program_SRCS:.c=.o} 
clean_list += $(program_OBJS) $(program_NAME) 

# C Preprocessor Flags 
CPPFLAGS += 
# compiler flags 
CFLAGS += -ansi -Wall -Wextra -pedantic-errors 

.PHONY: all clean distclean 

all: $(program_NAME) 

clean: 
    @- $(RM) $(clean_list) 

distclean: clean 

# Generate dependencies for all files in project 
%.d: $(program_SRCS) 
    @ $(CC) $(CPPFLAGS) -MM $*.c | sed -e '[email protected]^\(.*\)\.o:@\1.d \1.o:@' > [email protected] 

clean_list += ${program_SRCS:.c=.d} 

$(program_NAME): $(program_OBJS) 
    indent -linux -brf $(program_SRCS) 
    splint $(program_SRCS) 
    $(LINK.c) $(program_OBJS) -o $(program_NAME) 

ifneq "$(MAKECMDGOALS)" "clean" 
# Include the list of dependancies generated for each object file 
-include ${program_SRCS:.c=.d} 
endif 

này thực hiện hai điều:

  1. Nếu bất kỳ của các tập tin mà foo.c phụ thuộc vào sự thay đổi sau đó foo.o được xây dựng lại mà không cần phải xây dựng lại các file khác trong dự án.
  2. Bản thân tệp dep có cùng phụ thuộc như tệp đối tượng, để nếu có bất kỳ dep nào được sửa đổi thì chính tệp dep cũng được tạo lại, trước khi tệp deps đối tượng được chọn.
+0

Cảm ơn bạn rất nhiều. Tôi nghĩ rằng đây có thể là makefile cuối cùng mới của tôi cho bất kỳ dự án nào. – digy

+0

@digy Vui vì tôi có thể trợ giúp :-) –

1

Tôi nghĩ là dự kiến ​​hành vi cho gcc -M, nơi thường bạn muốn làm một cái gì đó như thế này:

FOO_SOURCES= \ 
    src/foo.c \ 
    src/bar.c 

FOO_OBJECTS = $(FOO_SOURCES:.c=.o) 
FOO_DEPS = $(FOO_OBJECTS:.o=.d) 

(... rất nhiều mục tiêu ...)

-include $(FOO_DEPS) 

Note, -include không include vì phụ thuộc rõ ràng sẽ không tồn tại cho đến khi ít nhất một bản dựng đã được chạy. Bất kể, phụ thuộc được tạo ra trên cơ sở mỗi mô-đun.

Cũng lưu ý rằng gcc -M không phải lúc nào cũng hoạt động như bạn mong đợi nó hoạt động, tùy thuộc vào phiên bản gcc nào bạn đang sử dụng.

Tôi nghĩ rằng những gì bạn muốn là một cái gì đó gọi là makedep, mà không những gì bạn muốn mà không cần hack tin tưởng trong makefile.

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