2011-02-01 19 views
8

Hãy xem xét các Makefile sau:Làm cách nào để có điều kiện đưa tệp vào Makefile?

# <include global configuration Makefile> 

INCL = -I../include \ 
     -I<whatever> 

CPPFLAGS=$(DEFS) $(INCL) 
CXXFLAGS = -O0 -g -Wall -fmessage-length=0 

SRCS = $(wildcard *.cpp) 

OBJS = $(SRCS:.cpp=.o) 

all: $(OBJS) 

%.o: %.cpp 
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o [email protected] $< 


depend: .depend 

.depend: $(SRCS) 
    $(CPP) $(CPPFLAGS) -M $^ > [email protected] 

clean: 
    rm -f $(OBJS) 
    rm .depend 


-include .depend 

Makefile này tạo ra một chuỗi #include phụ thuộc bằng cách sử dụng lệnh g++ -M, và bao gồm nó. Đây có thể là một quá trình khá dài. Vấn đề là tệp này được tạo ngay cả khi make clean được gọi, khi tệp này sẽ bị xóa. Có một cách để có điều kiện bao gồm tập tin này, và không bận tâm tạo nó nếu mục tiêu sạch được chạy?

+0

Điều này được trả lời chi tiết [ở đây] [1]. [1]: http://stackoverflow.com/questions/3714041/why-does-this-makefile-execute-a-target-on-make-clean/3714054#3714054 –

Trả lời

12

Something như thế này:

ifneq ($(MAKECMDGOALS),clean) 
-include .depend 
endif 

Xem make manual page on Goals để biết thêm thông tin

Edit: -include không thể tab thụt vào, nếu không nó sẽ bị bỏ qua.

1

Bạn có thể thực hiện các phụ thuộc như vậy cho miễn phí (tức là không mất chi phí thời gian chạy) trong khi biên dịch. Khi bạn chạy clean, các phụ thuộc tự nhiên không được làm lại. Xem phần Kết hợp Biên soạn và phụ thuộc Thế hệ trong giấy Advanced Auto-Dependency Generation của Paul Smith.

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