petros-eskinder
petros-eskinder

Reputation: 264

Skylark - can a rule access the attributes of another rule from its label?

This question piggybacks this github issue. However, I have ran into this issue in one other context.

Context

Within Bazel, there are two repository rules, maven_jar and maven_server.

maven_jar(name, artifact, repository, server, sha1)

maven_server(name, repository, settings)

The maven_jar rule's server attribute is a label pointing to some maven_server target.

Currently, whenever the server attribute is provided, the maven_jar rule errors out.

What I would like to accomplish

Within maven_jar's implementation function, I would like to access the maven_server's attributes. Specifically, I would like to do something along the lines of:

def _impl(rtx):
     settings_attr = rtx.attr.server.getSettings()

     # alternatively
     settings_attr = rtx.attr.server.getAttributes().settings

Is this behavior supported? If not, any way I can approximate it?

The server attribute is a label, so I'm not sure if one can obtain these values using its providers/aspects.

Upvotes: 1

Views: 662

Answers (1)

kris
kris

Reputation: 23601

Repository rules are macros, so they do not have providers the same way "normal" rules do. Thus, if you specify a label attribute, it basically has to be a source file.

As settings.xml isn't supposed to be project-specific, I think it mgiht make more sense for maven_jar to use the users/system's settings.xml, as described in the Maven docs:

There are two locations where a settings.xml file may live:

  • The Maven install: ${maven.home}/conf/settings.xml
  • A user’s install: ${user.home}/.m2/settings.xml

The former settings.xml are also called global settings, the latter settings.xml are referred to as user settings. If both files exists, their contents gets merged, with the user-specific settings.xml being dominant.

Upvotes: 2

Related Questions