#!/usr/bin/env python3

import os

import common
from shell_helpers import LF

class Main(common.BuildCliFunction):
    def __init__(self):
        super().__init__(
            defaults={
                'mode': 'baremetal',
            },
            description='''\
Build crosstool-NG with Newlib for bare metal compilation
''',
        )

    def build(self):
        build_dir = self.get_build_dir()
        defconfig_dest = os.path.join(self.env['crosstool_ng_source_copy_dir'], 'defconfig')
        os.makedirs(self.env['crosstool_ng_download_dir'], exist_ok=True)

        # Bootstrap out-ot-tree WONTFIX. I've tried.
        # https://github.com/crosstool-ng/crosstool-ng/issues/1021
        #
        # Then out-of-tree ./ctng usage also started to fail in 1.24.0.
        #
        # So instead of fighting upstream, I'll just take the Buildroot approach
        # to life and rsync the entire source tree into the build tree. Fun times.
        self.sh.copy_dir_if_update(
            self.env['crosstool_ng_source_dir'],
            self.env['crosstool_ng_source_copy_dir'],
        )
        self.sh.run_cmd(
            [os.path.join(self.env['crosstool_ng_source_copy_dir'], 'bootstrap'), LF],
            cwd=self.env['crosstool_ng_source_copy_dir'],
        )
        self.sh.run_cmd(
            [
                # abspath here makes Ubuntu 16.04 fail with:
                # configure: error: source directory already configured; run "make distclean" there first
                # after another build has been done. Don't ask me why.
                os.path.join(os.curdir, 'configure'), LF,
                '--enable-local', LF,
            ],
            cwd=self.env['crosstool_ng_source_copy_dir'],
        )
        self.sh.run_cmd(
            ['make', '-j', str(self.env['nproc']), LF],
            cwd=self.env['crosstool_ng_source_copy_dir'],
        )

        # Build the toolchain.
        self.sh.cp(
            os.path.join(self.env['root_dir'], 'crosstool_ng_config', self.env['arch']),
            defconfig_dest
        )
        self.sh.write_configs(
            self.env['crosstool_ng_defconfig'],
            [
                'CT_PREFIX_DIR="{}"'.format(self.env['crosstool_ng_install_dir']),
                'CT_WORK_DIR="{}"'.format(build_dir),
                'CT_LOCAL_TARBALLS_DIR="{}"'.format(self.env['crosstool_ng_download_dir']),
            ]
        )
        self.sh.run_cmd(
            [
                self.env['crosstool_ng_executable'], LF,
                'defconfig', LF,
            ],
            cwd=self.env['crosstool_ng_source_copy_dir'],
        )
        self.sh.rmrf(defconfig_dest)
        self.sh.run_cmd(
            [
                self.env['crosstool_ng_executable'], LF,
                'build', LF,
                'CT_JOBS={}'.format(str(self.env['nproc'])), LF,
            ],
            cwd=self.env['crosstool_ng_source_copy_dir'],
            out_file=os.path.join(build_dir, self.env['repo_short_id'] + '.log'),
            delete_env=['LD_LIBRARY_PATH'],
            extra_paths=[self.env['ccache_dir']],
        )

    def get_build_dir(self):
        return self.env['crosstool_ng_build_dir']

if __name__ == '__main__':
    Main().cli()
