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