Я пишу инструмент для анализа проектов исходного кода семейства C, в основном следуя этим двум учебникам 1 2 на clang 3.4 (ствол 192426) на ubuntu 12.04.
На основе официального руководства, он говорит, что я мог бы пройти compile_commands.json
на -p
, однако, если я набираю только $ ./main -p [path of compile_commands.json]
, он будет жаловаться на отсутствие позиционных аргументов. Похоже, мне все равно нужно передать все имена файлов в качестве аргументов, что нецелесообразно, если проект действительно огромен. Я предпочитаю, чтобы он мог просто анализировать все файлы, указанные в compile_commands.json
, без запроса, но не могу узнать, как включить это.
Так как я не могу найти учебник для CommonOptionsParser, чтобы выполнить любую настройку, я использую CompilationDatabase. Существует фиктивный посетитель, возвращающий true
для VisitStmt
, VisitDecl
и VisitType
, поэтому я пропущу это. Функция main
довольно проста:
int main(int argc, const char **argv) {
string errorMsg = "";
CompilationDatabase *cd = CompilationDatabase::autoDetectFromDirectory (argv[1], errorMsg);
ClangTool Tool(*cd, cd->getAllFiles());
int result = Tool.run(newFrontendActionFactory<ExampleFrontendAction>());
return result;
}
Я выбираю opencv
для синтаксического анализа, так как с помощью cmake gaurantee правильность compile_commands.json
(справа?). Однако появляется много ошибок (прилагается в конце). LibTooling жалуется, что не может найти stdarg.h
, stddef.h
и emmintrin.h
. Это FAQ для clang, но он говорит, почему это произойдет, но не сказал, как решить это при использовании libtooling. Передайте все аргументы для clang -###
, поскольку clang может решить это, но как передать эти аргументы при использовании libtooling?
# include <stdarg.h>
^
1 error generated.
Error while processing /home/jcwu/repos/opencv/3rdparty/openexr/IlmImf/ImfCompressionAttribute.cpp.
In file included from /home/jcwu/repos/opencv/3rdparty/libjpeg/jmemansi.c:16:
/home/jcwu/repos/opencv/3rdparty/libjpeg/jinclude.h:35:10: fatal error: 'stddef.h' file not found
#include <stddef.h>
^
1 error generated.
Error while processing /home/jcwu/repos/opencv/3rdparty/libjpeg/jmemansi.c.
error: no suitable precompiled header file found in directory '/home/jcwu/repos/opencv/modules/legacy/precomp.hpp.gch'
1 error generated.
Error while processing /home/jcwu/repos/opencv/modules/legacy/src/hmmobs.cpp.
In file included from /home/jcwu/repos/opencv/3rdparty/libwebp/enc/quant.c:17:
In file included from /home/jcwu/repos/opencv/3rdparty/libwebp/enc/../dsp/../enc/vp8enci.h:17:
/usr/include/string.h:34:10: fatal error: 'stddef.h' file not found
#include <stddef.h>
^
1 error generated.
Error while processing /home/jcwu/repos/opencv/3rdparty/libwebp/enc/quant.c.
In file included from /home/jcwu/repos/opencv/modules/imgproc/opencv_test_imgproc_pch_dephelp.cxx:1:
In file included from /home/jcwu/repos/opencv/modules/imgproc/test/test_precomp.hpp:12:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/iostream:40:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/ostream:40:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/ios:39:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/iosfwd:42:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/postypes.h:42:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/cwchar:46:
/usr/include/wchar.h:40:11: fatal error: 'stdarg.h' file not found
# include <stdarg.h>
==== Обновление ====
Считать исходный код CommonOptionsParser.cpp. Он использует FixedCompilationDatabase, чтобы угадать CompilationDatabase по аргументам после -, а затем передать аргументы до - для пользовательских (только -p в CommonOptionParser) опций. В моем случае требуется compile_commands.json, поэтому я могу пропустить с помощью CommonOptionsParser.
Поэтому моя проблема сводится к тому, как передать эти параметры из "clang - ###" в LibTooling, когда у меня есть compile_commands.json? Должен ли я вызвать команду оболочки для каждого файла, который я хочу проанализировать?
==== Обновление ====
Я думаю, что изменить compile_commands.json может быть проще. Я не уверен, почему compile_commands.json, сгенерированный CMake, не будет корректно содержать папку с файлами системных заголовков, так как Makefile, сгенерированный этим CMakeList.txt, может скомпилироваться правильно, почему compile_commands.json пропускает много вещей.