Cmake: статистика компиляции

Мне нужно выяснить, какие единицы перевода нужно перестроить, чтобы улучшить время компиляции. Как мне получить время компиляции, используя cmake, для моих единиц перевода?

Ответ 1

Я ожидал бы заменить компилятор (и/или компоновщик) на "time original-cmd". Используя простой "make", я бы сказал:

make CC="time gcc"

Программа "время" будет запускать команду и отчет о времени, которое потребовалось. Эквивалентный механизм будет работать с "cmake". Если вам нужно взять команду, а также время, вы можете написать свою собственную команду, аналогичную времени (оболочка script), которая записывает нужные данные так, как вы хотите.

Ответ 2

Следующие свойства могут использоваться для компилятора времени и ссылок:

Эти свойства могут быть установлены глобально, для каждого каталога и для каждой цели. Таким образом, у вас может быть только подмножество ваших целей (например, тестов), на которые влияет это свойство. Также у вас могут быть разные "пусковые установки" для каждой цели, которые также могут быть полезны.

Имейте в виду, что использование "времени" напрямую не переносимо, потому что эта утилита недоступна на всех платформах, поддерживаемых CMake. Однако CMake предоставляет функциональность "времени" в своем режиме командной строки. Например:

# Set global property (all targets are impacted)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time")
# Set property for my_target only
set_property(TARGET my_target PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time")

Пример вывода CMake:

[ 65%] Built target my_target
[ 67%] Linking C executable my_target
Elapsed time: 0 s. (time), 0.000672 s. (clock)

Обратите внимание, что с CMake 3.4 только создатели Makefile и Ninja поддерживают эти свойства.

Также обратите внимание, что с CMake 3.4 cmake -E time возникают проблемы с пробелами внутри аргументов. Например:

cmake -E time cmake "-GUnix Makefiles"

будет интерпретироваться как:

cmake -E time cmake "-GUnix" "Makefiles"

Я отправил патч, который исправляет эту проблему.

Ответ 3

Чтобы расширить предыдущий ответ, вот конкретное решение, которое я только что написал, то есть он определенно работает на практике не только теоретически, но и использовался только одним человеком примерно три минуты, поэтому он, вероятно, имеет некоторые недостатки.

#!/bin/bash
{ time clang "[email protected]"; } 2> >(cat <(echo "clang [email protected]") - >> /tmp/results.txt)

Я положил две выше строки в /tmp/time-clang, а затем запустил

chmod +x /tmp/time-clang
cmake .. -DCMAKE_C_COMPILER=/tmp/time-clang
make

Вы можете использовать -DCMAKE_CXX_COMPILER=, чтобы скомпилировать компилятор С++ точно так же.

  • Я не использовал make -j8, потому что мне не хотелось, чтобы результаты чередовали чересчур.

  • Мне пришлось помещать явный hashbang #!/bin/bash в мой script, потому что оболочка по умолчанию (dash, я думаю?) на Ubuntu 12.04 была недовольна этими операторами перенаправления.