#!/usr/bin/env python3 import os import common from shell_helpers import LF class Main(common.BuildCliFunction): def __init__(self): super().__init__( description='''\ Build crosstool-NG with Newlib for bare metal compilation ''', supported_archs=common.consts['crosstool_ng_supported_archs'] ) def build(self): build_dir = self.get_build_dir() defconfig_dest = os.path.join(self.env['crosstool_ng_util_dir'], 'defconfig') os.makedirs(self.env['crosstool_ng_util_dir'], exist_ok=True) 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 os.chdir(self.env['crosstool_ng_source_dir']) self.sh.run_cmd( [os.path.join(self.env['crosstool_ng_source_dir'], 'bootstrap'), LF], ) os.chdir(self.env['crosstool_ng_util_dir']) self.sh.run_cmd( [ os.path.join(self.env['crosstool_ng_source_dir'], 'configure'), LF, '--enable-local', LF, ], ) self.sh.run_cmd(['make', '-j', str(self.env['nproc']), LF]) # 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, ], ) 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, ], 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()