#!/usr/bin/env python # # Copyright 2018 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 common import os import shutil import subprocess import utils # This is basically all the deps of g++-multilib-mips64el-linux-gnuabi64 that # are not already installed on the bots. # # We could try to also include packages that *are* already installed on the bots # as well, but that would be quite a bit, and would probably entail more hacky # fixes like below. # # There is probably a way to generate this list from apt, but it's not as # straightforward as it should be. PKGS = [ 'binutils-mips64el-linux-gnuabi64', 'cpp-7-mips64el-linux-gnuabi64', 'g++-7-mips64el-linux-gnuabi64', 'gcc-7-cross-base', 'gcc-7-mips64el-linux-gnuabi64', 'gcc-7-mips64el-linux-gnuabi64-base', 'libatomic1-mips64el-cross', 'libc6-dev-mips64el-cross', 'libc6-mips64el-cross', 'libgcc-7-dev-mips64el-cross', 'libgcc1-mips64el-cross', 'libgomp1-mips64el-cross', 'libmpfr6', # This is new in buster, so build machines don't have it yet. 'libstdc++-7-dev-mips64el-cross', 'libstdc++6-mips64el-cross', 'linux-libc-dev-mips64el-cross', ] def create_asset(target_dir): """Create the asset.""" # This is all a bit hacky. Rather than installing to a chroot, we just extract # all the packages to the target dir, then fix things up so that it can be # used in our recipes. with utils.tmp_dir(): # Download required Debian packages. subprocess.check_call(['apt-get', 'download'] + PKGS) for f in os.listdir('.'): subprocess.check_call(['dpkg-deb', '--extract', f, target_dir]) parent_dir = os.path.join(target_dir, 'usr') # Remove unnecessary files that cause problems with zipping (due to dangling # symlinks). os.remove(os.path.join(parent_dir, 'lib/gcc-cross/mips64el-linux-gnuabi64/7/libcc1.so')) shutil.rmtree(os.path.join(parent_dir, 'share')) # Remove usr/ prefix. for d in os.listdir(parent_dir): os.rename(os.path.join(parent_dir, d), os.path.join(target_dir, d)) os.rmdir(parent_dir) # Remove absolute paths in GNU ld scripts. lib_dir = os.path.join(target_dir, 'mips64el-linux-gnuabi64/lib') ld_script_token = 'OUTPUT_FORMAT(elf64-tradlittlemips)' ld_script_files = subprocess.check_output( ['grep', '--recursive', '--files-with-matches', '--binary-files=without-match', '--fixed-strings', ld_script_token, lib_dir]).split() abs_path = '/usr/mips64el-linux-gnuabi64/lib/' for f in ld_script_files: with open(f) as script: contents = script.read() contents = contents.replace(abs_path, '') with open(f, 'w') as script: script.write(contents) def main(): parser = argparse.ArgumentParser() parser.add_argument('--target_dir', '-t', required=True) args = parser.parse_args() create_asset(args.target_dir) if __name__ == '__main__': main()