Sentencias include e inherit en Starlark

En Make, una sentencia include puede incluir rutas de archivos con variables y, además, ignorará los archivos inexistentes cuando tenga el prefijo menos. La configuración del producto equivalente es la función inherit-product-if-exists. Starlark usa sentencias load con archivos identificados por literales de string. Si un archivo no existe, Starlark arroja un error.

Para solucionar esta limitación el conversor de Starlark hace lo siguiente:

  • Busca todos los archivos makefile que podrían coincidir con la ruta de acceso que incluye variables.
  • Emite sentencias load de Starlark para todos ellos.
  • Elige el correcto durante el tiempo de ejecución.

Ten en cuenta que el código de Starlark generado puede parecer antinatural, ya que enumera todas las rutas de acceso coincidentes, aunque solo se ejecutará una.

Se recomienda quitar las referencias variables de las sentencias include/inherit-product.

Cuando no se puedan evitar las referencias de variables, intenta minimizarlas. Por ejemplo:

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

hace que el conversor genere una sentencia load por cada file.mk en el árbol de fuentes, mientras que

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

lo restringe a archivos file.mk en path/to. Por supuesto que lo ideal es también quitar el uso de TARGET_PRODUCT.