Измерьте (профиль) время, проведенное в каждой цели Makefile - PullRequest
17 голосов
/ 06 августа 2011

Есть ли способ отразить (системное, пользовательское, реальное) время, потраченное на каждую цель из Makefile рекурсивно, когда я выполняю make all?

Я бы хотел оценить компиляцию проекта более детально, чем просто time make all. В идеале это должно было бы отображать дерево выполненной цели, каждая из которых имела время, потраченное на все ее зависимости. Было бы замечательно также, если бы он мог работать с -j (параллельный make). И, кстати, мой Makefile не является рекурсивным (не порождает другого экземпляра make для каждой основной цели).

Спасибо!

Ответы [ 2 ]

17 голосов
/ 06 августа 2011

Gnu Make использует переменную $ (SHELL) для выполнения команд в целях.

По умолчанию установлено значение /bin/sh.

.

Вы можете установить эту переменную в сценарий, который будет выполнять команду, заданную командой "time". Как то так:

В вашем make-файле укажите переменную SHELL, где-то вверху:

SHELL = ./report_time.sh

и в файле ./report_time.sh:

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

Заменить команду 'sh' на оригинальную SHELL, указанную в Makefile, если таковая имеется.

Это сообщит время.

Однако это не скажет вам, для какой цели выполняется сценарий report_time.sh. Одним из решений этой проблемы является добавление целевого имени ($ @) в каждую целевую запись в make-файле, чтобы оно также передавалось в сценарий report_time.sh.

2 голосов
/ 24 января 2019

римейк --profile является заменой для make.Он генерирует целевое дерево вызовов в формате callgrind.

...