Как мне включить `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"])
Другие вопросы по тегам