Skip to main content

Buck support to implement configured_alias

Intro​

Currently, Buck 2 lacks configured_alias rule support.

configured_alias is a builtin rule in Buck v1, and it cannot be currently implemented as user defined rule in Buck v2.

This RFC proposes Buck core support for configured_alias.

What is configured_alias?​

Syntax is this:

configured_alias(
name = "foo-but-linux-release",
actual = ":foo",
platform = "config//platforms:linux-release",
)

When this rule is built, it ignores "current" target configuration, and builds the "actual" target with the configuration specified as "platform" argument.

How to implement it in buck v2?​

New rule attribute type: configured_dep​

Currently, we have several dependency attributes:

  • attrs.dep
  • attrs.exec_dep
  • attrs.transition_dep
  • attrs.split_transition_dep

This RFC proposes adding another attribute:

  • attrs.configured_dep

configured_dep is an attribute which accepts a pair of strings: target and configuration. During analysis, configured attr deps are resolved to providers resolved using given configuration.

configured_alias_impl user defined rule​

The rule implementation is trivial:


def _configured_alias_impl(ctx):
return ctx.attrs.actual.providers

configured_alias_impl = rule(
impl = _configured_alias_impl,
attrs = {
"actual": attrs.configured_dep(),
}
)

Finally, configured_alias macro​

def configured_alias(name, actual, platform):
configured_alias_impl(name, actual = (actual, platform))

Alternatives​

No configured_alias​

Each specific case where configured_alias is used, it can be done with defining custom transition, and using custom transition rule.

But having configured_alias is a convenient stopgap to unblock people.

Use @configuration syntax from another RFC.​

Instead of passing confiured_target_label(x, y) pass x + "@" + y.

Accept configured_target_label in dep attribute​

dep attribute could support all of:

  • regular target label as string
  • configured target label (as either configured_target_label or x@y

I don't know practical applications for this magic, and unless there are uses for it, better keep API simple and explicit.