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