用Bazel构建LLVM

用Bazel构建LLVM,llvm,bazel,Llvm,Bazel,我有一个项目目前正在使用CMake,我想切换到Bazel。主要依赖项是LLVM,我使用它生成LLVM IR。环顾四周,似乎没有太多关于这方面的指导,因为只有TensorFlow似乎使用Bazel的LLVM(据我所知,它会自动生成配置)。我还发现了一个关于类似问题的讨论,尽管我试图复制它的尝试失败了 目前,我最好的跑步方式是(fetcher.bzl): 然后,我的工作区文件如下所示: load(":fetcher.bzl", "get_llvm") git_repository( nam

我有一个项目目前正在使用CMake,我想切换到Bazel。主要依赖项是LLVM,我使用它生成LLVM IR。环顾四周,似乎没有太多关于这方面的指导,因为只有TensorFlow似乎使用Bazel的LLVM(据我所知,它会自动生成配置)。我还发现了一个关于类似问题的讨论,尽管我试图复制它的尝试失败了

目前,我最好的跑步方式是(
fetcher.bzl
):

然后,我的
工作区
文件如下所示:

load(":fetcher.bzl", "get_llvm")

git_repository(
    name = "gflags",
    commit = "46f73f88b18aee341538c0dfc22b1710a6abedef", # 2.2.1
    remote = "https://github.com/gflags/gflags.git",
)

new_http_archive(
    name = "gtest",
    url = "https://github.com/google/googletest/archive/release-1.8.0.zip",
    sha256 = "f3ed3b58511efd272eb074a3a6d6fb79d7c2e6a0e374323d1e6bcbcc1ef141bf",
    build_file = "gtest.BUILD",
    strip_prefix = "googletest-release-1.8.0",
)

get_llvm(name = "llvm")
然后,我将使用
bazel build@llvm/:lib--verbose\u failures
运行此程序

我会不断地从丢失的头文件中得到错误。最后,我发现运行
cmakellvmmaster
会在当前目录中生成许多头文件,但似乎会将未生成的头文件留在
llvmmaster/
中。我在
llvm master/
下添加了相同的include目录,这似乎捕获了很多文件。然而,目前看来
tblgen
没有运行,我仍然缺少编译所需的关键头。我当前的错误是:

In file included from external/llvm/llvm-master/include/llvm/CodeGen/MachineOperand.h:18:0,
                 from external/llvm/llvm-master/include/llvm/CodeGen/MachineInstr.h:24,
                 from external/llvm/llvm-master/include/llvm/CodeGen/MachineBasicBlock.h:22,
                 from external/llvm/llvm-master/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h:20,
                 from external/llvm/llvm-master/include/llvm/CodeGen/GlobalISel/ConstantFoldingMIRBuilder.h:13,
                 from external/llvm/llvm-master/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp:10:
external/llvm/llvm-master/include/llvm/IR/Intrinsics.h:42:38: fatal error: llvm/IR/IntrinsicEnums.inc: No such file or directory
特别是试图查找此文件时,我没有看到任何
IntrinsicEnums.inc
IntrinsicEnums.h
,或
IntrinsicEnums.dt
。我确实看到了很多
instrinsic*.td
,所以可能其中一个生成了这个特定的文件

似乎
tblgen
应该将
*.td
文件转换为
*.h
*.cpp
文件(如果我有误解,请纠正我)。然而,这似乎没有运行。我在Tensorflow的项目中看到,他们有一个
gentbl()
BUILD宏,尽管复制它对Tensorflow的其他构建基础设施有太多的依赖性,这对我来说并不实际


如果没有像Tensorflow的系统这样庞大复杂的东西,有没有办法做到这一点呢?

我在llvm开发人员邮件列表上发布了一些有趣的回复。LLVM显然不是为支持Bazel而设计的,也不是特别好。从理论上讲,使用Ninja输出所有编译命令,然后从Bazel中使用它们似乎是可行的。这可能非常困难,需要一个单独的工具来输出Skylark代码,由Bazel运行

对于我所从事的项目规模来说,这似乎相当复杂,所以我的解决办法是从下载预构建的二进制文件。这包括所有必要的头文件、库和工具二进制文件。我在Bazel为我的定制编程语言制作了一个简单但功能强大的工具链

简单示例(有限但重点突出):


完整示例(更复杂,重点更少):

最近在开发者列表中重新讨论了这一点。
In file included from external/llvm/llvm-master/include/llvm/CodeGen/MachineOperand.h:18:0,
                 from external/llvm/llvm-master/include/llvm/CodeGen/MachineInstr.h:24,
                 from external/llvm/llvm-master/include/llvm/CodeGen/MachineBasicBlock.h:22,
                 from external/llvm/llvm-master/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h:20,
                 from external/llvm/llvm-master/include/llvm/CodeGen/GlobalISel/ConstantFoldingMIRBuilder.h:13,
                 from external/llvm/llvm-master/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp:10:
external/llvm/llvm-master/include/llvm/IR/Intrinsics.h:42:38: fatal error: llvm/IR/IntrinsicEnums.inc: No such file or directory