2010-03-10 44 views
7

Có cách nào để ghi lại các lệnh, thực hiện các lệnh gọi để biên dịch chương trình không? Tôi biết các thông số -n-p nhưng chúng không giải quyết được các điều kiện nếu chỉ in ra. Hoặc họ không làm việc, khi có các cuộc gọi để 'làm' chính nó trong Makefile.Đăng nhập các lệnh gọi thực hiện

Trả lời

1

Bạn có thể tìm thấy những gì bạn đang tìm kiếm trong nhật ký dựng chú thích được tạo bởi SparkBuild. Điều đó bao gồm các lệnh của mọi quy tắc được thực hiện trong bản dựng, có hay không "@" được sử dụng để ngăn không cho in từ dòng lệnh.

Nhận xét của bạn về điều kiện nếu có chút khó hiểu: bạn có đang nói về cấu trúc vỏ hay tạo cấu trúc không? Nếu bạn có nghĩa là cấu trúc vỏ, tôi không nghĩ rằng có bất kỳ cách nào để bạn có được chính xác những gì bạn đang sau ngoại trừ bằng cách sử dụng strace như những người khác mô tả. Nếu bạn muốn tạo cấu trúc, thì đầu ra bạn thấy kết quả của biểu thức điều kiện được giải quyết.

+0

Chúng có vẻ là cấu trúc vỏ.Nhưng tôi không biết, tại sao ai đó muốn sử dụng các cấu trúc shell trong Makefiles, khi bạn có thể sử dụng các cấu trúc Makefile. Họ có tốt hơn theo cách nào đó không? – Customizer

+0

Tôi SparkBuild trông thú vị. Tôi chắc chắn sẽ xem xét điều này. – Customizer

+1

Câu hỏi về cấu trúc vỏ so với cấu trúc tạo phụ thuộc vào những gì bạn đang cố gắng thực hiện. Đối với một điều, có những thứ bạn có thể làm với các cấu trúc shell mà bạn không thể làm với các cấu trúc, như kiểm tra xem một tệp có thể đọc được hay thực thi được không. Đối với cái khác, chúng được đánh giá tại các thời điểm khác nhau đối với các lệnh khác trong thân quy tắc: tạo các cấu trúc được đánh giá trước khi bất kỳ lệnh nào được thực thi, nhưng cấu trúc vỏ sẽ được đánh giá tại chỗ khi các lệnh được thực thi. –

0

Bạn đã thử với tham số -d (gỡ lỗi) chưa?

Lưu ý rằng bạn có thể kiểm soát số lượng thông tin bằng --debug thay thế. Ví dụ, --debug = a (giống như -d), hoặc --debug = b để chỉ hiển thị infos cơ bản ...

+0

Không quên chuyển hướng stdout sang tệp, làm cho -d tạo ra rất nhiều thông tin rất nhanh chóng. –

1

Bạn có thể thử đăng nhập execve cuộc gọi với strace

strace -f -e execve make ... 
+0

Đó là một công cụ tốt. Chưa nghe về nó. Nhưng nó tạo ra rất nhiều đầu ra, tôi không cần trong trường hợp này. – Customizer

+0

Strace là một công cụ để theo dõi tất cả các cuộc gọi hệ thống (trong ví dụ của tôi giới hạn chỉ với execv), vì vậy có nó sẽ có thể cung cấp cho bạn nhiều hơn mức tối thiểu bạn đang tìm kiếm (cụ thể là nó sẽ in tất cả (thất bại) tất cả các thư mục $ PATH). – hlovdal

2

Make viết mỗi lệnh thực thi nó vào giao diện điều khiển, vì vậy

make 2>&1 | tee build.log 

sẽ tạo ra một tập tin đăng nhập tên build.log như một tác dụng phụ, trong đó có những thứ tương tự ghi vào màn hình. (man tee để biết thêm chi tiết.)

2>&1 kết hợp đầu ra tiêu chuẩn và lỗi thành một luồng. Nếu bạn không bao gồm điều đó, đầu ra thường xuyên sẽ đi vào tệp nhật ký nhưng các lỗi sẽ chỉ đi tới bàn điều khiển. (make chỉ ghi vào stderr khi một lệnh trả về một mã lỗi.)

Nếu bạn muốn ngăn chặn đầu ra hoàn toàn ủng hộ việc khai thác gỗ vào một tập tin, nó thậm chí còn đơn giản hơn:

make 2>&1 > build.log 

Bởi vì những chỉ chụp giao diện điều khiển đầu ra chúng hoạt động tốt với đệ quy make.

+0

Lệnh được bắt đầu bằng @ (im lặng thực hiện) không được bao gồm trong nhật ký này, thật không may. –

7

này

make SHELL="sh -x" 

sẽ gây ra vỏ (mà làm cho gọi để đánh giá cấu trúc vỏ) để in thông tin về những gì nó làm, cho phép bạn xem có bao bất kỳ điều kiện trong các lệnh shell đang được đánh giá.

+0

Đây là câu trả lời hữu ích – tonylo

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