2008-10-30 48 views
13

Tôi có mẫu makefile để biên dịch một DLL duy nhất (cho hệ thống plugin) hay không. Các makefile của người sử dụng trông như thế này:Cách kiểm tra xem tệp có tồn tại trong makefile

EXTRA_SRCS=file1 file2 
include makefile.in 

Trong makefile.in tôi có:

plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS)) 

đâu plugin.os là C++ tập tin chính được biên dịch. Btw, các tệp có đuôi là .os là các tập tin đối tượng biên soạn cho thư viện chia sẻ (ví dụ: sử dụng tùy chọn -fpic với gcc)

Bây giờ, vấn đề là các nguồn bổ sung này sẽ có thể (nhưng không nhất thiết) được tập tin tiêu đề. Lý tưởng nhất là tôi muốn thêm chúng làm phụ thuộc cho mục tiêu plugin.osfile.cpp, nhưng chỉ khi chúng tồn tại.

Phương pháp này sẽ hoạt động đối với cả windows và linux hoặc ít nhất là có thể thích ứng với từng cửa sổ. Tuy nhiên, tôi chỉ sử dụng phiên bản GNU.

Trả lời

18

Sử dụng các "ký tự đại diện" chức năng:

$(wildcard *.h) 

EDIT: để phù hợp với một danh sách cụ thể, làm

$(wildcard $(HEADER_FILES)) 

Không có nhu cầu sử dụng $ (lọc ...), chức năng ký tự đại diện tự động lọc các tệp không tồn tại.

+0

đó không phải là những gì tôi muốn ... Tôi có một danh sách cụ thể của tập tin .h để kiểm tra ... – PierreBdR

+0

Đó là ok, bạn không cần phải sử dụng ký tự đại diện. Sử dụng $ (wildcard $ (HEADER_FILES)) – JesperE

4

Bạn không chỉ định (các) trình biên dịch bạn đang sử dụng, nhưng nếu bạn có quyền truy cập gcc/g ++, bạn có thể sử dụng tùy chọn -MM.

Điều tôi làm là tạo tệp có đuôi .d cho mọi tệp .c hoặc .cpp, sau đó "bao gồm" các tệp .d. Tôi sử dụng một cái gì đó như thế này trong Makefile của tôi:

%.d: %.c 
     gcc $(INCS) $(CFLAGS) -MM $< -MF [email protected] 

%.d: %.cpp 
     g++ $(INCS) $(CXXFLAGS) -MM $< -MF [email protected] 

sau đó tôi có thể tạo sự phụ thuộc như thế này:

C_DEPS=$(C_SRCS:.c=.d) 
CPP_DEPS=$(CPP_SRCS:.cpp=.d) 
DEPS=$(C_DEPS) $(CPP_DEPS) 

và điều này ở dưới cùng của Makefile:

include $(DEPS) 

Là này loại hành vi bạn đang làm? Vẻ đẹp của phương pháp này là ngay cả khi bạn đang sử dụng một trình biên dịch không phải GNU để biên dịch thực tế, các trình biên dịch GNU thực hiện một công việc tốt để tính toán các phụ thuộc.

+0

Tôi thà tránh makeflie generation ... nhưng cảm ơn! – PierreBdR

2

Liệu đơn giản

$(filter $(wildcard *.h),$(HEADER_FILES)) 

làm những gì bạn muốn?

+0

mmhh .. Tôi không biết về lệnh bộ lọc này! nó làm gì – PierreBdR

+0

Đọc tài liệu của Make (các trang thông tin, không phải manpage): $ (bộ lọc PATTERNS, TEXT) là các từ trong TEXT khớp với ít nhất một trong các MẪU. (PATTERN đang tạo các khuôn mẫu, chứ không phải regexes, vì vậy một tên tệp thuần túy phải khớp chính xác.) – ephemient

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