make에서 include
문은 변수가 있는 파일 경로를 포함할 수 있으며 마이너스 접두사가 붙으면 존재하지 않는 파일을 무시합니다. 제품 구성에 해당하는 것은 inherit-product-if-exists
기능입니다. Starlark는 문자열 리터럴로 식별되는 파일과 함께 load
문을 사용하며 파일이 없으면 Starlark에서 오류가 발생합니다.
이 제한을 해결하기 위해 Starlark 변환기는 다음을 수행합니다.
- 변수가 포함된 경로와 일치할 수 있는 모든 Makefile을 찾습니다.
- 그들 모두에 대해 Starlark
load
문을 내보냅니다. - 런타임에 올바른 것을 선택합니다.
생성된 Starlark 코드는 하나만 실행되더라도 일치하는 모든 경로를 나열하므로 부자연스러워 보일 수 있습니다.
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
의 사용을 제거하는 것도 이상적입니다.