Doxygen медленный

Doxygen занимает около 12 часов для работы на нашей кодовой базе. Это связано прежде всего с тем, что для обработки требуется много кода (~ 1.5M строк). Тем не менее, он очень быстро приближается к тому моменту, когда мы не можем обновлять документацию в ночное время, потому что они занимают слишком много времени. Нам уже пришлось уменьшить глубину графика, чтобы уменьшить его до 12 часов.

Я пробовал стандартные подходы, но мне действительно нужна высококачественная продукция, и это включает графики и SEARCH_INCLUDES. У меня неплохая машина для запуска Doxygen, но Doxygen не использует ее многие ядра. (Он привязывает один процессор к серверу сборки, но составляет лишь 4% от доступной системы.) Наличие многопоточной сборки Dot удобнее, хотя это примерно половина времени сборки.

Существуют ли какие-либо методы, которые я могу использовать для запуска doxygen через несколько процессов и вручную очертить задачу? Я видел некоторые разговоры о создании файлов тегов, но я недостаточно понимаю их, чтобы знать, будут ли они делать то, что я хочу. Я ищу что-то вроде:

doxygen Doxyfile-folder1
doxygen Doxyfile-folder2
doxygen Doxyfile-folder3
doxygen Doxyfile-folder4
doxygen-join output/folder1/html output/folder2/html output/folder3/html output/folder4/html

Конечно, я просто делаю что-то, но это идея того, что я ищу. Кроме того, я бы использовал намного больше, чем 4 процесса.

Ответ 1

Файлы тегов обычно подходят, если

  • у вас есть несколько логически когерентных исходных файлов (пусть их называют) и
  • вы знаете зависимости между компонентами, например. компонент A использует компоненты B и C, а компонент B использует только C и
  • Хорошо (или даже желательно), чтобы индексные файлы (например, список файлов/классов/функций) были ограничены одним компонентом.
  • вас интересует вывод HTML.

Файл тега - это всего лишь структурированный список символов со ссылками на расположение в документации. Файлы тегов позволяют doxygen делать ссылки из документации одного компонента на другую.

Это двухэтапный процесс:

  • Сначала вы запускаете doxygen для каждого компонента для создания файла тега для этого компонента. Вы можете сделать это, отключив весь вывод и используйте GENERATE_TAGFILE. Поэтому для компонента A, Doxyfile.tagonly будет иметь следующие настройки:

    GENERATE_HTML         = NO
    GENERATE_LATEX        = NO
    GENERATE_RTF          = NO
    GENERATE_MAN          = NO
    GENERATE_TAGFILE      = compA.tag
    

    Вы заметите, что запуск doxygen происходит очень быстро.

  • Второй шаг - создать фактическую документацию. Для компонента A вам нужен Doxyfile, который включает файлы тегов компонентов B и C, так как мы определили A, зависит от этих компонентов.

    GENERATE_HTML         = YES
    GENERATE_LATEX        = NO
    GENERATE_RTF          = NO
    GENERATE_MAN          = NO
    TAGFILES              = path/to/compB/compB.tag=path/to/compB/htmldocs \
                            path/to/compC/compC.tag=path/to/compC/htmldocs
    

Используя этот подход, я смог создать документацию для 20M + строк кода, распределенных более чем 1500 + компонентами менее чем за 3 часа на стандартном настольном ПК (Core i5 с 8 ГБ оперативной памяти и 64-битной Linux), включая просмотр исходного кода, графики полного вызова, и диаграммы в стиле UML всех структур данных. Обратите внимание, что первый шаг занял только 10 минут.

Для этого я создал script для создания Doxyfile для каждого компонента на основе списка компонентов и их прямых зависимостей. На первом этапе я запускаю 8 экземпляров doxygen параллельно (используя http://www.gnu.org/s/parallel/). На втором этапе я запускаю 4 экземпляра doxygen параллельно.

Подробнее о файлах тегов см. http://www.doxygen.org/external.html.