В 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
также было бы идеальным.