源码中如何对选项进行解析
参考clang/tools/driver
clang中使用下面的方法来对clang的命令行进行解析。
C++
Opts.LLVMArgs = Args.getAllArgValues(OPT_mllvm); # 获得所有-mllvm后的内容
Opts.OutputPath = std::string(Args.getLastArgValue(OPT_o)); # 获得 -o 后的文件名
OPT_mllvm和OPT_o等的定义见编译出来的Options.inc,由同名的Options.td编译出来,如clang/include/clang/Driver/Options.td。
C++
enum ID {
OPT_INVALID = 0, // This is not an option ID.
#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__),
#include "clang/Driver/Options.inc"
LastOption
#undef OPTION
};
}
以下代码使-mllvm后的内容生效
C++
// Honor -mllvm.
//
// FIXME: Remove this, one day.
if (!Asm.LLVMArgs.empty()) {
unsigned NumArgs = Asm.LLVMArgs.size();
auto Args = std::make_unique<const char*[]>(NumArgs + 2);
Args[0] = "clang (LLVM option parsing)";
for (unsigned i = 0; i != NumArgs; ++i)
Args[i + 1] = Asm.LLVMArgs[i].c_str();
Args[NumArgs + 1] = nullptr;
llvm::cl::ParseCommandLineOptions(NumArgs + 1, Args.get());
}
ParseFrontendArgs()函数会parse前端所有的选项, 该函数被bool CompilerInvocation::CreateFromArgsImpl()所调用。