Ответ 1
Отъезд makdepend
Я работаю очень крупномасштабными проектами, где время компиляции очень длинное. Какие инструменты я могу использовать (предпочтительно с открытым исходным кодом) в Linux, чтобы найти наиболее загруженные файлы и оптимизировать их использование? Чтобы быть более ясным, мне нужен инструмент, который, учитывая зависимости, покажет мне, какие заголовки наиболее включены. Кстати, мы используем распределенную компиляцию
Отъезд makdepend
В ответах здесь вы найдете инструменты, которые отслеживают зависимости #include. Но нет упоминаний об оптимизации и т.д.
Кроме того, должна помочь книга "Разработка программного обеспечения большого масштаба С++".
Такие инструменты, как doxygen (используется с параметрами graphviz), могут генерировать графики зависимостей для включенных файлов... Я не знаю если они предоставят достаточный обзор для того, что вы пытаетесь сделать, но это может быть полезно попробовать.
Используя философию Unix для "склеивания многих небольших инструментов", я бы предложил написать короткий script, который вызывает gcc с параметрами -M (или -MM) и -MF (OUTFILE) (как описано здесь). Это создаст списки зависимостей для инструмента make, которые вы сможете легко проанализировать (относительно разбора исходных файлов напрямую) и извлечь необходимую информацию.
На корневом уровне исходного дерева и выполните следующие действия (\ t - символ табуляции):
find . -exec grep '[ \t]*#include[ \t][ \t]*["<][^">][">]' {} ';'
| sed 's/^[ \t]*#include[ \t][ \t]*["<]//'
| sed 's/[">].*$//'
| sort
| uniq -c
| sort -r -k1 -n
Строка 1 получает все включенные строки. Строка 2 отбрасывает все до фактического имени файла. Строка 3 удаляет конец строки, оставляя только имя файла. Строки 4 и 5 подсчитывают каждую уникальную строку. Строка 6 сортирует по количеству строк в обратном порядке.
Если вы хотите узнать, какие файлы включены больше всего, используйте эту команду bash:
найти. -name '.cpp' -exec egrep '^ [: space:] # include [[: space:]] + [ "<] [[: alpha:] [: digit:] _.] + [" > ] '{} \;
| сортировать | uniq -c | sort -k 1rn, 1
| head -20
Он отобразит 20 лучших файлов, оцененных по количеству раз, когда они были включены.
Объяснение: 1-я строка находит все *.cpp файлы и извлекает строки с директивой "#include". Вторая строка вычисляет, сколько раз каждый файл был включен, а 3-я строка занимает 20 в основном включенных файлов.
Используйте ccache. Он будет хешировать входы для компиляции и кэшировать результаты, что резко увеличит скорость этих видов компиляции.
Если вы хотите обнаружить несколько включений, чтобы вы могли их удалить, вы могли бы использовать makedepend, как предлагает Iulian Şerbănoiu:
makedepend -m *.c -f - > /dev/null
предоставит предупреждение для каждого из них.
Bash скрипты, найденные на странице, не являются хорошим решением. Он работает только на простой проект. На самом деле, в большом проекте, как и на титульном листе, часто используются C-препроцессор (#if, #else,...). Только хорошее программное обеспечение более сложное, например makedepend или scons может дать хорошую информацию. gcc -E может помочь, но, по большому проекту, его анализ результатов - это время траты.
IIRC gcc может создавать файлы зависимостей.
Возможно, вам стоит посмотреть на распределенную компиляцию, например, distcc
Это не совсем то, что вы ищете, и это может быть нелегко настроить, но, возможно, вы можете взглянуть на lxr: lxr.linux.no - это дерево с возможностью просмотра.
В поле поиска, если вы введете имя файла, оно даст вам, где оно включено. Но это все еще догадывается, и оно не отслеживает связанные с цепочкой зависимости.
Возможно
strace -e trace=open -o outfile make
grep 'some handy regex to match header'