正确地将命令行参数传递给clang / LLVM

时间:2017-01-21 01:57:16

标签: c++ cmake clang llvm

我有一个自定义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"

将参数传递给CMake

这对我来说有几个项目,但现在我尝试使用我的传递来构建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内部的情况下解决这个问题。

(*)解决此问题的另一种方法是指定CFLAGSCXXFLAGS,尽管我希望在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]:* * *等待未完成的工作......

0 个答案:

没有答案