Как найти зависимости заголовков для крупномасштабных проектов на linux

Я работаю очень крупномасштабными проектами, где время компиляции очень длинное. Какие инструменты я могу использовать (предпочтительно с открытым исходным кодом) в Linux, чтобы найти наиболее загруженные файлы и оптимизировать их использование? Чтобы быть более ясным, мне нужен инструмент, который, учитывая зависимости, покажет мне, какие заголовки наиболее включены. Кстати, мы используем распределенную компиляцию

Ответ 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'