2012-02-16 38 views
11

Tôi đang sử dụng một tệp makefile để biên dịch chương trình được tạo từ nhiều tệp .c và bất kỳ lúc nào make được gọi nó chỉ biên dịch các tệp đó được sửa đổi sau lần chạy cuối cùng (không có gì đặc biệt cho đến đây).Kiểm soát độ dài của việc tạo

Để tránh làm lộn xộn màn hình, tôi thêm @ vào đầu mỗi cuộc gọi $(CC) và trước khi tôi in một thông báo tùy chỉnh echo. Ví dụ:

%.o: %.c $(h1) $(h3) %.h 
    @echo -e "\tCompiling <" $< 
    @$(CC) $(CFLAGS) -c $< -o $(libDir)[email protected]$(MATHOPTS) 

Câu hỏi của tôi là: làm thế nào tôi có thể kiểm soát tính cách rườm rà của make trong một "cách năng động" hơn, để có thể:

  1. hành vi bình thường: chỉ một thông báo tùy chỉnh được in cho mọi quy tắc makefile được thực hiện.
  2. Hành vi chi tiết: in lệnh thực sự được thực thi bởi mọi quy tắc makefile (như thể tất cả @ không được sử dụng).

Trả lời

16

Tôi muốn làm theo cách các automake làm:

V = 0 
ACTUAL_CC := $(CC) 
CC_0 = @echo "Compiling $<..."; $(ACTUAL_CC) 
CC_1 = $(ACTUAL_CC) 
CC = $(CC_$(V)) 

%.o: %.c $(h1) $(h3) %.h 
     $(CC) $(CFLAGS) -c $< -o $(libDir)[email protected]$(MATHOPTS) 

Nếu bạn cần thực hiện các lệnh khác trong các quy tắc của mình, tôi thích đoạn mã sau. Viết $(AT) thay vì @ và nó sẽ im lặng khi V=0 nhưng được in khi V=1.

AT_0 := @ 
AT_1 := 
AT = $(AT_$(V)) 
+2

Trong phần đầu tiên của bạn, giả sử bạn cũng cần ghi đè 'CC = $ (CC _ $ (V))'. –

+1

Có. Đó là sự vắng mặt là một fart não mà tôi sẽ sửa chữa ngay bây giờ. Tôi cũng nên chỉ ra rằng việc mở rộng biến đệ quy được triển khai rộng rãi nhưng hiện không có trong POSIX (nhưng điều đó sẽ thay đổi trong một bản sửa đổi trong tương lai). –

+1

Giải pháp tuyệt vời @JackKelly. Việc tạo biến 'AT' rất đơn giản và hiệu quả !. –

4

Tôi sẽ tạo một hàm có lệnh để thực thi và quyết định có lặp lại hay không.

# 'cmd' takes two arguments: 
# 1. The actual command to execute. 
# 2. Optional message to print instead of echoing the command 
#  if executing without 'V' flag. 
ifdef V 
cmd = $1 
else 
cmd = @$(if $(value 2),echo -e "$2";)$1 
endif 

%.o: %.c $(h1) $(h3) %.h 
    $(call cmd, \ 
     $(CC) $(CFLAGS) -c $< -o $(libDir)[email protected]$(MATHOPTS), \ 
     Compiling $<) 

Sau đó, kết quả của đồng bằng make gọi sẽ được giống như:

Compiling foo.c 

Trong khi make V=1 sẽ cung cấp cho:

gcc -Wall -c foo.c -o foo.o ... 
+0

Cảm ơn @Eldar! Đề xuất của bạn rất tốt, nhưng việc xác định lại "@" như được đề xuất bởi Jack đơn giản hơn. BTW, tôi hoàn toàn không biết rằng bạn có thể định nghĩa một hàm theo cách đó. –

+0

@ Nicolás, bạn được chào đón! –

7

Một giải pháp (một mà tôi thích vì nó linh hoạt)

ifeq ("$(BUILD_VERBOSE)","1") 
Q := 
vecho = @echo 
else 
Q := @ 
vecho = @true 
endif 

%.o: %.c 
    $(vecho) "-> Compiling [email protected]" 
    $(Q)$(CC) $(CFLAGS) -c $< -o [email protected] 

Bạn có thể bỏ những thứ vecho, nhưng nó có ích vào những thời điểm.

+0

Giải pháp rực rỡ. – Benoit

3

Vì tôi không thể nhận xét về đề xuất AT = $(AT_$(V)), lưu ý rằng Automake cung cấp macro chuẩn thực hiện tương tự như AT, được gọi là AM_V_at.

Bạn cũng sẽ thấy rằng nó có một biến số rất hữu ích AM_V_GEN khác, giải quyết không thành gì hoặc đến @echo " GEN " [email protected];, tùy thuộc vào độ dài.

này cho phép bạn mã hóa một cái gì đó như thế này:

grldr.mbr: mbrstart 
    $(AM_V_GEN) 
    $(AM_V_at)-rm -f grldr.mbr 
    $(AM_V_at)cat mbrstart > grldr.mbr 

Kết quả trong số đó sẽ được một trong hai (cách rườm rà vô hiệu hóa):

GEN grldr.mbr 

hoặc (verbosity kích hoạt):

rm -f grldr.mbr 
cat mbrstart > grldr.mbr 

Khá tiện lợi và điều này sẽ loại bỏ sự cần thiết phải xác định các macro của riêng bạn.

+0

Đây là con đường để đi! – rockdaboot

4

Thay vì sử dụng "@gcc" để biên dịch, bạn có thể bỏ qua "@" đó và chuyển tùy chọn "-s" vào lệnh make của bạn thay thế. (Để lại "@echo" như nó là.) Sau đó, "make -s" sẽ là lệnh ngắn gọn của bạn, và "làm" sẽ là tiết.

Cờ ‘-s’ hoặc ‘--ilent’ để ngăn tất cả lặp lại, như thể tất cả công thức nấu ăn bắt đầu bằng ‘@’. (Trả lời Những câu trả lời khác tốt hơn câu hỏi của bạn, nhưng cách tiếp cận này xứng đáng là một đề cập đến.)

From the GNU Make manual pages

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