- $(if $(filter $(2),new),\
- $(if $(BOARD_NEWIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "new_fs_type=$(BOARD_NEWIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
- $(if $(BOARD_NEWIMAGE_PARTITION_SIZE),$(hide) echo "new_size=$(BOARD_NEWIMAGE_PARTITION_SIZE)" >> $(1))
- )
这段代码片段是 Makefile 中的条件语句,用来根据条件在特定情况下向输出文件中写入数据。让我们来逐步解释这段代码:
综上所述,这段代码的作用是:当第二个参数等于 “new” 时,根据条件检查 BOARD_NEWIMAGE_FILE_SYSTEM_TYPE 和 BOARD_NEWIMAGE_PARTITION_SIZE 变量是否存在,如果存在则将相应的内容写入到指定的文件中。
$(call generate-image-prop-dictionary,$(1),system vendor cache prodnv new userdata product product_services oem odm socko odmko,$(2))
具体到这个调用:
- ifdef BOARD_NEWIMAGE_FILE_SYSTEM_TYPE
- INTERNAL_NEWIMAGE_FILES := \
- $(filter $(TARGET_OUT_NEW)/%,$(ALL_DEFAULT_INSTALLED_MODULES))
-
- newimage_intermediates := \
- $(call intermediates-dir-for,PACKAGING,new)
- BUILT_NEWIMAGE_TARGET := $(PRODUCT_OUT)/new.img
-
- define build-newimage-target
- $(call pretty,"Target new fs image : $(INSTALLED_NEWIMAGE_TARGET)")
- @mkdir -p $(TARGET_OUT_NEW)
- @mkdir -p $(newimage_intermediates) && rm -rf $(newimage_intermediates)/new_image_info.txt
- $(call generate-userimage-prop-dictionary, $(newimage_intermediates)/new_image_info.txt)
- $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
- build/tools/releasetools/build_image.py \
- $(TARGET_OUT_NEW) $(newimage_intermediates)/new_image_info.txt $(INSTALLED_NEWIMAGE_TARGET) $(TARGET_OUT)
- $(hide) $(call assert-max-image-size,$(INSTALLED_NEWIMAGE_TARGET),$(BOARD_newIMAGE_PARTITION_SIZE))
- endef
-
- INSTALLED_NEWIMAGE_TARGET := $(BUILT_NEWIMAGE_TARGET)
-
- $(INSTALLED_NEWIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_NEWIMAGE_FILES)
- $(build-newimage-target)
-
- .PHONY: newimage-nodeps nnod
- newimage-nodeps nnod : | $(INTERNAL_USERIMAGES_DEPS)
- $(build-newimage-target)
-
- else ifdef BOARD_PREBUILT_NEWIMAGE
- INSTALLED_NEWIMAGE_TARGET := $(PRODUCT_OUT)/new.img
- $(eval $(call copy-one-file,$(BOARD_PREBUILT_NEWIMAGE),$(INSTALLED_NEWIMAGE_TARGET)))
- endif
这段代码片段是一个 Makefile 中的条件语句,它根据条件选择性地定义了一个名为 INSTALLED_NEWIMAGE_TARGET 的目标文件,并且定义了一个构建该目标文件的规则。
让我们来逐步解释:
综上所述,这段代码的作用是:根据不同的条件,选择性地定义了 INSTALLED_NEWIMAGE_TARGET 变量,并定义了构建新镜像文件的规则。
build-newimage-target中:
- $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
- build/tools/releasetools/build_image.py \
- $(TARGET_OUT_NEW) $(newimage_intermediates)/new_image_info.txt $(INSTALLED_NEWIMAGE_TARGET) $(TARGET_OUT)
这个命令看起来像是在一个Makefile或者类似的脚本中,用于执行一个Python脚本build/tools/releasetools/build_image.py。下面是对这个命令的分解:
PATH。$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)将会遍历变量$(INTERNAL_USERIMAGES_BINARY_PATHS)中的每一个元素,并且为每个元素添加一个冒号(:),这意味着它将在原有的PATH值前面添加这些路径。
综上所述,这个命令基本上是在更新或构建一个新的映像文件,通过修改PATH环境变量来确保必要的工具可以在执行时找到,然后利用修改后的PATH运行Python脚本来生成新的映像文件。
$(hide) $(call assert-max-image-size,$(INSTALLED_ANIMIMAGE_TARGET),$(BOARD_newIMAGE_PARTITION_SIZE))
这行代码看起来是在使用一个名为assert-max-image-size的宏,它接受两个参数:第一个是目标图像文件(在这里是$(INSTALLED_ANIMIMAGE_TARGET)),第二个是该图像允许的最大尺寸(在这里是$(BOARD_newIMAGE_PARTITION_SIZE))。$(hide)部分可能意味着输出将被隐藏或抑制,所以你不会在控制台上看到这个调用的结果。
让我们分解一下:
结合这些信息,我们可以推断出,这行代码的作用是确保$(INSTALLED_ANIMIMAGE_TARGET)文件的大小不超过$(BOARD_newIMAGE_PARTITION_SIZE)所定义的限制。如果超过了这个限制,assert-max-image-size宏可能会产生一些动作,比如抛出错误、警告或者输出一条消息。
因此,整个表达式的意思是:“在不显示详细输出的情况下,调用assert-max-image-size宏来检查动画图像文件的最大尺寸是否超出限制”。
- BUILDING_NEW_IMAGE :=
- ifeq ($(PRODUCT_BUILD_NEW_IMAGE),)
- ifdef BOARD_NEWIMAGE_FILE_SYSTEM_TYPE
- BUILDING_NEW_IMAGE := true
- endif
- else ifeq ($(PRODUCT_BUILD_NEW_IMAGE),true)
- BUILDING_NEW_IMAGE := true
- ifndef BOARD_NEWIMAGE_FILE_SYSTEM_TYPE
- $(error PRODUCT_BUILD_NEW_IMAGE set to true, but BOARD_NEWIMAGE_FILE_SYSTEM_TYPE not defined)
- endif
- endif
- .KATI_READONLY := BUILDING_NEW_IMAGE
定义了一个变量 BUILDING_NEW_IMAGE,用于确定是否正在构建新的镜像。它首先检查是否定义了 PRODUCT_BUILD_NEW_IMAGE,如果没有定义,则检查是否定义了 BOARD_NEWIMAGE_FILE_SYSTEM_TYPE,如果定义了,则将 BUILDING_NEW_IMAGE 设置为 true。如果 PRODUCT_BUILD_NEW_IMAGE 被设置为 true,但是 BOARD_NEWIMAGE_FILE_SYSTEM_TYPE 没有定义,那么会产生一个错误。最后,.KATI_READONLY 用于将 BUILDING_NEW_IMAGE 标记为只读