Вызовите llvm-config --prefix и используйте его в правиле BUILD

У меня есть следующее правило в WORKSPACE:

new_local_repository(
    name = "llvm",
    path = "/opt/local/libexec/llvm-4.0",
    build_file= "llvm.BUILD")

Я хотел бы сейчас использовать жестко закодированный путь для llvm. llvm-config --prefix можете дать мне каталог для llvm. Как правильно это получить? Могу ли я просто использовать стандартные команды Python (например, subprocess пакет)?

2 ответа

Решение

Как сказал @abergmeier, вы можете создать собственное правило репозитория, выполнить команду, создать символическую ссылку, указывающую на ее вывод, и создать файл BUILD для репозитория:

Файл РАБОЧЕГО МЕСТА:

workspace(name = "io_bazel")

load("//foo:repo.bzl", "llvm_configure")

llvm_configure(name = "local_config_llvm")

Foo/repo.bzl:

def _impl(repository_ctx):
  result = repository_ctx.execute(["echo", "/tmp/dummy/path"])
  llvm_path = result.stdout.splitlines()[0]
  repository_ctx.symlink(llvm_path, "llvm-4.0")
  repository_ctx.file("BUILD", """
filegroup(
    name = "llvm_files",
    srcs = glob(["llvm-4.0/**"]),
    visibility = ["//visibility:public"],
)
""")

llvm_configure = repository_rule(
    implementation=_impl,
    local = True,
    environ = [])

Цели в репо:

$ bazel query @local_config_llvm//:*
@local_config_llvm//:llvm_files
@local_config_llvm//:llvm-4.0/a.txt
@local_config_llvm//:BUILD

Сгенерированные файлы:

$ ls -la $(bazel info output_base)/external/local_config_llvm
total 16
drwxr-x--- 2 laszlocsomor eng 4096 May 12 13:06 .
drwxr-x--- 6 laszlocsomor eng 4096 May 12 13:06 ..
-rwxr-x--x 1 laszlocsomor eng  115 May 12 13:06 BUILD
lrwxrwxrwx 1 laszlocsomor eng   15 May 12 13:06 llvm-4.0 -> /tmp/dummy/path
-rw-r----- 1 laszlocsomor eng  116 May 12 13:06 WORKSPACE


$ cat $(bazel info output_base)/external/local_config_llvm/BUILD

filegroup(
    name = "llvm_files",
    srcs = glob(["llvm-4.0/**"]),
    visibility = ["//visibility:public"],
)


$ cat $(bazel info output_base)/external/local_config_llvm/WORKSPACE
# DO NOT EDIT: automatically generated WORKSPACE file for llvm_configure rule
workspace(name = "local_config_llvm")

Вы можете создать собственный repository_rule, в котором вы можете вызвать repository_ctx.execute("llvm-config --prefix") и сделать это значение доступным в вашем пакете.

Я бы посоветовал вам сначала прочитать о repository_rule и если что-то не понятно, не стесняйтесь спрашивать.

Другие вопросы по тегам