diff options
Diffstat (limited to 'core/tasks')
-rw-r--r-- | core/tasks/build_custom_images.mk | 58 | ||||
-rw-r--r-- | core/tasks/tools/build_custom_image.mk | 105 |
2 files changed, 163 insertions, 0 deletions
diff --git a/core/tasks/build_custom_images.mk b/core/tasks/build_custom_images.mk new file mode 100644 index 0000000..263b81a --- /dev/null +++ b/core/tasks/build_custom_images.mk @@ -0,0 +1,58 @@ +# +# Copyright (C) 2015 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Build additional images requested by the product makefile. +# This script gives the ability to build multiple additional images and you can +# configure what modules/files to include in each image. +# 1. Define PRODUCT_CUSTOM_IMAGE_MAKEFILES in your product makefile. +# PRODUCT_CUSTOM_IMAGE_MAKEFILES is a list of makefiles. +# Each makefile configures an image. +# For image configuration makefile foo/bar/xyz.mk, the built image file name +# will be xyz.img. So make sure they won't conflict. +# 2. In each image's configuration makefile, you can define variables: +# - CUSTOM_IMAGE_MOUNT_POINT, the mount point, such as "oem", "odm" etc. +# - CUSTOM_IMAGE_PARTITION_SIZE +# - CUSTOM_IMAGE_FILE_SYSTEM_TYPE +# - CUSTOM_IMAGE_DICT_FILE, a text file defines a dictionary accepted by +# BuildImage() in tools/releasetools/build_image.py. +# - CUSTOM_IMAGE_MODULES, a list of module names you want to include in +# the image; Not only the module itself will be installed to proper path in +# the image, you can also piggyback additional files/directories with the +# module's LOCAL_PICKUP_FILES. +# - CUSTOM_IMAGE_COPY_FILES, a list of "<src>:<dest>" to be copied to the +# image. <dest> is relativ to the root of the image. +# +# To build all those images, run "make custom_images". + +ifneq ($(filter $(MAKECMDGOALS),custom_images),) + +.PHONY: custom_images + +custom_image_parameter_variables := \ + CUSTOM_IMAGE_MOUNT_POINT \ + CUSTOM_IMAGE_PARTITION_SIZE \ + CUSTOM_IMAGE_FILE_SYSTEM_TYPE \ + CUSTOM_IMAGE_DICT_FILE \ + CUSTOM_IMAGE_MODULES \ + CUSTOM_IMAGE_COPY_FILES \ + +# We don't expect product makefile to inherit/override PRODUCT_CUSTOM_IMAGE_MAKEFILES, +# so we don't put it in the _product_var_list. +$(foreach mk, $(PRODUCT_CUSTOM_IMAGE_MAKEFILES),\ + $(eval my_custom_imag_makefile := $(mk))\ + $(eval include $(BUILD_SYSTEM)/tasks/tools/build_custom_image.mk)) + +endif diff --git a/core/tasks/tools/build_custom_image.mk b/core/tasks/tools/build_custom_image.mk new file mode 100644 index 0000000..fa9cda2 --- /dev/null +++ b/core/tasks/tools/build_custom_image.mk @@ -0,0 +1,105 @@ +# +# Copyright (C) 2015 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + + +# Define rule to build one custom image. +# Input variables: my_custom_imag_makefile + +$(call clear-var-list, $(custom_image_parameter_variables)) + +include $(my_custom_imag_makefile) + +my_custom_image_name := $(basename $(notdir $(my_custom_imag_makefile))) + +intermediates := $(call intermediates-dir-for,PACKAGING,$(my_custom_image_name)) +my_built_custom_image := $(intermediates)/$(my_custom_image_name).img +my_staging_dir := $(intermediates)/$(my_custom_image_name) + +# Collect CUSTOM_IMAGE_MODULES's installd files and their PICKUP_FILES. +my_built_modules := +my_copy_pairs := +my_pickup_files := + +$(foreach m,$(CUSTOM_IMAGE_MODULES),\ + $(eval _pickup_files := $(strip $(ALL_MODULES.$(m).PICKUP_FILES)\ + $(ALL_MODULES.$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX).PICKUP_FILES)))\ + $(eval _built_files := $(strip $(ALL_MODULES.$(m).BUILT_INSTALLED)\ + $(ALL_MODULES.$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX).BUILT_INSTALLED)))\ + $(if $(_pickup_files)$(_built_files),,\ + $(warning Unknown installed file for module '$(m)'))\ + $(eval my_pickup_files += $(_pickup_files))\ + $(foreach i, $(_built_files),\ + $(eval bui_ins := $(subst :,$(space),$(i)))\ + $(eval ins := $(word 2,$(bui_ins)))\ + $(if $(filter $(TARGET_OUT_ROOT)/%,$(ins)),\ + $(eval bui := $(word 1,$(bui_ins)))\ + $(eval my_built_modules += $(bui))\ + $(eval my_copy_dest := $(patsubst $(PRODUCT_OUT)/%,%,$(ins)))\ + $(eval my_copy_dest := $(subst /,$(space),$(my_copy_dest)))\ + $(eval my_copy_dest := $(wordlist 2,999,$(my_copy_dest)))\ + $(eval my_copy_dest := $(subst $(space),/,$(my_copy_dest)))\ + $(eval my_copy_pairs += $(bui):$(my_staging_dir)/$(my_copy_dest)))\ + )) + +# Collect CUSTOM_IMAGE_COPY_FILES. +my_image_copy_files := +$(foreach f,$(CUSTOM_IMAGE_COPY_FILES),\ + $(eval pair := $(subst :,$(space),$(f)))\ + $(eval src := $(word 1,$(pair)))\ + $(eval my_image_copy_files += $(src))\ + $(eval my_copy_pairs += $(src):$(my_staging_dir)/$(word 2,$(pair)))) + +$(my_built_custom_image): PRIVATE_INTERMEDIATES := $(intermediates) +$(my_built_custom_image): PRIVATE_MOUNT_POINT := $(CUSTOM_IMAGE_MOUNT_POINT) +$(my_built_custom_image): PRIVATE_PARTITION_SIZE := $(CUSTOM_IMAGE_PARTITION_SIZE) +$(my_built_custom_image): PRIVATE_FILE_SYSTEM_TYPE := $(CUSTOM_IMAGE_FILE_SYSTEM_TYPE) +$(my_built_custom_image): PRIVATE_STAGING_DIR := $(my_staging_dir) +$(my_built_custom_image): PRIVATE_COPY_PAIRS := $(my_copy_pairs) +$(my_built_custom_image): PRIVATE_PICKUP_FILES := $(my_pickup_files) +$(my_built_custom_image): PRIVATE_DICT_FILE := $(CUSTOM_IMAGE_DICT_FILE) +$(my_built_custom_image): $(INTERNAL_USERIMAGES_DEPS) $(my_built_modules) $(my_image_copy_files) \ + $(CUSTOM_IMAGE_DICT_FILE) + @echo "Build image $@" + $(hide) rm -rf $(PRIVATE_INTERMEDIATES) && mkdir -p $(PRIVATE_INTERMEDIATES) + $(hide) rm -rf $(PRIVATE_STAGING_DIR) && mkdir -p $(PRIVATE_STAGING_DIR) + # Copy all the files. + $(hide) $(foreach p,$(PRIVATE_COPY_PAIRS),\ + $(eval pair := $(subst :,$(space),$(p)))\ + mkdir -p $(dir $(word 2,$(pair)));\ + cp -Rf $(word 1,$(pair)) $(word 2,$(pair));) + $(if $($(PRIVATE_PICKUP_FILES)),$(hide) cp -Rf $(PRIVATE_PICKUP_FILES) $(PRIVATE_STAGING_DIR)) + # Generate the dict. + $(hide) echo "# For all accepted properties, see BuildImage() in tools/releasetools/build_image.py" > $(PRIVATE_INTERMEDIATES)/image_info.txt + $(hide) echo "mount_point=$(PRIVATE_MOUNT_POINT)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt + $(hide) echo "fs_type=$(PRIVATE_FILE_SYSTEM_TYPE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt + $(hide) echo "partition_size=$(PRIVATE_PARTITION_SIZE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt + $(if $(PRIVATE_DICT_FILE),\ + $(hide) echo "# Properties from $(PRIVATE_DICT_FILE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\ + cat $(PRIVATE_DICT_FILE) >> $(PRIVATE_INTERMEDIATES)/image_info.txt) + # Generate the image. + $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ + ./build/tools/releasetools/build_image.py \ + $(PRIVATE_STAGING_DIR) $(PRIVATE_INTERMEDIATES)/image_info.txt $@ + +my_installed_custom_image := $(PRODUCT_OUT)/$(notdir $(my_built_custom_image)) +$(my_installed_custom_image) : $(my_built_custom_image) + $(call copy-file-to-new-target-with-cp) + +.PHONY: $(my_custom_image_name) +custom_images $(my_custom_image_name) : $(my_installed_custom_image) + +# Archive the built image. +$(call dist-for-goals, $(my_custom_image_name) custom_images,$(my_installed_custom_image)) |