#!/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()
