Trong thực hiện, một câu lệnh include
có thể bao gồm các đường dẫn tệp có biến và sẽ bỏ qua các tệp không tồn tại khi có tiền tố là dấu trừ. Tương đương với cấu hình sản phẩm là hàm inherit-product-if-exists
. Starlark sử dụng câu lệnh load
với các tệp được xác định bằng chuỗi ký tự và nếu tệp không tồn tại, Starlark sẽ báo lỗi.
Để khắc phục hạn chế này, bộ chuyển đổi Starlark:
- tìm tất cả Makefiles có thể khớp với đường dẫn liên quan đến các biến
- phát ra câu lệnh
load
Starlark cho tất cả chúng - chọn đúng trong thời gian chạy
Lưu ý rằng mã Starlark được tạo có thể trông không tự nhiên vì nó liệt kê tất cả các đường dẫn phù hợp mặc dù chỉ một đường dẫn sẽ được thực thi.
Chúng tôi khuyên bạn nên loại bỏ các tham chiếu biến trong các câu lệnh include
/ inherit-product
.
Khi không thể tránh tham chiếu biến, hãy cố gắng giảm thiểu phần biến. Ví dụ:
MY_DIR := path/to/$(TARGET_PRODUCT)
include $(MY_DIR)/file.mk
khiến trình chuyển đổi tạo câu lệnh load
cho từng file.mk
trong cây nguồn, trong khi
include path/to/$(TARGET_PRODUCT)/file.mk
giới hạn nó ở các tệp file.mk
trong path/to
. Tất nhiên, lý tưởng nhất là loại bỏ việc sử dụng TARGET_PRODUCT
.