#!/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.""" from __future__ import print_function import argparse import fileinput import os import shutil import subprocess import sys def create_asset(target_dir): """Create the asset.""" print("Installing some cross-compiling packages. You may be asked for your sudo password") subprocess.check_call([ "sudo","apt-get","install", "libstdc++-10-dev-armhf-cross", "libgcc-10-dev-armhf-cross", "binutils-arm-linux-gnueabihf" ]) # shutil complains if the target directory exists already. shutil.rmtree(target_dir) shutil.copytree('/usr/arm-linux-gnueabihf', target_dir) shutil.copytree('/usr/lib/gcc-cross/arm-linux-gnueabihf/10', os.path.join(target_dir, 'gcc-cross')) # Libs needed to link. These were found by trial-and-error. shutil.copy('/usr/lib/x86_64-linux-gnu/libbfd-2.37-armhf.so', os.path.join(target_dir, 'lib')) shutil.copy('/usr/lib/x86_64-linux-gnu/libopcodes-2.37-armhf.so', os.path.join(target_dir, 'lib')) shutil.copy('/usr/lib/x86_64-linux-gnu/libctf-armhf.so.0', os.path.join(target_dir, 'lib')) # The file paths in 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_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('This script only runs on Linux.', file=sys.stderr) 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()