Как добавить внешние заголовочные файлы во время сборки bazel/tenorflow
Я пытаюсь добавить внешний файл заголовка (например, файл заголовка OpenCL) для экспериментов с тензорным потоком. Я попытался добавить это в файл BUILD в файле tenorflow/core/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 (в тензорном потоке /third_party) (например, ln -s /opt/opencl/), но он по-прежнему жалуется, что не нашел этот файл заголовков.
Если я добавляю файл внешнего заголовка напрямую (например, /opt/opencl/CL/), он жалуется, что внешние файлы не могут быть включены (или что-то подобное).
У меня нет пароля root для копирования этих файлов заголовков в / usr / include /.
Может кто-нибудь объяснить, как именно сделать внешние заголовочные файлы в tenorflow для сборки?
Спасибо за любую быструю помощь.
3 ответа
Я столкнулся с подобной проблемой, когда создавал TensorFlow с Intel MKL и мне пришлось добавить заголовки MKL. Мое решение заключается в следующем:
Создайте символическую ссылку на ваши заголовки в папке third_party, например:
<your tensorflow folder>/third_party/opencl/include -> /opt/OpenCL/include
с командой:
ln -s /opt/OpenCL/include <your tensorflow folder>/third_party/opencl
Создать простой файл BUILD в
<your tensorflow folder>/third_party/opencl
папка:cc_library( name = "opencl", hdrs = glob(["include/CL/*.h"]), visibility = ["//visibility:public"], )
Добавьте deps в целевую библиотеку:
cc_library( name = "all_kernels", visibility = ["//visibility:public"], copts = tf_copts() + ["-Ithird_party/opencl/include"], deps = [ "//third_party/opencl", ... ], )
Не забудьте добавить опции компилятора в целевую библиотеку, как показано выше, или просто в качестве флага для bazel:
bazel build --copt="-Ithird_party/opencl/include" ...
Вы должны добавить файлы как зависимость этого правила.
IIUC, у вас есть следующая структура:
tensorflow/
BUILD
WORKSPACE
tensorflow/
core/
BUILD
third_party/
include -> /opt/opencl/CL # or something like that
Вы хотите показать файлы.h так, чтобы Bazel мог понять / зависеть от них, поэтому откройте tensorflow/BUILD
файл и добавьте следующее:
cc_library(
name = "opencl",
hdrs = glob(["third_party/include/*.h"]),
visibility = ["//visibility:public"],
)
Это создает библиотеку C++ из файлов.h в файле third_party/include, от которой можно зависеть из любого места в исходном дереве.
Теперь иди в свой 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.
Bazel старается быть очень строгим, чтобы убедиться, что его сборки включают только те файлы, о которых он знает, чтобы убедиться, что они воспроизводимы. К сожалению, это может затруднить эксперименты. Правильный способ решения проблемы - создать файл BUILD и правило для заголовков, которые вы хотите включить. Вы можете взломать что-нибудь, возиться с папками, сгенерированными bazel-*, но я не рекомендую это делать.