2017-04-13 2 views
0

Da Bazel bietet keine Möglichkeit zum Zuordnen von Beschriftungen zu Strings, frage ich mich, wie man dies über Skylark umgehen.Emulieren Zeichenfolge zu Etikett dict

Nach meiner teilweise schrecklichen "Workaround".

Zuerst werden die Statik:

_INDEX_COUNT = 50 

def _build_label_mapping(): 
    lmap = {} 

    for i in range(_INDEX_COUNT): 
     lmap ["map_name%s" % i] = attr.string() 
     lmap ["map_label%s" % i] = attr.label(allow_files = True) 

    return lmap 

_LABEL_MAPPING = _build_label_mapping() 

Und bei der Umsetzung:

item_pairs = {} 
    for i in range(_INDEX_COUNT): 
     id = getattr(ctx.attr, "map_name%s" % i) 

     if not id: 
      continue 

     mapl = getattr(ctx.attr, "map_label%s" % i) 


     if len(mapl.files): 
      item_pairs[id] = list(mapl.files)[0].path 
     else: 
      item_pairs[id] = "" 

    if item_pairs: 
     arguments += [ 
      "--map", str(item_pairs), # Pass json data 
     ] 

Und dann die Regel:

_foo = rule(
    implementation = _impl, 
    attrs = dict({ 
     "srcs": attr.label_list(allow_files = True, mandatory = True), 
    }.items() + _LABEL_MAPPING.items()), 

, die wie eingewickelt werden muss:

def foo(map={}, **kwargs): 

    map_args = {} 

    # TODO: Check whether order of items is defined 
    for i, item in enumerate(textures.items()): 
     key, value = item 
     map_args["map_name%s" % i] = key 
     map_args["map_label%s" % i] = value 

    return _foo(
     **dict(map_args.items() + kwargs.items()) 
    ) 

Gibt es einen besseren Weg in Skylark?

+0

Gerade bemerkt, dass ich die Anzahl der Elemente an die Regel übergeben konnte, so müssen wir nicht alle generierten Slots überprüfen. – abergmeier

+0

Beachten Sie, dass dies nur für eine bestimmte Anzahl von Schlüsseln funktioniert: Siehe https://github.com/bazelbuild/bazel/issues/3098 – abergmeier

Antwort

1

Um Ihre Frage neu zu formulieren, möchten Sie eine Regelattributzuordnung von String zu Label erstellen?

Dies wird derzeit nicht unterstützt (siehe list of attributes), aber Sie können eine Feature-Anforderung dafür ablegen.

Glauben Sie, dass die Verwendung von "label_keyed_string_dict" eine sinnvolle Umgehungslösung ist? (Es wird nicht funktionieren, wenn Sie doppelte Schlüssel haben)

+0

Ich möchte in der Lage sein, eine Zeichenfolge an Label-Mapping zu einer Regel (mit doppelten Etiketten). Möchte etwas wie "string_keyed_label_dict" haben. Ich habe bereits einen Patch für sowas eingereicht, der nicht abgeholt wurde. Also suche ich jetzt eher nach einer Skylark-Alternative. – abergmeier