Starlark のインクルード ステートメントと継承ステートメント

具体的には、include ステートメントには変数を持つファイルパスを含めることができます。接頭辞の前にマイナスを付けると存在しないファイルが無視されます。プロダクト構成では inherit-product-if-exists 関数がこれに相当します。Starlark は、文字列リテラルで識別されたファイルに load ステートメントを使用します。ファイルが存在しない場合、Starlark はエラーをスローします。

この制限を回避するために、Starlark コンバータは次のことを行います。

  • 変数を含むパスと一致するすべての Makefile を検索する
  • 検索された Makefile すべてに対して Starlark の load ステートメントを発行する
  • 実行時に正しいものを選択する

なお、生成された Starlark コードは、1 つしか実行されなくても一致するすべてのパスを一覧表示するため、不自然に見えることがあります。

include/inherit-product ステートメントから変数の参照を削除することをおすすめします。

変数の参照を避けられない場合は、変数部分を最小限に抑えるようにしてください。次に例を示します。

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

コンバータがソースツリー内の file.mk ごとに load ステートメントを生成しますが、

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

path/to 以下の file.mk ファイルに表示されます。もちろん、TARGET_PRODUCT の使用も削除するのが理想的です。