diff options
Diffstat (limited to 'mesonbuild/compilers/d.py')
-rw-r--r-- | mesonbuild/compilers/d.py | 145 |
1 files changed, 62 insertions, 83 deletions
diff --git a/mesonbuild/compilers/d.py b/mesonbuild/compilers/d.py index 8b35f02..05f3b7d 100644 --- a/mesonbuild/compilers/d.py +++ b/mesonbuild/compilers/d.py @@ -39,6 +39,7 @@ from .mixins.gnu import GnuCompiler from .mixins.gnu import gnu_common_warning_args if T.TYPE_CHECKING: + from ..build import DFeatures from ..dependencies import Dependency from ..programs import ExternalProgram from ..envconfig import MachineInfo @@ -498,91 +499,69 @@ class DCompiler(Compiler): return [] return ['-fPIC'] - def get_feature_args(self, kwargs: T.Dict[str, T.Any], build_to_src: str) -> T.List[str]: - # TODO: using a TypeDict here would improve this + def get_feature_args(self, kwargs: DFeatures, build_to_src: str) -> T.List[str]: res: T.List[str] = [] - # get_feature_args can be called multiple times for the same target when there is generated source - # so we have to copy the kwargs (target.d_features) dict before popping from it - kwargs = kwargs.copy() - if 'unittest' in kwargs: - unittest = kwargs.pop('unittest') - unittest_arg = d_feature_args[self.id]['unittest'] - if not unittest_arg: - raise EnvironmentException('D compiler %s does not support the "unittest" feature.' % self.name_string()) - if unittest: - res.append(unittest_arg) - - if 'debug' in kwargs: - debug_level = -1 - debugs = kwargs.pop('debug') - if not isinstance(debugs, list): - debugs = [debugs] - - debug_arg = d_feature_args[self.id]['debug'] - if not debug_arg: - raise EnvironmentException('D compiler %s does not support conditional debug identifiers.' % self.name_string()) - - # Parse all debug identifiers and the largest debug level identifier - for d in debugs: - if isinstance(d, int): - if d > debug_level: - debug_level = d - elif isinstance(d, str) and d.isdigit(): - if int(d) > debug_level: - debug_level = int(d) - else: - res.append(f'{debug_arg}={d}') - - if debug_level >= 0: - res.append(f'{debug_arg}={debug_level}') - - if 'versions' in kwargs: - version_level = -1 - versions = kwargs.pop('versions') - if not isinstance(versions, list): - versions = [versions] - - version_arg = d_feature_args[self.id]['version'] - if not version_arg: - raise EnvironmentException('D compiler %s does not support conditional version identifiers.' % self.name_string()) - - # Parse all version identifiers and the largest version level identifier - for v in versions: - if isinstance(v, int): - if v > version_level: - version_level = v - elif isinstance(v, str) and v.isdigit(): - if int(v) > version_level: - version_level = int(v) + unittest_arg = d_feature_args[self.id]['unittest'] + if not unittest_arg: + raise EnvironmentException('D compiler %s does not support the "unittest" feature.' % self.name_string()) + if kwargs['unittest']: + res.append(unittest_arg) + + debug_level = -1 + debug_arg = d_feature_args[self.id]['debug'] + if not debug_arg: + raise EnvironmentException('D compiler %s does not support conditional debug identifiers.' % self.name_string()) + + # Parse all debug identifiers and the largest debug level identifier + for d in kwargs['debug']: + if isinstance(d, int): + if d > debug_level: + debug_level = d + elif isinstance(d, str) and d.isdigit(): + if int(d) > debug_level: + debug_level = int(d) + else: + res.append(f'{debug_arg}={d}') + + if debug_level >= 0: + res.append(f'{debug_arg}={debug_level}') + + version_level = -1 + version_arg = d_feature_args[self.id]['version'] + if not version_arg: + raise EnvironmentException('D compiler %s does not support conditional version identifiers.' % self.name_string()) + + # Parse all version identifiers and the largest version level identifier + for v in kwargs['versions']: + if isinstance(v, int): + if v > version_level: + version_level = v + elif isinstance(v, str) and v.isdigit(): + if int(v) > version_level: + version_level = int(v) + else: + res.append(f'{version_arg}={v}') + + if version_level >= 0: + res.append(f'{version_arg}={version_level}') + + import_dir_arg = d_feature_args[self.id]['import_dir'] + if not import_dir_arg: + raise EnvironmentException('D compiler %s does not support the "string import directories" feature.' % self.name_string()) + # TODO: ImportDirs.to_string_list(), but we need both the project source + # root and project build root for that. + for idir_obj in kwargs['import_dirs']: + basedir = idir_obj.get_curdir() + for idir in idir_obj.get_incdirs(): + bldtreedir = os.path.join(basedir, idir) + # Avoid superfluous '/.' at the end of paths when d is '.' + if idir not in ('', '.'): + expdir = bldtreedir else: - res.append(f'{version_arg}={v}') - - if version_level >= 0: - res.append(f'{version_arg}={version_level}') - - if 'import_dirs' in kwargs: - import_dirs = kwargs.pop('import_dirs') - if not isinstance(import_dirs, list): - import_dirs = [import_dirs] - - import_dir_arg = d_feature_args[self.id]['import_dir'] - if not import_dir_arg: - raise EnvironmentException('D compiler %s does not support the "string import directories" feature.' % self.name_string()) - for idir_obj in import_dirs: - basedir = idir_obj.get_curdir() - for idir in idir_obj.get_incdirs(): - bldtreedir = os.path.join(basedir, idir) - # Avoid superfluous '/.' at the end of paths when d is '.' - if idir not in ('', '.'): - expdir = bldtreedir - else: - expdir = basedir - srctreedir = os.path.join(build_to_src, expdir) - res.append(f'{import_dir_arg}{srctreedir}') - res.append(f'{import_dir_arg}{bldtreedir}') - - if kwargs: - raise EnvironmentException('Unknown D compiler feature(s) selected: %s' % ', '.join(kwargs.keys())) + expdir = basedir + srctreedir = os.path.join(build_to_src, expdir) + res.append(f'{import_dir_arg}{srctreedir}') + res.append(f'{import_dir_arg}{bldtreedir}') return res |