Я работаю с Clang Libtooling. Мне нужно запустить мой clang MyFrontendAction для определенных файлов, указанных в командной строке.
CommonOptionsParser OptionsParser(argc, argv, MyToolCategory);
ClangTool Tool(OptionsParser.getCompilations(), OptionsParser.getSourcePathList());
int i=Tool.run(newFrontendActionFactory<MyFrontendAction>().get());
Я управляю им:
./(driver) file1 file2 --
и он запускает мой инструмент как на file1, так и на file2. Я просто хочу, чтобы он работал на file1, и хочу сделать что-то еще с file2. Как мне это сделать?
Вы можете создать свои собственные (модифицированные) argc и argv и передать их конструктору OptionsParser.
int my_argc = argc - 1;
const char *my_argv[my_argc];
for (int i = 0; i < my_argc; ++i) my_argv[i] = argv[i];
const char *extra_file = argv[argc - 1];
Теперь у вас есть my_argv, который содержит командную строку для предоставления вашего инструмента и extra_file с file2. Затем просто продолжайте как обычно:
CommonOptionsParser OptionsParser(my_argc, my_argv, MyToolCategory);
// etc.
Если это не тривиальный инструмент, и вы хотите разрешить обычные аргументы, вам придется сделать что-то более изощренное. Например, вы можете создать CommonOptionsParser с исходным набором аргументов, затем прочитать результаты getSourcePathList () и сопоставить вторую строку в вашем исходном argv, чтобы исключить его. Затем вы можете создать второй CommonOptionsParser для фактического использования в вашем ClangTool.