Home | History | Annotate | Download | only in diskinstaller
      1 # note: requires x86 because we assume grub is the mbr bootloader.
      2 ifeq ($(TARGET_ARCH),x86)
      3 ifeq ($(TARGET_USE_DISKINSTALLER),true)
      4 
      5 diskinstaller_root := bootable/diskinstaller
      6 
      7 android_sysbase_modules := \
      8 	libc \
      9 	libcutils \
     10 	libdl \
     11 	liblog \
     12 	libm \
     13 	libstdc++ \
     14 	linker \
     15 	ash \
     16 	toolbox \
     17 	logcat \
     18 	gdbserver \
     19 	strace \
     20 	netcfg
     21 android_sysbase_files = \
     22 	$(call module-installed-files,$(android_sysbase_modules))
     23 
     24 # $(1): source base dir
     25 # $(2): target base dir
     26 define sysbase-copy-files
     27 $(hide) $(foreach _f,$(android_sysbase_files), \
     28 	f=$(patsubst $(1)/%,$(2)/%,$(_f)); \
     29 	mkdir -p `dirname $$f`; \
     30 	echo "Copy: $$f" ; \
     31 	cp -fR $(_f) $$f; \
     32 )
     33 endef
     34 
     35 installer_base_modules := \
     36 	libdiskconfig \
     37 	libext2fs \
     38 	libext2_com_err \
     39 	libext2_e2p \
     40 	libext2_blkid \
     41 	libext2_uuid \
     42 	libext2_profile \
     43 	badblocks \
     44 	resize2fs \
     45 	tune2fs \
     46 	mke2fs \
     47 	e2fsck
     48 installer_base_files = \
     49 	$(call module-built-files,$(installer_base_modules))
     50 
     51 # $(1): source base dir
     52 # $(2): target base dir
     53 define installer-copy-modules
     54 $(hide) $(foreach m,$(installer_base_modules), \
     55 	src=$(firstword $(strip $(call module-built-files,$(m)))); \
     56 	dest=$(patsubst $(strip $(1))/%,$(strip $(2))/%,\
     57 		$(firstword $(strip $(call module-installed-files,$(m))))); \
     58 	echo "Copy: $$src -> $$dest"; \
     59 	mkdir -p `dirname $$dest`; \
     60 	cp -fdp $$src $$dest; \
     61 )
     62 endef
     63 
     64 # Build the installer ramdisk image
     65 installer_initrc := $(diskinstaller_root)/init.rc
     66 installer_kernel := $(INSTALLED_KERNEL_TARGET)
     67 installer_ramdisk := $(TARGET_INSTALLER_OUT)/ramdisk-installer.img
     68 installer_build_prop := $(INSTALLED_BUILD_PROP_TARGET)
     69 installer_config := $(diskinstaller_root)/installer.conf
     70 installer_binary := \
     71 	$(call intermediates-dir-for,EXECUTABLES,diskinstaller)/diskinstaller
     72 
     73 $(installer_ramdisk): $(diskinstaller_root)/config.mk \
     74 		$(MKBOOTFS) \
     75 		$(INSTALLED_RAMDISK_TARGET) \
     76 		$(INSTALLED_BOOTIMAGE_TARGET) \
     77 		$(TARGET_DISK_LAYOUT_CONFIG) \
     78 		$(installer_binary) \
     79 		$(installer_initrc) \
     80 		$(installer_kernel) \
     81 		$(installer_config) \
     82 		$(android_sysbase_files) \
     83 		$(installer_base_files) \
     84 		$(installer_build_prop)
     85 	@echo ----- Making installer image ------
     86 	rm -rf $(TARGET_INSTALLER_OUT)
     87 	mkdir -p $(TARGET_INSTALLER_OUT)
     88 	mkdir -p $(TARGET_INSTALLER_ROOT_OUT)
     89 	mkdir -p $(TARGET_INSTALLER_ROOT_OUT)/sbin
     90 	mkdir -p $(TARGET_INSTALLER_ROOT_OUT)/data
     91 	mkdir -p $(TARGET_INSTALLER_SYSTEM_OUT)
     92 	mkdir -p $(TARGET_INSTALLER_SYSTEM_OUT)/etc
     93 	mkdir -p $(TARGET_INSTALLER_SYSTEM_OUT)/bin
     94 	@echo Copying baseline ramdisk...
     95 	cp -fR $(TARGET_ROOT_OUT) $(TARGET_INSTALLER_OUT)
     96 	@echo Copying sysbase files...
     97 	$(call sysbase-copy-files,$(TARGET_OUT),$(TARGET_INSTALLER_SYSTEM_OUT))
     98 	@echo Copying installer base files...
     99 	$(call installer-copy-modules,$(TARGET_OUT),\
    100 		$(TARGET_INSTALLER_SYSTEM_OUT))
    101 	@echo Modifying ramdisk contents...
    102 	cp -f $(installer_initrc) $(TARGET_INSTALLER_ROOT_OUT)/
    103 	cp -f $(TARGET_DISK_LAYOUT_CONFIG) \
    104 		$(TARGET_INSTALLER_SYSTEM_OUT)/etc/disk_layout.conf
    105 	cp -f $(installer_config) \
    106 		$(TARGET_INSTALLER_SYSTEM_OUT)/etc/installer.conf
    107 	cp -f $(installer_binary) $(TARGET_INSTALLER_SYSTEM_OUT)/bin/installer
    108 	$(hide) chmod ug+rw $(TARGET_INSTALLER_ROOT_OUT)/default.prop
    109 	cat $(installer_build_prop) >> $(TARGET_INSTALLER_ROOT_OUT)/default.prop
    110 	$(MKBOOTFS) $(TARGET_INSTALLER_ROOT_OUT) | gzip > $(installer_ramdisk)
    111 	@echo ----- Made installer ramdisk -[ $@ ]-
    112 
    113 ######################################################################
    114 # Now the installer boot image which includes the kernel and the ramdisk
    115 internal_installerimage_args := \
    116 	--kernel $(installer_kernel) \
    117 	--ramdisk $(installer_ramdisk)
    118 
    119 internal_installerimage_files := \
    120 	$(filter-out --%,$(internal_installerimage_args))
    121 
    122 BOARD_INSTALLER_CMDLINE := $(strip $(BOARD_INSTALLER_CMDLINE))
    123 ifdef BOARD_INSTALLER_CMDLINE
    124   internal_installerimage_args += --cmdline "$(BOARD_INSTALLER_CMDLINE)"
    125 endif
    126 
    127 installer_tmp_img := $(TARGET_INSTALLER_OUT)/installer_tmp.img
    128 tmp_dir_for_inst_image := \
    129 	$(call intermediates-dir-for,EXECUTABLES,installer_img)/installer_img
    130 internal_installerimage_args += --tmpdir $(tmp_dir_for_inst_image)
    131 internal_installerimage_args += --genext2fs $(MKEXT2IMG)
    132 $(installer_tmp_img): $(MKEXT2IMG) $(internal_installerimage_files)
    133 	$(call pretty,"Target installer image: $@")
    134 	$(hide) $(MKEXT2BOOTIMG) $(internal_installerimage_args) --output $@
    135 
    136 ######################################################################
    137 # Now make a data image that contains all the target image files for the
    138 # installer.
    139 
    140 bootldr_bin := $(PRODUCT_OUT)/grub/grub.bin
    141 installer_target_data_files := \
    142 	$(INSTALLED_BOOTIMAGE_TARGET) \
    143 	$(INSTALLED_SYSTEMIMAGE) \
    144 	$(INSTALLED_USERDATAIMAGE_TARGET) \
    145 	$(bootldr_bin)
    146 
    147 # $(1): src directory
    148 # $(2): output file
    149 # $(3): mount point
    150 # $(4): ext variant (ext2, ext3, ext4)
    151 # $(5): size of the partition
    152 define build-installerimage-ext-target
    153   @mkdir -p $(dir $(2))
    154     $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$(PATH) \
    155           $(MKEXTUSERIMG) $(1) $(2) $(4) $(3) $(5)
    156 endef
    157 
    158 installer_data_img := $(TARGET_INSTALLER_OUT)/installer_data.img
    159 $(installer_data_img): $(diskinstaller_root)/config.mk \
    160 			$(installer_target_data_files) \
    161 			$(MKEXT2IMG) \
    162 			$(installer_ramdisk)
    163 	@echo --- Making installer data image ------
    164 	mkdir -p $(TARGET_INSTALLER_OUT)
    165 	mkdir -p $(TARGET_INSTALLER_OUT)/data
    166 	cp -f $(bootldr_bin) $(TARGET_INSTALLER_OUT)/data/bootldr.bin
    167 	cp -f $(INSTALLED_BOOTIMAGE_TARGET) $(TARGET_INSTALLER_OUT)/data/boot.img
    168 	cp -f $(INSTALLED_SYSTEMIMAGE) \
    169 		$(TARGET_INSTALLER_OUT)/data/system.img
    170 	cp -f $(INSTALLED_USERDATAIMAGE_TARGET) \
    171 		$(TARGET_INSTALLER_OUT)/data/userdata.img
    172 	$(call build-installerimage-ext-target,$(TARGET_INSTALLER_OUT)/data,$@, \
    173 		inst_data,ext4,$(BOARD_INSTALLERIMAGE_PARTITION_SIZE))
    174 	@echo --- Finished installer data image -[ $@ ]-
    175 
    176 ######################################################################
    177 # now combine the installer image with the grub bootloader
    178 grub_bin := $(PRODUCT_OUT)/grub/grub.bin
    179 installer_layout := $(diskinstaller_root)/installer_img_layout.conf
    180 edit_mbr := $(HOST_OUT_EXECUTABLES)/editdisklbl
    181 
    182 INSTALLED_DISK_INSTALLER_IMAGE_TARGET := $(PRODUCT_OUT)/installer.img
    183 $(INSTALLED_DISK_INSTALLER_IMAGE_TARGET): \
    184 					$(installer_tmp_img) \
    185 					$(installer_data_img) \
    186 					$(grub_bin) \
    187 					$(edit_mbr) \
    188 					$(installer_layout)
    189 	@echo "Creating bootable installer image: $@"
    190 	@rm -f $@
    191 	$(hide) cat $(grub_bin) > $@
    192 	$(hide) $(edit_mbr) -l $(installer_layout) -i $@ \
    193 		inst_boot=$(installer_tmp_img) \
    194 		inst_data=$(installer_data_img)
    195 	@echo "Done with bootable installer image -[ $@ ]-"
    196 
    197 #
    198 # Ditto for the android_system_disk and android_data_disk images
    199 #
    200 
    201 INSTALLED_ANDROID_IMAGE_SYSTEM_TARGET := $(PRODUCT_OUT)/android_system_disk.img
    202 android_system_layout := $(diskinstaller_root)/android_img_system_layout.conf
    203 
    204 INSTALLED_ANDROID_IMAGE_DATA_TARGET := $(PRODUCT_OUT)/android_data_disk.img
    205 android_data_layout := $(diskinstaller_root)/android_img_data_layout.conf
    206 
    207 $(INSTALLED_ANDROID_IMAGE_SYSTEM_TARGET): \
    208 					$(INSTALLED_SYSTEMIMAGE) \
    209 					$(INSTALLED_BOOTIMAGE_TARGET) \
    210 					$(grub_bin) \
    211 					$(edit_mbr) \
    212 					$(android_system_layout)
    213 	@echo "Creating bootable android system-disk image: $@"
    214 	@rm -f $@
    215 	$(hide) cat $(grub_bin) > $@
    216 	$(hide) $(edit_mbr) -l $(android_system_layout) -i $@ \
    217 		inst_boot=$(INSTALLED_BOOTIMAGE_TARGET) \
    218 		inst_system=$(INSTALLED_SYSTEMIMAGE)
    219 	@echo "Done with bootable android system-disk image -[ $@ ]-"
    220 
    221 $(INSTALLED_ANDROID_IMAGE_DATA_TARGET): \
    222 					$(INSTALLED_USERDATAIMAGE_TARGET) \
    223 					$(grub_bin) \
    224 					$(edit_mbr) \
    225 					$(android_data_layout)
    226 	@echo "Creating bootable android data-disk image: $@"
    227 	@rm -f $@
    228 	$(hide) cat $(grub_bin) > $@
    229 	$(hide) $(edit_mbr) -l $(android_data_layout) -i $@ \
    230 		inst_data=$(INSTALLED_USERDATAIMAGE_TARGET) \
    231 		inst_cache=$(INSTALLED_CACHEIMAGE_TARGET)
    232 	@echo "Done with bootable android data-disk image -[ $@ ]-"
    233 
    234 
    235 
    236 ######################################################################
    237 # now convert the installer_img (disk image) to a VirtualBox image
    238 
    239 INSTALLED_VBOX_INSTALLER_IMAGE_TARGET := $(PRODUCT_OUT)/installer.vdi
    240 virtual_box_manager := VBoxManage
    241 # hrd-code the UUID so we don't have to release the disk manually in the VirtualBox manager.
    242 virtual_box_manager_options := convertfromraw --format VDI
    243 virtual_box_manager_system_disk_ptions := --uuid "{aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa}"
    244 virtual_box_manager_data_disk_ptions   := --uuid "{bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb}"
    245 
    246 $(INSTALLED_VBOX_INSTALLER_IMAGE_TARGET): $(INSTALLED_DISK_INSTALLER_IMAGE_TARGET)
    247 	@rm -f $(INSTALLED_VBOX_INSTALLER_IMAGE_TARGET)
    248 	$(hide) $(virtual_box_manager) $(virtual_box_manager_options) $(INSTALLED_DISK_INSTALLER_IMAGE_TARGET) $(INSTALLED_VBOX_INSTALLER_IMAGE_TARGET)
    249 	@echo "Done with VirtualBox bootable installer image -[ $@ ]-"
    250 
    251 #
    252 # Ditto for the android_system_disk and android_user_disk images
    253 #
    254 
    255 INSTALLED_VBOX_SYSTEM_DISK_IMAGE_TARGET := $(PRODUCT_OUT)/android_system_disk.vdi
    256 $(INSTALLED_VBOX_SYSTEM_DISK_IMAGE_TARGET): $(INSTALLED_ANDROID_IMAGE_SYSTEM_TARGET)
    257 	@rm -f $@
    258 	$(hide) $(virtual_box_manager) \
    259 		$(virtual_box_manager_options) \
    260 		$(virtual_box_manager_system_disk_ptions) \
    261 		$^ $@
    262 	@echo "Done with VirtualBox bootable system-disk image -[ $@ ]-"
    263 
    264 INSTALLED_VBOX_DATA_DISK_IMAGE_TARGET := $(PRODUCT_OUT)/android_data_disk.vdi
    265 $(INSTALLED_VBOX_DATA_DISK_IMAGE_TARGET): $(INSTALLED_ANDROID_IMAGE_DATA_TARGET)
    266 	@rm -f $@
    267 	$(hide) $(virtual_box_manager) \
    268 		$(virtual_box_manager_options) \
    269 		$(virtual_box_manager_data_disk_ptions) \
    270 		$^ $@
    271 	@echo "Done with VirtualBox bootable data-disk image -[ $@ ]-"
    272 
    273 .PHONY: installer_img
    274 installer_img: $(INSTALLED_DISK_INSTALLER_IMAGE_TARGET)
    275 
    276 .PHONY: installer_vdi
    277 installer_vdi: $(INSTALLED_VBOX_INSTALLER_IMAGE_TARGET)
    278 
    279 .PHONY: android_disk_vdi android_system_disk_vdi android_data_disk_vdi
    280 android_system_disk_vdi: $(INSTALLED_VBOX_SYSTEM_DISK_IMAGE_TARGET)
    281 android_data_disk_vdi: $(INSTALLED_VBOX_DATA_DISK_IMAGE_TARGET)
    282 android_disk_vdi: android_system_disk_vdi android_data_disk_vdi
    283 
    284 
    285 else  # ! TARGET_USE_DISKINSTALLER
    286 INSTALLED_DISK_INSTALLER_IMAGE_TARGET :=
    287 INSTALLED_VBOX_SYSTEM_DISK_IMAGE_TARGET :=
    288 INSTALLED_VBOX_DATA_DISK_IMAGE_TARGET :=
    289 endif
    290 endif # TARGET_ARCH == x86
    291