Я работаю очень крупномасштабными проектами, где время компиляции очень длинное. Какие инструменты я могу использовать (предпочтительно с открытым исходным кодом) в Linux, чтобы найти наиболее загруженные файлы и оптимизировать их использование? Чтобы быть более ясным, мне нужен инструмент, который, учитывая зависимости, покажет мне, какие заголовки наиболее включены. Кстати, мы используем распределенную компиляцию
Как найти зависимости заголовков для крупномасштабных проектов на linux
Ответ 1
Отъезд makdepend
Ответ 2
В ответах здесь вы найдете инструменты, которые отслеживают зависимости #include. Но нет упоминаний об оптимизации и т.д.
Кроме того, должна помочь книга "Разработка программного обеспечения большого масштаба С++".
Ответ 3
Такие инструменты, как doxygen (используется с параметрами graphviz), могут генерировать графики зависимостей для включенных файлов... Я не знаю если они предоставят достаточный обзор для того, что вы пытаетесь сделать, но это может быть полезно попробовать.
Ответ 4
Используя философию Unix для "склеивания многих небольших инструментов", я бы предложил написать короткий script, который вызывает gcc с параметрами -M (или -MM) и -MF (OUTFILE) (как описано здесь). Это создаст списки зависимостей для инструмента make, которые вы сможете легко проанализировать (относительно разбора исходных файлов напрямую) и извлечь необходимую информацию.
Ответ 5
На корневом уровне исходного дерева и выполните следующие действия (\ 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 сортирует по количеству строк в обратном порядке.
Ответ 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 в основном включенных файлов.
Ответ 7
Используйте ccache. Он будет хешировать входы для компиляции и кэшировать результаты, что резко увеличит скорость этих видов компиляции.
Если вы хотите обнаружить несколько включений, чтобы вы могли их удалить, вы могли бы использовать makedepend, как предлагает Iulian Şerbănoiu:
makedepend -m *.c -f - > /dev/null
предоставит предупреждение для каждого из них.
Ответ 8
Bash скрипты, найденные на странице, не являются хорошим решением. Он работает только на простой проект. На самом деле, в большом проекте, как и на титульном листе, часто используются C-препроцессор (#if, #else,...). Только хорошее программное обеспечение более сложное, например makedepend или scons может дать хорошую информацию. gcc -E может помочь, но, по большому проекту, его анализ результатов - это время траты.
Ответ 9
IIRC gcc может создавать файлы зависимостей.
Ответ 10
Возможно, вам стоит посмотреть на распределенную компиляцию, например, distcc
Ответ 11
Это не совсем то, что вы ищете, и это может быть нелегко настроить, но, возможно, вы можете взглянуть на lxr: lxr.linux.no - это дерево с возможностью просмотра.
В поле поиска, если вы введете имя файла, оно даст вам, где оно включено. Но это все еще догадывается, и оно не отслеживает связанные с цепочкой зависимости.
Возможно
strace -e trace=open -o outfile make
grep 'some handy regex to match header'