2017-04-13 54 views
0

由於Bazel沒有提供將標籤映射到字符串的方法,我想知道如何通過Skylark解決此問題。模擬字符串標籤字典

繼我的部分可怕的「解決方法」。

首先靜:

_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() 

並在實施:

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 
     ] 

然後規則:

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

需要被裹得像個:

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()) 
    ) 

在Skylark中有更好的方法嗎?

+0

只要注意到我可以將項目的數量傳遞給規則,所以我們不需要檢查所有生成的插槽。 – abergmeier

+0

請注意,這隻適用於一定數量的鍵:請參閱https://github.com/bazelbuild/bazel/issues/3098 – abergmeier

回答

1

要更改您的問題,您希望創建一個從字符串到標籤的規則屬性映射?

目前不支持此功能(請參閱list of attributes),但您可以爲此提出功能請求。

您認爲使用「label_keyed_string_dict」是一個合理的解決方法嗎? (如果你有重複的密鑰,它不會工作)

+0

我希望能夠傳遞字符串以標籤映射到規則(帶有重複標籤)。想要有'string_keyed_label_dict'這樣的東西。我已經提交了一個類似的東西補丁沒有被拿起。所以我現在正在尋找Skylark替代品。 – abergmeier

相關問題