'How to use `--define`d variable in `bazel` rule?

I would like to do something like:

DEFAULT_CLUSTER_ALIASES = {
    "local": "$(DEFAULT_LOCAL_CLUSTER)",
}

def helm_action(**kwargs):
    if not "$(DEFAULT_LOCAL_CLUSTER)":
        DEFAULT_LOCAL_CLUSTER = "docker-desktop"

    _helm_action(
        cluster_aliases = DEFAULT_CLUSTER_ALIASES,
        **kwargs
    )

IOW, if DEFAULT_LOCAL_CLUSTER is not defined, DEFAULT_CLUSTER_ALIASES will be dict("local": "docker-desktop").

and if --define=DEFAULT_LOCAL_CLUSTER=minikube, DEFAULT_CLUSTER_ALIASES will be dict("local": "minikube").

So far, I haven't been able to get the Make variable to be evaluated and DEFAULT_CLUSTER_ALIASES is dict("local": "$(DEFAULT_LOCAL_CLUSTER)").

What's needed so the Make variable is evaluated?



Solution 1:[1]

"make variables" are only evaluated in the context of rule attributes that support make variable substitution. See https://bazel.build/reference/be/make-variables#use

If helm_action is a macro, or is used from a macro, then this won't work because macros don't have access to configuration information (e.g. values from flags). If helm_action is used from a rule implementation, then you can access values set using --define from ctx.var: https://bazel.build/rules/lib/ctx#var

Another way to do this is to use Starlark flags: https://bazel.build/rules/config#user-defined-build-settings Though again, it depends on if you're writing a macro or a rule.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 ahumesky