Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4622)

Unified Diff: build/linux/sysroot_scripts/generate_precise_dpkg_admin_dir.py

Issue 2391573005: Linux: Add a script to generate a Precise dpkg admin dir for use with official builds on Trusty. (Closed)
Patch Set: Update generate_precise_dpkg_admin_dir.py Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | build/linux/sysroot_scripts/sysroot-creator.sh » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: build/linux/sysroot_scripts/generate_precise_dpkg_admin_dir.py
diff --git a/build/linux/sysroot_scripts/generate_precise_dpkg_admin_dir.py b/build/linux/sysroot_scripts/generate_precise_dpkg_admin_dir.py
new file mode 100755
index 0000000000000000000000000000000000000000..70723428f9af8e768a5fbe45a5144e0f7d98cbb3
--- /dev/null
+++ b/build/linux/sysroot_scripts/generate_precise_dpkg_admin_dir.py
@@ -0,0 +1,137 @@
+#!/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 subprocess
+import sys
+
+
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+
+
+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 = ''
+ else:
+ current_package_data += line
+ if current_package_name:
+ package_map[current_package_name] = current_package_data
+ return package_map
+
+
+def main():
+ if options.arch not in ['amd64', 'i386']:
+ 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]
+
+ sysroot_script = os.path.join(SCRIPT_DIR, 'sysroot-creator-precise.sh')
+ sysroot_arg = {'amd64': 'ListPackagesAmd64', 'i386': 'ListPackagesI386'} \
+ [options.arch]
+ packages_file = os.path.join(dest_dir, 'packagelist.' + options.arch)
+ subprocess.check_call([sysroot_script, sysroot_arg, packages_file])
+ packages = open(packages_file, 'r').read().splitlines()
+ os.remove(packages_file)
+
+ # Remove dev packages. This does not get rid of all packages that we don't
+ # need, but is conservative.
+ packages = [package for package in packages if not package.endswith('-dev')]
+
+ 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)
+
+ with open(dest_status_file, 'w') as dest_status_file_handle:
+ 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')
+
+ for package in packages:
+ for extension in ('shlibs', 'symbols'):
+ dest_filename = '%s:%s.%s' % (package, options.arch, extension)
+ 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())
« no previous file with comments | « no previous file | build/linux/sysroot_scripts/sysroot-creator.sh » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698