DInclude
dinclude - это небольшое консольное приложение, позволяющее проанализировать зависимости исходного кода, установленные посредством директив #include
.
Аргументы приложения
Синопсис
dinclude SOURCE_FILES_DIR [OPTIONS...]
Опции
Пути для любых аргументов могут быть как абсолютными, так и относительными к папке из которой запускается приложение.
-
SOURCE_FILES_DIR
- путь к директории содержащей файлы исходного кода для анализа. Опрос файлов происходит рекурсивно, т.е. все файлы, которые окажутся в под-директориях также принимают участие в анализе. В данной версии поддерживаются исходные файлы только с расширением*.hpp
либо*.cpp
(то же самое справедливо для алгоритма опроса вхождений - опрашиваются только*.hpp
и*.cpp
файлы). -
-I<dir> --include-directory[=]<dir>
- добавляет директорию к перечню путей для поиска зависимостей.
Алгоритм поиска
При анализе, приложение следует правилам описанным в стандарте ISO/IEC 9899:201x, секция 6.10.2 Source file inclusion, а именно:
- Для директивы вида
#include <h-char-sequence> new-line
поиск осуществляется относительно директорий, зависящих от реализации и аргументов комплиятора. Т.к. dinclude последней версии не берет в расчет какую-либо информацию о компиляторах, параметрах с которыми они используются и платформе, для которой из файлов исходного кода требуется собрать приложение, dinclude не может сделать обоснованное предположение о том где данные пути расположены и их необходимо указать в виде аргументов приложения.
- Для директивы вида
# include "q-char-sequence" new-line
поиск осуществляется относительно директории, в которой расположен файл содержащий исходный код. В случае неудачи, поиск указанного файла продолжится так, как если бы он был h-char-sequence
заключенной в в угловые скобки.
- Для директив вида
# include pp-tokens new-line
поиск зависимостей в данной версии не реализован.
Вывод данных
dinclude выводит в консоль дерево обнаруженных зависимостей, отражая "глубину" (относительно исходного файла) отступами. Для каждого файла dinclude подсчитывает количество "вхождений" (сколько раз данный файл включается в состав других файлов), в том числе косвенных (когда файл включен в состав других включенных файлов). Если в процессе опроса файлов, какой-либо оказался не найден, dinclude помечает его (!)
. Если в процессе поиска была обнаружена циклическая зависимость, поиск по данной ветке прекращается, однако первое вхождение, по которой цикл был выявлен, по-прежнему учавствует в подсчете вхождений, выводится в консоль и помечается (~)
.
Пример
dinclude ~/MyProject/src -I ~/MyProject/include
"main.cpp"
__"A.hpp"
____"B.hpp"
__"B.hpp"
"A.cpp"
__"A.hpp"
____"B.hpp"
"B.cpp"
__"B.hpp"
"C.cpp"
__"C.hpp"
__"D.hpp"(!)
__"E.hpp"
____"C.cpp"(~)
"B.hpp" 4
"A.hpp" 2
"C.hpp" 1
"C.cpp" 1
"D.hpp" 1
"E.hpp" 1
"A.cpp" 0
"B.cpp" 0
"main.cpp" 0
Для данного примера файл соответствующий вхождению D.hpp
не был найден, а вхождение C.cpp
в E.hpp
помечено как циклическое.