簡體   English   中英

如何在bazel規則中獲取WORKSPACE目錄

[英]How to get WORKSPACE directory in bazel rule

我為了使用鐺之類的工具clang-formatclang-tidy或生成 匯編數據庫這樣,我需要知道.bzl文件中的工作空間目錄。 我怎樣才能獲得它? 考慮以下示例,我只想打印工作區中所有 src 文件的完整路徑:

# simple_example.bzl

def _impl(ctx):
  workspace_dir = // ---> what comes here? <---
  command = "\n".join([echo %s/%s" % (workspace_dir, f.short_path) 
                       for f in ctx.files.srcs])

  ctx.actions.write(
      output=ctx.outputs.executable,
      content=command,
      is_executable=True)


echo_full_path = rule(
    implementation=_impl,
    executable=True,
    attrs={
      "srcs": attr.label_list(allow_files=True),
    }
)

# BUILD

echo_full_path(
    name = "echo",
    srcs = glob(["src/**/*.cc"])
)

有沒有更清潔/更好的方法來做到這一點?

您可能可以通過使用realpath來解決這個問題。 類似的東西:

def _impl(ctx):

  ctx.actions.run_shell(
    inputs = ctx.files.srcs,
    outputs = [ctx.outputs.executable],
    command = "\n".join(["echo echo $(realpath \"%s\") >> %s" % (f.path,
              ctx.outputs.executable.path) for f in ctx.files.srcs]),
    execution_requirements = {
        "no-sandbox": "1",
        "no-cache": "1",
        "no-remote": "1",
        "local": "1",
    },
  )

echo_full_path = rule(
    implementation=_impl,
    executable=True,
    attrs={
      "srcs": attr.label_list(allow_files=True),
    }
)

請注意execution_requirements以解決我上面評論中的潛在問題。

如果您像我一樣編寫repository_rule而不是常規規則,解析以下標簽可以幫助您: "@//:WORKSPACE"

然后使用ctx.path提取需要的數據: https : ctx.path

我修改了@ahumesky 的規則,隱式使用BUILD文件作為源文件,並且只寫工作區目錄一次:

工作區.bzl

def _write_workspace_dir_impl(ctx):
    src = ctx.files._src[0]
    out = ctx.actions.declare_file(ctx.label.name)
    ctx.actions.run_shell(
        inputs = ctx.files._src,
        outputs = [out],
        command = """
          full_path="$(readlink -f -- "{src_full}")"
          # Trim the src.short_path suffix from full_path. Double braces to
          # output literal brace for shell.
          echo "${{full_path%/{src_short}}}" >> {out_full}
        """.format(src_full = src.path, src_short = src.short_path, out_full = out.path),
        execution_requirements = {
            "no-sandbox": "1",
            "no-remote": "1",
            "local": "1",
        },
    )
    return [DefaultInfo(files = depset([out]))]

write_workspace_dir = rule(
    implementation = _write_workspace_dir_impl,
    attrs = {
        "_src": attr.label(allow_files = True, default = "BUILD"),
    },
    doc = "Writes the full path of the current workspace dir to a file.",
)

建立

load(":workspace.bzl", "write_workspace_dir")

write_workspace_dir(
    name = "workspace_dir",
)

樣本輸出

bazel build //build/bazel:workspace_dir
INFO: Analyzed target //build/bazel:workspace_dir 
INFO: Build completed successfully, 1 total action

cat bazel-bin/build/bazel/workspace_dir
/p/$MY_PROJECT

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM