#!/usr/bin/env python # # Copyright 2016 Google Inc. # # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Create the asset.""" import argparse import fileinput import os import shutil import subprocess import sys from distutils import dir_util def create_asset(target_dir): """Create the asset.""" print "Installing some cross-compiling packages. Hit enter to continue." raw_input() subprocess.check_call([ "sudo","apt-get","install", "libstdc++-4.8-dev-armhf-cross", "libgcc-4.8-dev-armhf-cross", "binutils-arm-linux-gnueabihf" ]) shutil.copytree('/usr/arm-linux-gnueabihf', target_dir) shutil.copytree('/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8.4', os.path.join(target_dir, 'gcc-cross')) # copy_tree allows copying into a dir that exists # We need to augment the toolchain with some lib*.so that help ld # do its magic as well as some includes that may be useful. dir_util.copy_tree('/usr/x86_64-linux-gnu/arm-linux-gnueabihf/lib', os.path.join(target_dir, 'lib')) dir_util.copy_tree('/usr/x86_64-linux-gnu/arm-linux-gnueabihf/include', os.path.join(target_dir, 'include')) # The file paths in libpthread.so and libc.so start off as absolute file # paths (e.g. /usr/arm-linux-gnueabihf/lib/libpthread.so.0), which won't # work on the bots. We use fileinput to replace just those lines (which # start with GROUP). fileinput redirects stdout, so printing here actually # writes to the file. bad_libpthread = os.path.join(target_dir, "lib", "libpthread.so") for line in fileinput.input(bad_libpthread, inplace=True): if line.startswith("GROUP"): print "GROUP ( libpthread.so.0 libpthread_nonshared.a )" else: print line bad_libc = os.path.join(target_dir, "lib", "libc.so") for line in fileinput.input(bad_libc, inplace=True): if line.startswith("GROUP"): print ("GROUP ( libc.so.6 libc_nonshared.a " "AS_NEEDED ( ld-linux-armhf.so.3 ) )") else: print line def main(): if 'linux' not in sys.platform: print >> sys.stderr, 'This script only runs on Linux.' sys.exit(1) parser = argparse.ArgumentParser() parser.add_argument('--target_dir', '-t', required=True) args = parser.parse_args() create_asset(args.target_dir) if __name__ == '__main__': main()