llvmbazelllvm-config

Call llvm-config --prefix and use it in a BUILD rule


I have a following rule in WORKSPACE:

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

I would like to now use hardcoded path for llvm. llvm-config --prefix can give me the directory for llvm. What is the correct way to get this? Can I just use standard python commands (e.g. subprocess package)?


Solution

  • As @abergmeier said, you can create a custom repository rule, run the command, create a symlink pointing to its output, and create a BUILD file for the repository:

    WORKSPACE file:

    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 = [])
    

    Targets in the repo:

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

    Generated files:

    $ 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")