1 year ago

#361004

test-img

Gunnar

How to get Bazel output base from within rule Args map_each function?

I'm writing a Bazel rule which processes an input depsets with lots of jar files in it. My goal is to get the full (absolute) path of the jars for launching an application.

I use java_binary for the initial application. However, the application itself later then dynamically loads additional jars into the JVM. I need to give that application the absolute path to those jars.

As the depset is pretty expensive to process I want to move that into the execution phase. This requires the use of Args in combination with a map_each function like this:

args.add_joined("--jars", dependencies, join_with = ",", map_each = _expand_jars)

I'm now stuck with how to turn the jar path into an absolute path. In an older version (which was running in the analysis phase) I passed in the path using a rule attribute. This is required because (for some reason) the bootstrap application couldn't access the jars in the external/ directory. In the mapping function I have it hard coded to "bazel-myworkspace/../../", which I'd like to get rid of. It does follow the symlink into the exec root and from there I'm able to get to the output base.

def _expand_jars(file):
    if file.path.startswith("external/"):
        return "bazel-myworkspace/../../" + file.path
    else:
        return file.path

Any ideas?

bazel

bazel-rules

0 Answers

Your Answer

Accepted video resources