Chromium Code Reviews| Index: chrome/installer/linux/sysroot_scripts/generate_precise_dpkg_admin_dir.py |
| diff --git a/chrome/installer/linux/sysroot_scripts/generate_precise_dpkg_admin_dir.py b/chrome/installer/linux/sysroot_scripts/generate_precise_dpkg_admin_dir.py |
| new file mode 100755 |
| index 0000000000000000000000000000000000000000..af57926ff1a5c31c0f23cbd608acc00d99e8eb8c |
| --- /dev/null |
| +++ b/chrome/installer/linux/sysroot_scripts/generate_precise_dpkg_admin_dir.py |
| @@ -0,0 +1,165 @@ |
| +#!/usr/bin/env python |
| +# Copyright 2014 The Chromium Authors. All rights reserved. |
| +# Use of this source code is governed by a BSD-style license that can be |
| +# found in the LICENSE file. |
| + |
| +# Takes in a Ubuntu Precise dpkg admin directory (typically /var/lib/dpkg) and |
| +# outputs a dpkg admin directory appropriate for use with dpkg-shlibdeps on |
| +# Ubuntu Trusty. |
| +# |
| +# Example usage: |
| +# generate_precise_dpkg_admin_dir.py --arch i386 \ |
| +# /path/to/precise_32-bit_chroot/var/lib/dpkg /path/to/dest_dir |
| + |
| +import optparse |
| +import os |
| +import shutil |
| +import string |
| +import sys |
| + |
| + |
| +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) |
| +PACKAGES = [ |
|
Paweł Hajdan Jr.
2014/12/08 10:12:15
Can we de-duplicate the list of packages between t
|
| + "libasound2", |
| + "libc6", |
| + "libcairo2", |
| + "libcups2", |
| + "libdbus-1-3", |
| + "libexpat1", |
| + "libfontconfig1", |
| + "libfreetype6", |
| + "libgconf-2-4", |
| + "libgdk-pixbuf2.0-0", |
| + "libglib2.0-0", |
| + "libgtk2.0-0", |
| + "libnspr4", |
| + "libnss3", |
| + "libpango-1.0-0", |
| + "libpangocairo-1.0-0", |
| + "libstdc++6", |
| + "libx11-6", |
| + "libxcomposite1", |
| + "libxcursor1", |
| + "libxdamage1", |
| + "libxext6", |
| + "libxfixes3", |
| + "libxi6", |
| + "libxrandr2", |
| + "libxrender1", |
| + "libxss1", |
| + "libxtst6", |
| +] |
| + |
| + |
| +def ParseStatusFile(status_file): |
| + package_map = {} |
| + lines = open(status_file).readlines() |
| + current_package_name = '' |
| + current_package_data = '' |
| + for line in lines: |
| + if (not line or |
| + line[0] not in string.ascii_uppercase or |
| + line.startswith('Homepage: ') or |
| + line.startswith('Original-Maintainer: ')): |
| + continue |
| + if line.startswith('Package: '): |
| + if current_package_name: |
| + package_map[current_package_name] = current_package_data |
| + current_package_name = line[len('Package: '):].strip() |
| + current_package_data = '' |
| + # Hack for libpango1.0-0 vs libpango-1.0-0 |
|
Paweł Hajdan Jr.
2014/12/08 10:12:15
Could you explain more why we need this hack? If p
|
| + if current_package_name == 'libpango1.0-0': |
| + current_package_name = 'libpango-1.0-0' |
| + else: |
| + current_package_data += line |
| + |
| + # Hack for libpangocairo-1.0-0 |
|
Paweł Hajdan Jr.
2014/12/08 10:12:15
Same here, I'm really surprised we'd need this.
C
|
| + if 'libpango-1.0-0' in package_map: |
| + assert('libpangocairo-1.0-0' not in package_map) |
| + package_map['libpangocairo-1.0-0'] = package_map['libpango-1.0-0'] |
| + return package_map |
| + |
| + |
| +def main(): |
| + if options.arch not in ['amd64', 'i386']: |
|
Paweł Hajdan Jr.
2014/12/08 10:12:15
At least argparse has built-in ways to validate th
|
| + print 'Unknown architecture: %s' % options.arch |
| + return 1 |
| + |
| + if len(args) != 2: |
| + print 'Wrong number of arguments.' |
| + return 1 |
| + |
| + src_dir = args[0] |
| + dest_dir = args[1] |
| + |
| + src_status_file = os.path.join(src_dir, 'status') |
| + src_info_dir = os.path.join(src_dir, 'info') |
| + src_info_format_file = os.path.join(src_info_dir, 'format') |
| + src_triggers_dir = os.path.join(src_dir, 'triggers') |
| + src_updates_dir = os.path.join(src_dir, 'updates') |
| + if not os.path.isfile(src_status_file): |
| + print 'status file not found. (%s)' % src_status_file |
| + return 1 |
| + if not os.path.isdir(src_info_dir): |
| + print 'info dir not found. (%s)' % src_info_dir |
| + return 1 |
| + if not os.path.isfile(src_info_format_file): |
| + print 'info format file not found. (%s)' % src_info_format_file |
| + return 1 |
| + if not os.path.isdir(src_triggers_dir): |
| + print 'triggers dir not found. (%s)' % src_triggers_dir |
| + return 1 |
| + if not os.path.isdir(src_updates_dir): |
| + print 'updates dir not found. (%s)' % src_updates_dir |
| + return 1 |
| + |
| + package_map = ParseStatusFile(src_status_file) |
| + missing_packages = [] |
| + for package in PACKAGES: |
| + if package not in package_map: |
| + missing_packages.append(package) |
| + if missing_packages: |
| + print 'Missing packages: %s' % ','.join(missing_packages) |
| + return 1 |
| + |
| + dest_status_file = os.path.join(dest_dir, 'status') |
| + dest_info_dir = os.path.join(dest_dir, 'info') |
| + dest_info_format_file = os.path.join(dest_info_dir, 'format') |
| + dest_triggers_dir = os.path.join(dest_dir, 'triggers') |
| + dest_updates_dir = os.path.join(dest_dir, 'updates') |
| + |
| + os.makedirs(dest_info_dir) |
| + shutil.copy(src_info_format_file, dest_info_format_file) |
| + shutil.copytree(src_triggers_dir, dest_triggers_dir, |
| + ignore=shutil.ignore_patterns('Lock')) |
| + shutil.copytree(src_updates_dir, dest_updates_dir) |
| + |
| + dest_status_file_handle = open(dest_status_file, 'w') |
| + for package in PACKAGES: |
| + dest_status_file_handle.write('Package: %s\n' % package) |
| + dest_status_file_handle.write(package_map[package]) |
| + dest_status_file_handle.write('\n') |
| + dest_status_file_handle.close() |
|
Paweł Hajdan Jr.
2014/12/08 10:12:15
nit: Why not just "with open(...) as ..."?
|
| + |
| + for package in PACKAGES: |
| + for extension in ('shlibs', 'symbols'): |
| + dest_filename = '%s:%s.%s' % (package, options.arch, extension) |
| + # Hack for libpango |
| + if (package == 'libpango-1.0-0' or package == 'libpangocairo-1.0-0'): |
| + src_filename = 'libpango1.0-0:%s.%s' % (options.arch, extension) |
| + else: |
| + src_filename = dest_filename |
| + src_file = os.path.join(src_info_dir, src_filename) |
| + dest_file = os.path.join(dest_info_dir, dest_filename) |
| + if not os.path.isfile(src_file): |
| + continue |
| + shutil.copy(src_file, dest_file) |
| + |
| + return 0 |
| + |
| + |
| +if __name__ == '__main__': |
| + parser = optparse.OptionParser('usage: %prog --arch ARCH SRC DEST') |
| + parser.add_option('--arch', help='Sysroot architecture: i386 or amd64') |
| + options, args = parser.parse_args() |
| + sys.exit(main()) |