Как мне включить `cc_binary`/`cc_library` в настраиваемое правило (не макрос!)?
Чтобы обойти ошибку и установить параметры компилятора для конкретной платформы, я хочу заключить (и) в настраиваемое правило. Я не хочу использовать макрос, потому что тогда мне пришлось бы так структурировать свой код:
deps = select(
{
"@platforms//os:linux": deps + ["my-extra-dep"],
"//conditions:default": deps,
}
// repeat the same for copts and defines
Вместо этого я хотел бы структурировать свой код так:
// checks @platforms//os:linux
if is_linux():
deps = deps + ["my-extra-dep"]
defines = defines + ["custom-define1", ...]
Последнее возможно только в правиле, где можно запрашивать атрибуты платформы. В макросе я бы застрял
select
каждый отдельный атрибут.
Моя проблема связана с шаблоном моего пользовательского правила - что должно
attrs
быть, чтобы я мог прозрачно перенаправить на родной
cc_binary
/
cc_library
правило? Мне не хватает простого способа сделать это, который не переводил бы всю спецификацию интерфейса
cc_*
правила в Starlark?
1 ответ
Нет, универсального способа повторного использования другого правила на уровне реализации правила не существует. Однако есть способы сделать
select
деревья более краткими. Например:
def on_linux(d):
return select({"@platforms//os:linux": d, "//conditions:default": []})
def macro(deps, defines):
...
deps += on_linux(["my-extra-dep"])
defines += on_linux(["custom-define", "custom-define2"])