Home | History | Annotate | Download | only in tools
      1 #
      2 # Copyright (C) 2015 The Android Open Source Project
      3 #
      4 # Licensed under the Apache License, Version 2.0 (the "License");
      5 # you may not use this file except in compliance with the License.
      6 # You may obtain a copy of the License at
      7 #
      8 #      http://www.apache.org/licenses/LICENSE-2.0
      9 #
     10 # Unless required by applicable law or agreed to in writing, software
     11 # distributed under the License is distributed on an "AS IS" BASIS,
     12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 # See the License for the specific language governing permissions and
     14 # limitations under the License.
     15 #
     16 
     17 
     18 # Define rule to build one custom image.
     19 # Input variables: my_custom_imag_makefile
     20 
     21 $(call clear-var-list, $(custom_image_parameter_variables))
     22 
     23 include $(my_custom_imag_makefile)
     24 
     25 my_custom_image_name := $(basename $(notdir $(my_custom_imag_makefile)))
     26 
     27 intermediates := $(call intermediates-dir-for,PACKAGING,$(my_custom_image_name))
     28 my_built_custom_image := $(intermediates)/$(my_custom_image_name).img
     29 my_staging_dir := $(intermediates)/$(CUSTOM_IMAGE_MOUNT_POINT)
     30 
     31 # Collect CUSTOM_IMAGE_MODULES's installd files and their PICKUP_FILES.
     32 my_built_modules :=
     33 my_copy_pairs :=
     34 my_pickup_files :=
     35 
     36 $(foreach m,$(CUSTOM_IMAGE_MODULES),\
     37   $(eval _pickup_files := $(strip $(ALL_MODULES.$(m).PICKUP_FILES)\
     38     $(ALL_MODULES.$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX).PICKUP_FILES)))\
     39   $(eval _built_files := $(strip $(ALL_MODULES.$(m).BUILT_INSTALLED)\
     40     $(ALL_MODULES.$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX).BUILT_INSTALLED)))\
     41   $(if $(_pickup_files)$(_built_files),,\
     42     $(warning Unknown installed file for module '$(m)'))\
     43   $(eval my_pickup_files += $(_pickup_files))\
     44   $(foreach i, $(_built_files),\
     45     $(eval bui_ins := $(subst :,$(space),$(i)))\
     46     $(eval ins := $(word 2,$(bui_ins)))\
     47     $(if $(filter $(TARGET_OUT_ROOT)/%,$(ins)),\
     48       $(eval bui := $(word 1,$(bui_ins)))\
     49       $(eval my_built_modules += $(bui))\
     50       $(eval my_copy_dest := $(patsubst $(PRODUCT_OUT)/%,%,$(ins)))\
     51       $(eval my_copy_dest := $(subst /,$(space),$(my_copy_dest)))\
     52       $(eval my_copy_dest := $(wordlist 2,999,$(my_copy_dest)))\
     53       $(eval my_copy_dest := $(subst $(space),/,$(my_copy_dest)))\
     54       $(eval my_copy_pairs += $(bui):$(my_staging_dir)/$(my_copy_dest)))\
     55   ))
     56 
     57 # Collect CUSTOM_IMAGE_COPY_FILES.
     58 my_image_copy_files :=
     59 $(foreach f,$(CUSTOM_IMAGE_COPY_FILES),\
     60   $(eval pair := $(subst :,$(space),$(f)))\
     61   $(eval src := $(word 1,$(pair)))\
     62   $(eval my_image_copy_files += $(src))\
     63   $(eval my_copy_pairs += $(src):$(my_staging_dir)/$(word 2,$(pair))))
     64 
     65 ifndef CUSTOM_IMAGE_AVB_KEY_PATH
     66 # If key path isn't specified, use the default signing args.
     67 my_avb_signing_args := $(INTERNAL_AVB_SIGNING_ARGS)
     68 else
     69 my_avb_signing_args := \
     70   --algorithm $(CUSTOM_IMAGE_AVB_ALGORITHM) --key $(CUSTOM_IMAGE_AVB_KEY_PATH)
     71 endif
     72 
     73 $(my_built_custom_image): PRIVATE_INTERMEDIATES := $(intermediates)
     74 $(my_built_custom_image): PRIVATE_MOUNT_POINT := $(CUSTOM_IMAGE_MOUNT_POINT)
     75 $(my_built_custom_image): PRIVATE_PARTITION_SIZE := $(CUSTOM_IMAGE_PARTITION_SIZE)
     76 $(my_built_custom_image): PRIVATE_FILE_SYSTEM_TYPE := $(CUSTOM_IMAGE_FILE_SYSTEM_TYPE)
     77 $(my_built_custom_image): PRIVATE_STAGING_DIR := $(my_staging_dir)
     78 $(my_built_custom_image): PRIVATE_COPY_PAIRS := $(my_copy_pairs)
     79 $(my_built_custom_image): PRIVATE_PICKUP_FILES := $(my_pickup_files)
     80 $(my_built_custom_image): PRIVATE_SELINUX := $(CUSTOM_IMAGE_SELINUX)
     81 $(my_built_custom_image): PRIVATE_SUPPORT_VERITY := $(CUSTOM_IMAGE_SUPPORT_VERITY)
     82 $(my_built_custom_image): PRIVATE_SUPPORT_VERITY_FEC := $(CUSTOM_IMAGE_SUPPORT_VERITY_FEC)
     83 $(my_built_custom_image): PRIVATE_VERITY_KEY := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY)
     84 $(my_built_custom_image): PRIVATE_VERITY_BLOCK_DEVICE := $(CUSTOM_IMAGE_VERITY_BLOCK_DEVICE)
     85 $(my_built_custom_image): PRIVATE_DICT_FILE := $(CUSTOM_IMAGE_DICT_FILE)
     86 $(my_built_custom_image): PRIVATE_AVB_AVBTOOL := $(AVBTOOL)
     87 $(my_built_custom_image): PRIVATE_AVB_SIGNING_ARGS := $(my_avb_signing_args)
     88 $(my_built_custom_image): PRIVATE_AVB_HASH_ENABLE := $(CUSTOM_IMAGE_AVB_HASH_ENABLE)
     89 $(my_built_custom_image): PRIVATE_AVB_ADD_HASH_FOOTER_ARGS := $(CUSTOM_IMAGE_AVB_ADD_HASH_FOOTER_ARGS)
     90 $(my_built_custom_image): PRIVATE_AVB_HASHTREE_ENABLE := $(CUSTOM_IMAGE_AVB_HASHTREE_ENABLE)
     91 $(my_built_custom_image): PRIVATE_AVB_ADD_HASHTREE_FOOTER_ARGS := $(CUSTOM_IMAGE_AVB_ADD_HASHTREE_FOOTER_ARGS)
     92 ifeq (true,$(filter true, $(CUSTOM_IMAGE_AVB_HASH_ENABLE) $(CUSTOM_IMAGE_AVB_HASHTREE_ENABLE)))
     93   $(my_built_custom_image): $(AVBTOOL)
     94 else ifneq (,$(filter true, $(CUSTOM_IMAGE_AVB_HASH_ENABLE) $(CUSTOM_IMAGE_AVB_HASHTREE_ENABLE)))
     95   $(error Cannot set both CUSTOM_IMAGE_AVB_HASH_ENABLE and CUSTOM_IMAGE_AVB_HASHTREE_ENABLE to true)
     96 endif
     97 ifeq (true,$(CUSTOM_IMAGE_SUPPORT_VERITY_FEC))
     98   $(my_built_custom_image): $(FEC)
     99 endif
    100 my_custom_image_modules_var:=BOARD_$(strip $(call to-upper,$(my_custom_image_name)))_KERNEL_MODULES
    101 my_custom_image_modules:=$($(my_custom_image_modules_var))
    102 my_custom_image_modules_dep:=$(if $(my_custom_image_modules),$(my_custom_image_modules) $(DEPMOD),)
    103 $(my_built_custom_image): PRIVATE_KERNEL_MODULES := $(my_custom_image_modules)
    104 $(my_built_custom_image): PRIVATE_IMAGE_NAME := $(my_custom_image_name)
    105 $(my_built_custom_image): $(INTERNAL_USERIMAGES_DEPS) $(my_built_modules) $(my_image_copy_files) $(my_custom_image_modules_dep) \
    106   $(CUSTOM_IMAGE_DICT_FILE)
    107 	@echo "Build image $@"
    108 	$(hide) rm -rf $(PRIVATE_INTERMEDIATES) && mkdir -p $(PRIVATE_INTERMEDIATES)
    109 	$(hide) rm -rf $(PRIVATE_STAGING_DIR) && mkdir -p $(PRIVATE_STAGING_DIR)
    110 	# Copy all the files.
    111 	$(hide) $(foreach p,$(PRIVATE_COPY_PAIRS),\
    112 	          $(eval pair := $(subst :,$(space),$(p)))\
    113 	          mkdir -p $(dir $(word 2,$(pair)));\
    114 	          cp -Rf $(word 1,$(pair)) $(word 2,$(pair));)
    115 	$(if $(PRIVATE_KERNEL_MODULES), \
    116 		$(call build-image-kernel-modules,$(PRIVATE_KERNEL_MODULES),$(PRIVATE_STAGING_DIR),$(PRIVATE_IMAGE_NAME)/,$(call intermediates-dir-for,PACKAGING,depmod_$(PRIVATE_IMAGE_NAME))))
    117 	$(if $($(PRIVATE_PICKUP_FILES)),$(hide) cp -Rf $(PRIVATE_PICKUP_FILES) $(PRIVATE_STAGING_DIR))
    118 	# Generate the dict.
    119 	$(hide) echo "# For all accepted properties, see BuildImage() in tools/releasetools/build_image.py" > $(PRIVATE_INTERMEDIATES)/image_info.txt
    120 	$(hide) echo "mount_point=$(PRIVATE_MOUNT_POINT)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt
    121 	$(hide) echo "partition_name=$(PRIVATE_MOUNT_POINT)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt
    122 	$(hide) echo "fs_type=$(PRIVATE_FILE_SYSTEM_TYPE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt
    123 	$(hide) echo "partition_size=$(PRIVATE_PARTITION_SIZE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt
    124 	$(hide) echo "ext_mkuserimg=$(notdir $(MKEXTUSERIMG))" >> $(PRIVATE_INTERMEDIATES)/image_info.txt
    125 	$(if $(PRIVATE_SELINUX),$(hide) echo "selinux_fc=$(SELINUX_FC)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt)
    126 	$(if $(PRIVATE_SUPPORT_VERITY),\
    127 	  $(hide) echo "verity=$(PRIVATE_SUPPORT_VERITY)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\
    128 	    echo "verity_key=$(PRIVATE_VERITY_KEY)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\
    129 	    echo "verity_signer_cmd=$(VERITY_SIGNER)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\
    130 	    echo "verity_block_device=$(PRIVATE_VERITY_BLOCK_DEVICE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt)
    131 	$(if $(PRIVATE_SUPPORT_VERITY_FEC),\
    132 	  $(hide) echo "verity_fec=$(PRIVATE_SUPPORT_VERITY_FEC)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt)
    133 	$(hide) echo "avb_avbtool=$(PRIVATE_AVB_AVBTOOL)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt
    134 	$(hide) echo "avb_signing_args=$(PRIVATE_AVB_SIGNING_ARGS)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt
    135 	$(if $(PRIVATE_AVB_HASH_ENABLE),\
    136 	  $(hide) echo "avb_hash_enable=$(PRIVATE_AVB_HASH_ENABLE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\
    137 	    echo "avb_add_hash_footer_args=$(PRIVATE_AVB_ADD_HASH_FOOTER_ARGS)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt)
    138 	$(if $(PRIVATE_AVB_HASHTREE_ENABLE),\
    139 	  $(hide) echo "avb_hashtree_enable=$(PRIVATE_AVB_HASHTREE_ENABLE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\
    140 	    echo "avb_add_hashtree_footer_args=$(PRIVATE_AVB_ADD_HASHTREE_FOOTER_ARGS)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt)
    141 	$(if $(PRIVATE_DICT_FILE),\
    142 	  $(hide) echo "# Properties from $(PRIVATE_DICT_FILE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\
    143 	    cat $(PRIVATE_DICT_FILE) >> $(PRIVATE_INTERMEDIATES)/image_info.txt)
    144 	# Generate the image.
    145 	$(if $(filter oem,$(PRIVATE_MOUNT_POINT)), \
    146 	  $(hide) echo "oem.buildnumber=$(BUILD_NUMBER)" >> $(PRIVATE_STAGING_DIR)/oem.prop)
    147 	$(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
    148 	  ./build/tools/releasetools/build_image.py \
    149 	  $(PRIVATE_STAGING_DIR) $(PRIVATE_INTERMEDIATES)/image_info.txt $@ $(TARGET_OUT)
    150 
    151 my_installed_custom_image := $(PRODUCT_OUT)/$(notdir $(my_built_custom_image))
    152 $(my_installed_custom_image) : $(my_built_custom_image)
    153 	$(call copy-file-to-new-target-with-cp)
    154 
    155 .PHONY: $(my_custom_image_name)
    156 custom_images $(my_custom_image_name) : $(my_installed_custom_image)
    157 
    158 # Archive the built image.
    159 $(call dist-for-goals, $(my_custom_image_name) custom_images,$(my_installed_custom_image))
    160 
    161 my_staging_dir :=
    162 my_built_modules :=
    163 my_copy_dest :=
    164 my_copy_pairs :=
    165 my_pickup_files :=
    166