如何在bazel / tensorflow构建期间添加外部头文件

时间:2016-06-11 08:10:41

标签: tensorflow bazel

我正在尝试添加外部头文件(如OpenCL头文件)进行tensorflow的一些实验。我尝试将其添加到tensorflow / core / BUILD文件下的BUILD文件中:

# This includes implementations of all kernels built into TensorFlow.
cc_library(
    name = "all_kernels",
    visibility = ["//visibility:public"],
    copts = tf_copts() + ["-Ithird_party/include"],    <==== this is the line I added

我还在这个目录中创建了一个软链接,来自OpenCL驱动程序(在tensorflow / third_party下)这些头文件的位置(如ln -s / opt / opencl /),但它仍然抱怨它没有找到头文件。

如果我直接添加外部头文件(例如/ opt / opencl / CL /),它会抱怨外部文件不能被包含(或者某些东西)。

我没有root密码将这些头文件复制到/ usr / include /中。

有人可以解释如何将外部头文件准确地转换为tensorflow进行构建吗?

感谢您的快速帮助。

3 个答案:

答案 0 :(得分:3)

当我使用英特尔MKL构建TensorFlow并且必须添加MKL标头时,我遇到了类似的问题。我的解决方案如下:

  1. 将标题符号链接创建到third_party文件夹中,例如:

    <your tensorflow folder>/third_party/opencl/include -> /opt/OpenCL/include
    

    使用命令:

    ln -s /opt/OpenCL/include <your tensorflow folder>/third_party/opencl
    
  2. <your tensorflow folder>/third_party/opencl文件夹中创建简单的BUILD文件:

    cc_library(
        name = "opencl",
        hdrs = glob(["include/CL/*.h"]),
        visibility = ["//visibility:public"],
    )
    
  3. 将deps添加到目标库中:

    cc_library(
        name = "all_kernels",
        visibility = ["//visibility:public"],
        copts = tf_copts() + ["-Ithird_party/opencl/include"],
        deps = [
            "//third_party/opencl", 
            ...
        ],
    )
    
  4. 不要忘记将编译器选项添加到目标库中,如上所示,或者只是作为bazel的标志:

     bazel build --copt="-Ithird_party/opencl/include" ...
    

答案 1 :(得分:2)

您必须将文件添加为此规则的依赖项。

IIUC,您有以下结构:

tensorflow/
  BUILD
  WORKSPACE
  tensorflow/
    core/
      BUILD
  third_party/
    include -> /opt/opencl/CL # or something like that

您希望以Bazel可以理解/依赖的方式公开.h文件,因此打开tensorflow/BUILD文件并添加以下内容:

cc_library(
    name = "opencl",
    hdrs = glob(["third_party/include/*.h"]),
    visibility = ["//visibility:public"],
)

这将从third_party / include下的.h文件创建一个C ++库,可以从源树中的任何位置依赖它。

现在转到您的tensorflow/core/BUILD文件并在那里向cc_library添加依赖项:

cc_library(
    name = "all_kernels",
    visibility = ["//visibility:public"],
    copts = tf_copts() + ["-Ithird_party/include"],
    deps = [
        "//:opencl", 
        # plus any other deps
    ],
)

设置copts只会在运行gcc时更改标志。向依赖项添加//:opencl告诉Bazel在运行gcc时使这些文件可用。

答案 2 :(得分:0)

Bazel试图非常严格地确保其构建仅包含它知道的文件,以确保它们是可重现的。不幸的是,这可能使其难以进行实验。解决问题的正确方法是为要包含的标头创建BUILD文件和规则。您也可以通过搞乱bazel- *生成的文件夹来破解某些东西,但我不推荐它。