# note: requires x86 because we assume grub is the mbr bootloader.
ifeq ($(TARGET_ARCH),x86)
ifeq ($(TARGET_USE_DISKINSTALLER),true)
diskinstaller_root := bootable/diskinstaller
android_sysbase_modules := \
libc \
libcutils \
libdl \
liblog \
libm \
libstdc++ \
linker \
ash \
toolbox \
logcat \
gdbserver \
strace \
netcfg
android_sysbase_files = \
$(call module-installed-files,$(android_sysbase_modules))
# $(1): source base dir
# $(2): target base dir
define sysbase-copy-files
$(hide) $(foreach _f,$(android_sysbase_files), \
f=$(patsubst $(1)/%,$(2)/%,$(_f)); \
mkdir -p `dirname $$f`; \
echo "Copy: $$f" ; \
cp -fR $(_f) $$f; \
)
endef
installer_base_modules := \
libdiskconfig \
libext2fs \
libext2_com_err \
libext2_e2p \
libext2_blkid \
libext2_uuid \
libext2_profile \
badblocks \
resize2fs \
tune2fs \
mke2fs \
e2fsck
installer_base_files = \
$(call module-built-files,$(installer_base_modules))
# $(1): source base dir
# $(2): target base dir
define installer-copy-modules
$(hide) $(foreach m,$(installer_base_modules), \
src=$(firstword $(strip $(call module-built-files,$(m)))); \
dest=$(patsubst $(strip $(1))/%,$(strip $(2))/%,\
$(firstword $(strip $(call module-installed-files,$(m))))); \
echo "Copy: $$src -> $$dest"; \
mkdir -p `dirname $$dest`; \
cp -fdp $$src $$dest; \
)
endef
# Build the installer ramdisk image
installer_initrc := $(diskinstaller_root)/init.rc
installer_kernel := $(INSTALLED_KERNEL_TARGET)
installer_ramdisk := $(TARGET_INSTALLER_OUT)/ramdisk-installer.img
installer_build_prop := $(INSTALLED_BUILD_PROP_TARGET)
installer_config := $(diskinstaller_root)/installer.conf
installer_binary := \
$(call intermediates-dir-for,EXECUTABLES,diskinstaller)/diskinstaller
$(installer_ramdisk): $(diskinstaller_root)/config.mk \
$(MKBOOTFS) \
$(INSTALLED_RAMDISK_TARGET) \
$(INSTALLED_BOOTIMAGE_TARGET) \
$(TARGET_DISK_LAYOUT_CONFIG) \
$(installer_binary) \
$(installer_initrc) \
$(installer_kernel) \
$(installer_config) \
$(android_sysbase_files) \
$(installer_base_files) \
$(installer_build_prop)
@echo ----- Making installer image ------
rm -rf $(TARGET_INSTALLER_OUT)
mkdir -p $(TARGET_INSTALLER_OUT)
mkdir -p $(TARGET_INSTALLER_ROOT_OUT)
mkdir -p $(TARGET_INSTALLER_ROOT_OUT)/sbin
mkdir -p $(TARGET_INSTALLER_ROOT_OUT)/data
mkdir -p $(TARGET_INSTALLER_SYSTEM_OUT)
mkdir -p $(TARGET_INSTALLER_SYSTEM_OUT)/etc
mkdir -p $(TARGET_INSTALLER_SYSTEM_OUT)/bin
@echo Copying baseline ramdisk...
cp -fR $(TARGET_ROOT_OUT) $(TARGET_INSTALLER_OUT)
@echo Copying sysbase files...
$(call sysbase-copy-files,$(TARGET_OUT),$(TARGET_INSTALLER_SYSTEM_OUT))
@echo Copying installer base files...
$(call installer-copy-modules,$(TARGET_OUT),\
$(TARGET_INSTALLER_SYSTEM_OUT))
@echo Modifying ramdisk contents...
cp -f $(installer_initrc) $(TARGET_INSTALLER_ROOT_OUT)/
cp -f $(TARGET_DISK_LAYOUT_CONFIG) \
$(TARGET_INSTALLER_SYSTEM_OUT)/etc/disk_layout.conf
cp -f $(installer_config) \
$(TARGET_INSTALLER_SYSTEM_OUT)/etc/installer.conf
cp -f $(installer_binary) $(TARGET_INSTALLER_SYSTEM_OUT)/bin/installer
$(hide) chmod ug+rw $(TARGET_INSTALLER_ROOT_OUT)/default.prop
cat $(installer_build_prop) >> $(TARGET_INSTALLER_ROOT_OUT)/default.prop
$(MKBOOTFS) $(TARGET_INSTALLER_ROOT_OUT) | gzip > $(installer_ramdisk)
@echo ----- Made installer ramdisk -[ $@ ]-
######################################################################
# Now the installer boot image which includes the kernel and the ramdisk
internal_installerimage_args := \
--kernel $(installer_kernel) \
--ramdisk $(installer_ramdisk)
internal_installerimage_files := \
$(filter-out --%,$(internal_installerimage_args))
BOARD_INSTALLER_CMDLINE := $(strip $(BOARD_INSTALLER_CMDLINE))
ifdef BOARD_INSTALLER_CMDLINE
internal_installerimage_args += --cmdline "$(BOARD_INSTALLER_CMDLINE)"
endif
installer_tmp_img := $(TARGET_INSTALLER_OUT)/installer_tmp.img
tmp_dir_for_inst_image := \
$(call intermediates-dir-for,EXECUTABLES,installer_img)/installer_img
internal_installerimage_args += --tmpdir $(tmp_dir_for_inst_image)
internal_installerimage_args += --genext2fs $(MKEXT2IMG)
$(installer_tmp_img): $(MKEXT2IMG) $(internal_installerimage_files)
$(call pretty,"Target installer image: $@")
$(hide) $(MKEXT2BOOTIMG) $(internal_installerimage_args) --output $@
######################################################################
# Now make a data image that contains all the target image files for the
# installer.
bootldr_bin := $(PRODUCT_OUT)/grub/grub.bin
installer_target_data_files := \
$(INSTALLED_BOOTIMAGE_TARGET) \
$(INSTALLED_SYSTEMIMAGE) \
$(INSTALLED_USERDATAIMAGE_TARGET) \
$(bootldr_bin)
# $(1): src directory
# $(2): output file
# $(3): mount point
# $(4): ext variant (ext2, ext3, ext4)
# $(5): size of the partition
define build-installerimage-ext-target
@mkdir -p $(dir $(2))
$(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$(PATH) \
$(MKEXTUSERIMG) $(1) $(2) $(4) $(3) $(5)
endef
installer_data_img := $(TARGET_INSTALLER_OUT)/installer_data.img
$(installer_data_img): $(diskinstaller_root)/config.mk \
$(installer_target_data_files) \
$(MKEXT2IMG) \
$(installer_ramdisk)
@echo --- Making installer data image ------
mkdir -p $(TARGET_INSTALLER_OUT)
mkdir -p $(TARGET_INSTALLER_OUT)/data
cp -f $(bootldr_bin) $(TARGET_INSTALLER_OUT)/data/bootldr.bin
cp -f $(INSTALLED_BOOTIMAGE_TARGET) $(TARGET_INSTALLER_OUT)/data/boot.img
cp -f $(INSTALLED_SYSTEMIMAGE) \
$(TARGET_INSTALLER_OUT)/data/system.img
cp -f $(INSTALLED_USERDATAIMAGE_TARGET) \
$(TARGET_INSTALLER_OUT)/data/userdata.img
$(call build-installerimage-ext-target,$(TARGET_INSTALLER_OUT)/data,$@, \
inst_data,ext4,$(BOARD_INSTALLERIMAGE_PARTITION_SIZE))
@echo --- Finished installer data image -[ $@ ]-
######################################################################
# now combine the installer image with the grub bootloader
grub_bin := $(PRODUCT_OUT)/grub/grub.bin
installer_layout := $(diskinstaller_root)/installer_img_layout.conf
edit_mbr := $(HOST_OUT_EXECUTABLES)/editdisklbl
INSTALLED_DISK_INSTALLER_IMAGE_TARGET := $(PRODUCT_OUT)/installer.img
$(INSTALLED_DISK_INSTALLER_IMAGE_TARGET): \
$(installer_tmp_img) \
$(installer_data_img) \
$(grub_bin) \
$(edit_mbr) \
$(installer_layout)
@echo "Creating bootable installer image: $@"
@rm -f $@
$(hide) cat $(grub_bin) > $@
$(hide) $(edit_mbr) -l $(installer_layout) -i $@ \
inst_boot=$(installer_tmp_img) \
inst_data=$(installer_data_img)
@echo "Done with bootable installer image -[ $@ ]-"
#
# Ditto for the android_system_disk and android_data_disk images
#
INSTALLED_ANDROID_IMAGE_SYSTEM_TARGET := $(PRODUCT_OUT)/android_system_disk.img
android_system_layout := $(diskinstaller_root)/android_img_system_layout.conf
INSTALLED_ANDROID_IMAGE_DATA_TARGET := $(PRODUCT_OUT)/android_data_disk.img
android_data_layout := $(diskinstaller_root)/android_img_data_layout.conf
$(INSTALLED_ANDROID_IMAGE_SYSTEM_TARGET): \
$(INSTALLED_SYSTEMIMAGE) \
$(INSTALLED_BOOTIMAGE_TARGET) \
$(grub_bin) \
$(edit_mbr) \
$(android_system_layout)
@echo "Creating bootable android system-disk image: $@"
@rm -f $@
$(hide) cat $(grub_bin) > $@
$(hide) $(edit_mbr) -l $(android_system_layout) -i $@ \
inst_boot=$(INSTALLED_BOOTIMAGE_TARGET) \
inst_system=$(INSTALLED_SYSTEMIMAGE)
@echo "Done with bootable android system-disk image -[ $@ ]-"
$(INSTALLED_ANDROID_IMAGE_DATA_TARGET): \
$(INSTALLED_USERDATAIMAGE_TARGET) \
$(grub_bin) \
$(edit_mbr) \
$(android_data_layout)
@echo "Creating bootable android data-disk image: $@"
@rm -f $@
$(hide) cat $(grub_bin) > $@
$(hide) $(edit_mbr) -l $(android_data_layout) -i $@ \
inst_data=$(INSTALLED_USERDATAIMAGE_TARGET) \
inst_cache=$(INSTALLED_CACHEIMAGE_TARGET)
@echo "Done with bootable android data-disk image -[ $@ ]-"
######################################################################
# now convert the installer_img (disk image) to a VirtualBox image
INSTALLED_VBOX_INSTALLER_IMAGE_TARGET := $(PRODUCT_OUT)/installer.vdi
virtual_box_manager := VBoxManage
# hrd-code the UUID so we don't have to release the disk manually in the VirtualBox manager.
virtual_box_manager_options := convertfromraw --format VDI
virtual_box_manager_system_disk_ptions := --uuid "{aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa}"
virtual_box_manager_data_disk_ptions := --uuid "{bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb}"
$(INSTALLED_VBOX_INSTALLER_IMAGE_TARGET): $(INSTALLED_DISK_INSTALLER_IMAGE_TARGET)
@rm -f $(INSTALLED_VBOX_INSTALLER_IMAGE_TARGET)
$(hide) $(virtual_box_manager) $(virtual_box_manager_options) $(INSTALLED_DISK_INSTALLER_IMAGE_TARGET) $(INSTALLED_VBOX_INSTALLER_IMAGE_TARGET)
@echo "Done with VirtualBox bootable installer image -[ $@ ]-"
#
# Ditto for the android_system_disk and android_user_disk images
#
INSTALLED_VBOX_SYSTEM_DISK_IMAGE_TARGET := $(PRODUCT_OUT)/android_system_disk.vdi
$(INSTALLED_VBOX_SYSTEM_DISK_IMAGE_TARGET): $(INSTALLED_ANDROID_IMAGE_SYSTEM_TARGET)
@rm -f $@
$(hide) $(virtual_box_manager) \
$(virtual_box_manager_options) \
$(virtual_box_manager_system_disk_ptions) \
$^ $@
@echo "Done with VirtualBox bootable system-disk image -[ $@ ]-"
INSTALLED_VBOX_DATA_DISK_IMAGE_TARGET := $(PRODUCT_OUT)/android_data_disk.vdi
$(INSTALLED_VBOX_DATA_DISK_IMAGE_TARGET): $(INSTALLED_ANDROID_IMAGE_DATA_TARGET)
@rm -f $@
$(hide) $(virtual_box_manager) \
$(virtual_box_manager_options) \
$(virtual_box_manager_data_disk_ptions) \
$^ $@
@echo "Done with VirtualBox bootable data-disk image -[ $@ ]-"
.PHONY: installer_img
installer_img: $(INSTALLED_DISK_INSTALLER_IMAGE_TARGET)
.PHONY: installer_vdi
installer_vdi: $(INSTALLED_VBOX_INSTALLER_IMAGE_TARGET)
.PHONY: android_disk_vdi android_system_disk_vdi android_data_disk_vdi
android_system_disk_vdi: $(INSTALLED_VBOX_SYSTEM_DISK_IMAGE_TARGET)
android_data_disk_vdi: $(INSTALLED_VBOX_DATA_DISK_IMAGE_TARGET)
android_disk_vdi: android_system_disk_vdi android_data_disk_vdi
else # ! TARGET_USE_DISKINSTALLER
INSTALLED_DISK_INSTALLER_IMAGE_TARGET :=
INSTALLED_VBOX_SYSTEM_DISK_IMAGE_TARGET :=
INSTALLED_VBOX_DATA_DISK_IMAGE_TARGET :=
endif
endif # TARGET_ARCH == x86