Кислород медленный
Doxygen занимает около 12 часов, чтобы работать на нашей базе кода. Это в первую очередь потому, что для обработки требуется много кода (~1,5 млн строк). Однако он очень быстро приближается к тому моменту, когда мы не можем делать ночные обновления документации, потому что они занимают слишком много времени. Нам уже пришлось уменьшить глубину графика, чтобы уменьшить его до 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 вам нужен Doxy-файл, который включает файлы тегов компонентов 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 ГБ ОЗУ и Linux 64bit), включая просмотр исходного кода, полные графики вызовов и UML. диаграммы всех структур данных. Обратите внимание, что первый шаг занял всего 10 минут.
Для этого я создал скрипт для генерации Doxy-файла для каждого компонента на основе списка компонентов и их прямых зависимостей. На первом этапе я запускаю 8 экземпляров doxygen параллельно (используя http://www.gnu.org/s/parallel/). На втором этапе я запускаю 4 случая одновременного введения кислорода.
Смотрите http://www.doxygen.org/external.html для получения дополнительной информации о файлах тегов.