2011-08-06 26 views
16

Có cách nào để phản hồi thời gian (hệ thống, người dùng, thực) được chi tiêu trong mỗi mục tiêu của Makefile đệ quy khi tôi làm make all?Đo lường thời gian dành cho mỗi mục tiêu của Makefile

Tôi muốn đánh giá quá trình biên soạn dự án theo cách chi tiết hơn chỉ là time make all. Lý tưởng nhất, nó sẽ lặp lại một cây của mục tiêu được thực hiện, mỗi cái với thời gian dành cho tất cả các phụ thuộc của nó. Nó cũng sẽ tuyệt vời nếu nó có thể hoạt động với -j (làm song song). Và bằng cách này, Makefile của tôi không được đệ quy (không sinh ra một cá thể make khác cho mỗi mục tiêu chính).

Cảm ơn!

Trả lời

14

Gnu Make sử dụng biến $ (SHELL) để thực hiện các lệnh trong các mục tiêu.

Theo mặc định, nó được đặt thành/bin/sh.

Bạn có thể đặt biến này thành tập lệnh sẽ thực thi lệnh được cung cấp bằng lệnh "thời gian". Một cái gì đó như thế này:

Trong makefile của bạn định biến SHELL, đâu đó ở đầu trang:

SHELL = ./report_time.sh 

và trong file ./report_time.sh:

#!/bin/sh 
shift # get rid of the '-c' supplied by make. 
time sh -c "$*" 

Các thay thế 'sh 'lệnh với SHELL ban đầu được chỉ định trong Makefile nếu có.

Điều này sẽ báo cáo thời gian.

Tuy nhiên Điều này sẽ không cho bạn biết mục tiêu của tập lệnh report_time.sh đang chạy. Một giải pháp cho việc này là thêm tên mục tiêu ($ @) vào mỗi mục tiêu trong tệp makefile để nó cũng được chuyển tới kịch bản report_time.sh.

+1

Cảm ơn bạn đã trả lời nhanh chóng và hữu ích! Nó tốt, nhưng nó sẽ chỉ báo cáo thời gian của 'lá' của cây phụ thuộc biên dịch (các lệnh thực tế), không phải là thời gian của mục tiêu trung gian (ví dụ: .PHONY). Tôi đoán nó sẽ phải là một tính năng được xây dựng trong 'make' cho điều này là có thể ... – mqtthiqs

+0

thời gian là một lệnh nhúng của bash (và có thể các shell khác), nhưng * not * dash là mặc định trên nhiều bản phân phối. Tôi khuyên bạn nên sử dụng '#!/Bin/bash' cho tập lệnh này để tránh các sự cố –

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