Включение и наследование операторов в Starlark

В make инструкция include может включать пути к файлам с переменными и игнорировать несуществующие файлы, если перед ними стоит минус. Эквивалентом конфигурации продукта является функция inherit-product-if-exists . Starlark использует операторы load с файлами, идентифицируемыми строковым литералом, и если файл не существует, Starlark выдает ошибку.

Чтобы обойти это ограничение, конвертер Starlark:

  • находит все файлы Makefile, которые могут соответствовать пути, включающему переменные
  • выдает операторы load Starlark для всех из них
  • выбирает правильный во время выполнения

Обратите внимание, что сгенерированный код Starlark может выглядеть неестественно, поскольку в нем перечислены все совпадающие пути, даже если будет выполнен только один.

Мы рекомендуем удалять ссылки на переменные в операторах include / inherit-product .

Когда нельзя избежать ссылок на переменные, постарайтесь свести к минимуму переменную часть. Например:

MY_DIR := path/to/$(TARGET_PRODUCT)
include $(MY_DIR)/file.mk

заставляет конвертер генерировать оператор load для каждого file.mk в исходном дереве, тогда как

include path/to/$(TARGET_PRODUCT)/file.mk

ограничивает его файлами file.mk по path/to . Конечно, удаление использования TARGET_PRODUCT также было бы идеальным.