|
- #!/usr/bin/env python3
-
- import argparse
- from contextlib import contextmanager
- import os
- from pathlib import Path
- from typing import Sequence
- import subprocess
- import sys
- import shutil
- import tempfile
-
- from dds_ci import paths
- from self_build import self_build
- from self_deps_get import self_deps_get
- from self_deps_build import self_deps_build
-
- ROOT = Path(__file__).parent.parent.absolute()
- BUILD_DIR = ROOT / '_build'
-
-
- @contextmanager
- def _generate_toolchain(cxx: str):
- with tempfile.NamedTemporaryFile(
- suffix='-dds-toolchain.dds', mode='wb', delete=False) as f:
- comp_id = 'GNU'
- flags = ''
- link_flags = ''
- if cxx in ('cl', 'cl.exe'):
- comp_id = 'MSVC'
- flags += '/experimental:preprocessor '
- link_flags += 'rpcrt4.lib '
- else:
- flags += '-fconcepts'
- flags += ' -DSPDLOG_COMPILED_LIB'
- content = f'''
- Compiler-ID: {comp_id}
- C++-Compiler: {cxx}
- C++-Version: C++17
- Debug: True
- Flags: {flags}
- Link-Flags: {link_flags}
- '''
- print('Using generated toolchain file: ' + content)
- f.write(content.encode('utf-8'))
- f.close()
- yield Path(f.name)
- os.unlink(f.name)
-
-
- def main(argv: Sequence[str]) -> int:
- parser = argparse.ArgumentParser()
- parser.add_argument(
- '--cxx', help='Path/name of the C++ compiler to use.', required=True)
- args = parser.parse_args(argv)
-
- dds_bootstrap_env_key = 'DDS_BOOTSTRAP_PREV_EXE'
- if dds_bootstrap_env_key not in os.environ:
- raise RuntimeError('A previous-phase bootstrapped executable '
- 'must be available via $DDS_BOOTSTRAP_PREV_EXE')
-
- dds_exe = Path(os.environ[dds_bootstrap_env_key])
-
- if BUILD_DIR.exists():
- shutil.rmtree(BUILD_DIR)
-
- print(f'Using previously built DDS executable: {dds_exe}')
- self_deps_get(dds_exe, paths.SELF_TEST_REPO_DIR)
-
- with _generate_toolchain(args.cxx) as tc_fpath:
- self_deps_build(dds_exe, tc_fpath, paths.SELF_TEST_REPO_DIR,
- ROOT / 'remote.dds')
- self_build(dds_exe, toolchain=tc_fpath, dds_flags=['--apps'])
-
- return 0
-
-
- if __name__ == "__main__":
- sys.exit(main(sys.argv[1:]))
|