我有一个自定义LLVM传递,可以使用命令行选项激活:
static cl::opt<bool> MyPass("mypass", cl::init(false));
现在,使用clang
我可以调用这样的通道:clang -mllvm -mypass
。
建设项目,例如使用CMake,我会使用-DCMAKE_C_FLAGS="-mllvm -mypass" -DCMAKE_CXX_FLAGS="-mllvm -mypass"
这对我来说有几个项目,但现在我尝试使用我的传递来构建LLVM。使用上面的boolean标志声明我会在构建过程中遇到错误:
clang(LLVM选项解析):对于-mypass选项:可能只发生零次或一次!
我一直认为,当有重复的标志(CFLAGS
/ CXXFLAGS
)时,只会计算最后一个标志。这在我的情况下并不坏,因为它只是一个布尔标志。
LLVM文档显示可以使用另一个cl选项:cl::ZeroOrMore
。这解决了上面的错误信息。 (*)
然而,这导致了下一个错误:
llvm-tblgen:/LLVM/src/lib/Support/CommandLine.cpp:278:void(匿名命名空间):: CommandLineParser :: registerCategory(llvm :: cl :: OptionCategory *):断言`count_if(RegisteredOptionCategories, [cat](const OptionCategory * Category){return cat-&gt; getName()== Category-&gt; getName();})== 0&amp;&amp; &#34;重复选项类别&#34;&#39;失败。
上述错误的解决方案以及替代解决方案(*)(**)会发生这种情况。
我现在的问题是:我是否错误地传递了这个论点?这只是一个关于如何组织CMakeLists.txt和/或Makefile的问题(例如,通过重用CFLAGS
CXXFLAGS
,从而复制自定义标志)?
如果可能的话,我想在不必修改LLVM内部的情况下解决这个问题。
(*)解决此问题的另一种方法是指定CFLAGS
或CXXFLAGS
,尽管我希望在C和C ++代码上运行传递。
(**)实际上,在构建LLVM时仅指定CFLAGS
工作正常,因为少数C文件无论出于何种原因都不会触发错误。但是,指定CXXFLAGS
。
修改
关于CMake&amp; amp;的评论可能重复:
这不是引用问题的重复 - 我不打算修改项目的构建系统,而只是将另一个标志传递给clang / llvm(通过命令行参数)。
基本上,我想下载任何项目的源代码,然后构建该项目(使用我的传递),而不必修改其CMakeLists.txt。
断言错误的Stacktrace:
llvm-tblgen:/LLVM/src/lib/Support/CommandLine.cpp:278:void(匿名命名空间):: CommandLineParser :: registerCategory(llvm :: cl :: OptionCategory *):断言`count_if(RegisteredOptionCategories, [cat](const OptionCategory * Category){return cat-&gt; getName()== Category-&gt; getName();})== 0&amp;&amp; &#34;重复选项类别&#34;&#39;失败。
中止(核心倾倒)
tools / clang / include / clang / Driver / CMakeFiles / ClangDriverOptions.dir / build.make:91:目标&#39; tools / clang / include / clang / Driver / Options.inc.tmp&#39;失败
make [2]:* * * [tools / clang / include / clang / Driver / Options.inc.tmp]错误134
CMakeFiles / Makefile2:20791:目标&#39; tools / clang / include / clang / Driver / CMakeFiles / ClangDriverOptions.dir / all&#39;失败
make [1]:* * * [tools / clang / include / clang / Driver / CMakeFiles / ClangDriverOptions.dir / all]错误2
make [1]:* * *等待未完成的工作......