2009-11-17 27 views
61

Có cách nào có dòng lệnh trong make để tìm hiểu điều kiện tiên quyết nào của mục tiêu không được cập nhật không?Gỡ lỗi GNU thực hiện

+0

là không có giống như một chế độ verbose? Và không thể bạn chỉ cần nhập vào một số 'echo' gỡ lỗi tại mỗi mục tiêu để tìm ra điều đó? – Earlz

Trả lời

85
make -d 

sẽ cho bạn hơn quá đủ thông tin để gỡ lỗi makefile của bạn.

Được cảnh báo: sẽ mất một chút thời gian và công sức để phân tích đầu ra nhưng tải đầu ra vào trình chỉnh sửa yêu thích của bạn và thực hiện tìm kiếm sẽ hỗ trợ rất nhiều.

Bạn có thể giảm đáng kể lượng đầu ra gỡ lỗi nếu bạn chỉ định mục tiêu cụ thể mà bạn quan tâm. Vì vậy, nếu bạn chỉ quan tâm đến mục tiêu dodgy, thay vì chỉ make -d có thể tạo ra hàng trăm điều khác nhau, hãy thử :

make clean 
make -d dodgy 

(giả sử bạn có một mục tiêu là clean).

Các make --debug giống hệt make -d nhưng bạn cũng có thể chỉ định:

make --debug=FLAGS 

nơi cờ có thể là:

  • a cho tất cả gỡ lỗi (giống như make -dmake --debug).
  • b để gỡ lỗi cơ bản.
  • v để gỡ lỗi cơ bản hơn một chút.
  • i cho các quy tắc ẩn.
  • j để biết thông tin yêu cầu.
  • m để biết thông tin trong quá trình làm lại tệp.

Dường như make --debug=b là lựa chọn tốt nhất cho những gì bạn cần, như thể hiện trong bảng điểm sau:

[email protected]> cat makefile 
c:a b 
    touch c 

[email protected]> touch a b ; make 
touch c 

[email protected]> make 
make: 'c' is up to date. 

[email protected]> touch a ; make --debug=b 
GNU Make 3.81 
Copyright (C) 2006 Free Software Foundation, Inc. Blah, blah, blah. 
Reading makefiles... 
Updating goal targets.... 
Prerequisite 'a' is newer than target 'c'. 
Must remake target 'c'. 
touch c 
Successfully remade target file 'c'. 
+4

Một gợi ý khác là nếu bạn muốn loại bỏ các quy tắc ngầm, bạn có thể sử dụng cờ '-r' cùng với' -d'. –

17

Bạn đang tìm kiếm "chạy khô" Make không? Nó sẽ in ra những gì làm được thực hiện mà không thực sự làm như vậy, cho phép bạn xem những gì sẽ xảy ra.

Cờ là -n, sử dụng nó như make -n.

+0

Đây là yêu thích của tôi, '-d' quá dài dòng (thậm chí là' --debug = b'). Đặc biệt là nếu bạn đang mắc kẹt với làm đệ quy (ugh!). –

7

Câu hỏi của bạn có một chút không rõ ràng. Nếu bạn muốn xem các tệp điều kiện tiên quyết nào chưa được sửa đổi gần đây, hãy sử dụng ls -l để xem thời gian sửa đổi của chúng.Nếu bạn muốn xem những gì làm cho đang làm, hãy thử này:

 
# Make will announce when it is making this target, and why. 
sometarget: preq1 preq2 preq3 
    @echo making [email protected] 
    @echo The following preqs are newer than the target: $? 
    do_things 
+0

Tôi định đề xuất $? cũng như –

+0

Không thực sự là một giải pháp dòng lệnh nhưng hữu ích. Bạn có thể có thể làm cho nó dòng lệnh dựa trên chỉ làm echos chỉ khi một env-var được thiết lập. – paxdiablo

1

Vài lần Tôi cũng đã sử dụng trình gỡ rối tương tác this (cũ nhưng vẫn hoạt động) do John Graham-Cumming

5

Những gì tôi thường làm là không sử dụng -d như người trả lời trước đó đã nói.

tôi hoặc là:

  1. Sử dụng -p để in các cơ sở dữ liệu, để xem những gì quy tắc đã được tạo ra. Điều này rất tiện lợi nếu bạn có các quy tắc mở rộng thứ hai và đang tạo các quy tắc khi đang bay, đặc biệt là việc tạo đệ quy.
  2. Sử dụng nhiều hàm $ (thông tin).
  3. Sử dụng những lời khuyên và thủ thuật được mô tả trong bài viết này DrDobbs Debugging Makefiles

Dưới đây là một số mã tôi đang sử dụng để in ra giá trị:

define pv 
$(info $(1) [$(origin $(1))] : >|$($(1))|<) 
endef 

define pva 
$(foreach t,$(1),$(call pv,$(t))) 
endef 

define itemizer 
$(foreach t,$($(1)),$(info $(t))) 
endef 
0

tôi đang sử dụng làm gnu làm mẫu để xác định thực hiện quy tắc cho mỗi mục tiêu;

Templates được như macro viết các quy tắc, họ được giải thích ở đây https://www.gnu.org/software/make/manual/html_node/Eval-Function.html

tính năng này rất hữu ích khi bạn có một hệ thống làm bao gồm một makefile cốt lõi để tạo ra tất cả các quy định cho mỗi loại dự án; nếu nó nói để làm một thư viện được chia sẻ thì nó viết các quy tắc để biên dịch một thư viện được chia sẻ; vv cho các loại mục tiêu khác.

trong ví dụ này: nếu bạn thêm SHOW_RULES = 1 vào dòng lệnh make, nó cũng hiển thị văn bản của các quy tắc được tạo bởi PROGRAM_target_setup_template; cùng với việc tự tạo ra các quy tắc (với eval).

# this one defines the target for real 
$(foreach prog, $(TARGETS), $(eval $(call PROGRAM_target_setup_template,$(prog)))) 

ifneq "$(SHOW_RULES)" "" 
$(foreach prog, $(TARGETS), $(info $(call PROGRAM_target_setup_template,$(prog)))) 
endif 
  • $ (gọi ...) gọi mẫu
  • $ (thông tin ...) in kết quả của mẫu thay thế; (Eval sẽ gọi phân tích cú pháp của sản lượng, bổ sung làm cho tập tin hiện tại)

Thông tin thêm về làm cho tôi tập tin ở đây: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html

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