13c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker#!/usr/bin/env python 23c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker# 33c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker# Copyright (C) 2014 The Android Open Source Project 43c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker# 53c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker# Licensed under the Apache License, Version 2.0 (the "License"); 63c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker# you may not use this file except in compliance with the License. 73c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker# You may obtain a copy of the License at 83c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker# 93c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker# http://www.apache.org/licenses/LICENSE-2.0 103c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker# 113c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker# Unless required by applicable law or agreed to in writing, software 123c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker# distributed under the License is distributed on an "AS IS" BASIS, 133c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 143c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker# See the License for the specific language governing permissions and 153c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker# limitations under the License. 163c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 173c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker""" 183c84f569487c4e59baa332be33b5430fdefb76b3Doug ZongkerGiven a target-files zipfile that does not contain images (ie, does 193c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkernot have an IMAGES/ top-level subdirectory), produce the images and 203c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkeradd them to the zipfile. 213c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 223c84f569487c4e59baa332be33b5430fdefb76b3Doug ZongkerUsage: add_img_to_target_files target_files 233c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker""" 243c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 253c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkerimport sys 263c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 273c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkerif sys.hexversion < 0x02070000: 283c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker print >> sys.stderr, "Python 2.7 or newer is required." 293c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker sys.exit(1) 303c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 313c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkerimport errno 323c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkerimport os 333c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkerimport re 343c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkerimport shutil 353c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkerimport subprocess 363c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkerimport tempfile 373c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkerimport zipfile 383c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 393c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker# missing in Python 2.4 and before 403c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkerif not hasattr(os, "SEEK_SET"): 413c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker os.SEEK_SET = 0 423c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 433c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkerimport build_image 443c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkerimport common 453c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 463c84f569487c4e59baa332be33b5430fdefb76b3Doug ZongkerOPTIONS = common.OPTIONS 473c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 483c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 49fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongkerdef AddSystem(output_zip, prefix="IMAGES/"): 503c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker """Turn the contents of SYSTEM into a system image and store it in 513c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker output_zip.""" 52fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker block_list = common.MakeTempFile(prefix="system-blocklist-", suffix=".map") 53fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker imgname = BuildSystem(OPTIONS.input_tmp, OPTIONS.info_dict, 54fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker block_list=block_list) 55fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker with open(imgname, "rb") as f: 56fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker common.ZipWriteStr(output_zip, prefix + "system.img", f.read()) 57fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker with open(block_list, "rb") as f: 58fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker common.ZipWriteStr(output_zip, prefix + "system.map", f.read()) 59fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker 60fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker 61fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongkerdef BuildSystem(input_dir, info_dict, block_list=None): 62fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker """Build the (sparse) system image and return the name of a temp 63fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker file containing it.""" 64fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker return CreateImage(input_dir, info_dict, "system", block_list=block_list) 65fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker 66fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker 67fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongkerdef AddVendor(output_zip, prefix="IMAGES/"): 68fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker """Turn the contents of VENDOR into a vendor image and store in it 69fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker output_zip.""" 70fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker block_list = common.MakeTempFile(prefix="vendor-blocklist-", suffix=".map") 71fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker imgname = BuildVendor(OPTIONS.input_tmp, OPTIONS.info_dict, 725f9c28cad4cc0b499837e91a8eea344c26264e32Doug Zongker block_list=block_list) 73fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker with open(imgname, "rb") as f: 74fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker common.ZipWriteStr(output_zip, prefix + "vendor.img", f.read()) 75fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker with open(block_list, "rb") as f: 76fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker common.ZipWriteStr(output_zip, prefix + "vendor.map", f.read()) 773c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 783c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 79fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongkerdef BuildVendor(input_dir, info_dict, block_list=None): 80fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker """Build the (sparse) vendor image and return the name of a temp 81fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker file containing it.""" 82fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker return CreateImage(input_dir, info_dict, "vendor", block_list=block_list) 833c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 84fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker 85fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongkerdef CreateImage(input_dir, info_dict, what, block_list=None): 863c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker print "creating " + what + ".img..." 873c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 88fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker img = common.MakeTempFile(prefix=what + "-", suffix=".img") 893c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 903c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker # The name of the directory it is making an image out of matters to 913c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker # mkyaffs2image. It wants "system" but we have a directory named 923c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker # "SYSTEM", so create a symlink. 933c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker try: 943c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker os.symlink(os.path.join(input_dir, what.upper()), 953c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker os.path.join(input_dir, what)) 963c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker except OSError, e: 973c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker # bogus error on my mac version? 983c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker # File "./build/tools/releasetools/img_from_target_files", line 86, in AddSystem 993c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker # os.path.join(OPTIONS.input_tmp, "system")) 1003c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker # OSError: [Errno 17] File exists 1013c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker if (e.errno == errno.EEXIST): 1023c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker pass 1033c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1043c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker image_props = build_image.ImagePropFromGlobalDict(info_dict, what) 1053c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker fstab = info_dict["fstab"] 1063c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker if fstab: 1073c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker image_props["fs_type" ] = fstab["/" + what].fs_type 1083c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1093c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker if what == "system": 1103c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker fs_config_prefix = "" 1113c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker else: 1123c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker fs_config_prefix = what + "_" 1133c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1143c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker fs_config = os.path.join( 1153c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker input_dir, "META/" + fs_config_prefix + "filesystem_config.txt") 1163c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker if not os.path.exists(fs_config): fs_config = None 1173c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1183c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker fc_config = os.path.join(input_dir, "BOOT/RAMDISK/file_contexts") 1193c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker if not os.path.exists(fc_config): fc_config = None 1203c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1213c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker succ = build_image.BuildImage(os.path.join(input_dir, what), 122fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker image_props, img, 1233c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker fs_config=fs_config, 124f21cb5a2198b843fe1c8e9577cc2ad61e0f5cfb4Doug Zongker fc_config=fc_config, 125f21cb5a2198b843fe1c8e9577cc2ad61e0f5cfb4Doug Zongker block_list=block_list) 1263c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker assert succ, "build " + what + ".img image failed" 1273c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 128fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker return img 1293c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1303c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1313c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkerdef AddUserdata(output_zip, prefix="IMAGES/"): 1323c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker """Create an empty userdata image and store it in output_zip.""" 1333c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1343c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker image_props = build_image.ImagePropFromGlobalDict(OPTIONS.info_dict, 1353c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker "data") 1363c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker # We only allow yaffs to have a 0/missing partition_size. 1373c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker # Extfs, f2fs must have a size. Skip userdata.img if no size. 1383c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker if (not image_props.get("fs_type", "").startswith("yaffs") and 1393c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker not image_props.get("partition_size")): 1403c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker return 1413c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1423c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker print "creating userdata.img..." 1433c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1443c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker # The name of the directory it is making an image out of matters to 1453c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker # mkyaffs2image. So we create a temp dir, and within it we create an 1463c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker # empty dir named "data", and build the image from that. 1473c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker temp_dir = tempfile.mkdtemp() 1483c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker user_dir = os.path.join(temp_dir, "data") 1493c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker os.mkdir(user_dir) 1503c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker img = tempfile.NamedTemporaryFile() 1513c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1523c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker fstab = OPTIONS.info_dict["fstab"] 1533c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker if fstab: 1543c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker image_props["fs_type" ] = fstab["/data"].fs_type 1553c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker succ = build_image.BuildImage(user_dir, image_props, img.name) 1563c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker assert succ, "build userdata.img image failed" 1573c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1583c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker common.CheckSize(img.name, "userdata.img", OPTIONS.info_dict) 1593c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker output_zip.write(img.name, prefix + "userdata.img") 1603c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker img.close() 1613c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker os.rmdir(user_dir) 1623c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker os.rmdir(temp_dir) 1633c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1643c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1653c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkerdef AddCache(output_zip, prefix="IMAGES/"): 1663c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker """Create an empty cache image and store it in output_zip.""" 1673c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1683c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker image_props = build_image.ImagePropFromGlobalDict(OPTIONS.info_dict, 1693c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker "cache") 1703c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker # The build system has to explicitly request for cache.img. 1713c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker if "fs_type" not in image_props: 1723c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker return 1733c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1743c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker print "creating cache.img..." 1753c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1763c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker # The name of the directory it is making an image out of matters to 1773c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker # mkyaffs2image. So we create a temp dir, and within it we create an 1783c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker # empty dir named "cache", and build the image from that. 1793c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker temp_dir = tempfile.mkdtemp() 1803c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker user_dir = os.path.join(temp_dir, "cache") 1813c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker os.mkdir(user_dir) 1823c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker img = tempfile.NamedTemporaryFile() 1833c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1843c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker fstab = OPTIONS.info_dict["fstab"] 1853c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker if fstab: 1863c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker image_props["fs_type" ] = fstab["/cache"].fs_type 1873c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker succ = build_image.BuildImage(user_dir, image_props, img.name) 1883c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker assert succ, "build cache.img image failed" 1893c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1903c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker common.CheckSize(img.name, "cache.img", OPTIONS.info_dict) 1913c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker output_zip.write(img.name, prefix + "cache.img") 1923c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker img.close() 1933c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker os.rmdir(user_dir) 1943c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker os.rmdir(temp_dir) 1953c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1963c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 1973c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkerdef AddImagesToTargetFiles(filename): 1983c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker OPTIONS.input_tmp, input_zip = common.UnzipTemp(filename) 1993c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 200fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker for n in input_zip.namelist(): 201fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker if n.startswith("IMAGES/"): 202fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker print "target_files appears to already contain images." 203fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker sys.exit(1) 2043c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 205fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker try: 206fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker input_zip.getinfo("VENDOR/") 207fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker has_vendor = True 208fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker except KeyError: 209fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker has_vendor = False 210fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker 211fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker OPTIONS.info_dict = common.LoadInfoDict(input_zip) 212fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker if "selinux_fc" in OPTIONS.info_dict: 213fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker OPTIONS.info_dict["selinux_fc"] = os.path.join( 214fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker OPTIONS.input_tmp, "BOOT", "RAMDISK", "file_contexts") 215fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker 216fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker input_zip.close() 217fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker output_zip = zipfile.ZipFile(filename, "a", 218fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker compression=zipfile.ZIP_DEFLATED) 219fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker 220fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker def banner(s): 221fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker print "\n\n++++ " + s + " ++++\n\n" 222fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker 223fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker banner("boot") 224fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker boot_image = common.GetBootableImage( 225fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker "IMAGES/boot.img", "boot.img", OPTIONS.input_tmp, "BOOT") 226fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker if boot_image: 227fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker boot_image.AddToZip(output_zip) 228fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker 229fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker banner("recovery") 230fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker recovery_image = common.GetBootableImage( 231fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker "IMAGES/recovery.img", "recovery.img", OPTIONS.input_tmp, "RECOVERY") 232fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker if recovery_image: 233fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker recovery_image.AddToZip(output_zip) 234fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker 235fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker banner("system") 236fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker AddSystem(output_zip) 237fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker if has_vendor: 238fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker banner("vendor") 239fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker AddVendor(output_zip) 240fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker banner("userdata") 241fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker AddUserdata(output_zip) 242fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker banner("cache") 243fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker AddCache(output_zip) 244fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker 245fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker output_zip.close() 2463c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 2473c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 2483c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkerdef main(argv): 2493c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker args = common.ParseOptions(argv, __doc__) 2503c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 2513c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker if len(args) != 1: 2523c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker common.Usage(__doc__) 2533c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker sys.exit(1) 2543c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 2553c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker AddImagesToTargetFiles(args[0]) 2563c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker print "done." 2573c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker 2583c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongkerif __name__ == '__main__': 2593c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker try: 2603c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker common.CloseInheritedPipes() 2613c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker main(sys.argv[1:]) 2623c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker except common.ExternalError, e: 2633c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker print 2643c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker print " ERROR: %s" % (e,) 2653c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker print 2663c84f569487c4e59baa332be33b5430fdefb76b3Doug Zongker sys.exit(1) 267fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker finally: 268fc44a515d46e6f4d5eaa0d32659b1cf3b9492305Doug Zongker common.Cleanup() 269