interpreter: Pass unholdered sources into BuildTarget

The build level shouldn't be deal with interpreter objects, by the time
they leave the intpreter they should be in the Meson middle layer
representaiton
pull/8782/head
Dylan Baker 4 years ago committed by Jussi Pakkanen
parent f2ae92368a
commit 7bd7d1cd73
  1. 6
      mesonbuild/build.py
  2. 20
      mesonbuild/interpreter/interpreter.py

@ -40,7 +40,7 @@ from .linkers import StaticLinker
from .interpreterbase import FeatureNew from .interpreterbase import FeatureNew
if T.TYPE_CHECKING: if T.TYPE_CHECKING:
from .interpreter import Test from .interpreter.interpreter import Test, SourceOutputs
from .mesonlib import FileMode, FileOrString from .mesonlib import FileMode, FileOrString
from .mesonlib.backend import Backend from .mesonlib.backend import Backend
@ -589,12 +589,11 @@ class BuildTarget(Target):
known_kwargs = known_build_target_kwargs known_kwargs = known_build_target_kwargs
def __init__(self, name: str, subdir: str, subproject: str, for_machine: MachineChoice, def __init__(self, name: str, subdir: str, subproject: str, for_machine: MachineChoice,
sources: T.List[File], objects, environment: environment.Environment, kwargs): sources: T.List['SourceOutputs'], objects, environment: environment.Environment, kwargs):
super().__init__(name, subdir, subproject, True, for_machine) super().__init__(name, subdir, subproject, True, for_machine)
unity_opt = environment.coredata.get_option(OptionKey('unity')) unity_opt = environment.coredata.get_option(OptionKey('unity'))
self.is_unity = unity_opt == 'on' or (unity_opt == 'subprojects' and subproject != '') self.is_unity = unity_opt == 'on' or (unity_opt == 'subprojects' and subproject != '')
self.environment = environment self.environment = environment
self.sources: T.List[File] = []
self.compilers = OrderedDict() # type: OrderedDict[str, Compiler] self.compilers = OrderedDict() # type: OrderedDict[str, Compiler]
self.objects = [] self.objects = []
self.external_deps = [] self.external_deps = []
@ -613,6 +612,7 @@ class BuildTarget(Target):
self.need_install = False self.need_install = False
self.pch = {} self.pch = {}
self.extra_args: T.Dict[str, T.List['FileOrString']] = {} self.extra_args: T.Dict[str, T.List['FileOrString']] = {}
self.sources: T.List[File] = []
self.generated: T.Sequence[T.Union[GeneratedList, CustomTarget, CustomTargetIndex]] = [] self.generated: T.Sequence[T.Union[GeneratedList, CustomTarget, CustomTargetIndex]] = []
self.d_features = {} self.d_features = {}
self.pic = False self.pic = False

@ -68,8 +68,9 @@ if T.TYPE_CHECKING:
SourceInputs = T.Union[mesonlib.File, GeneratedListHolder, TargetHolder, SourceInputs = T.Union[mesonlib.File, GeneratedListHolder, TargetHolder,
CustomTargetIndexHolder, GeneratedObjectsHolder, str] CustomTargetIndexHolder, GeneratedObjectsHolder, str]
# Input source types passed to the build.Target5 classes # Input source types passed to the build.Target5 classes
SourceOutputs = T.Union[mesonlib.File, GeneratedListHolder, TargetHolder, SourceOutputs = T.Union[mesonlib.File, build.GeneratedList,
CustomTargetIndexHolder, GeneratedObjectsHolder] build.BuildTarget, build.CustomTargetIndex,
build.GeneratedList]
def stringifyUserArguments(args, quote=False): def stringifyUserArguments(args, quote=False):
if isinstance(args, list): if isinstance(args, list):
@ -2705,13 +2706,16 @@ Try setting b_lundef to false instead.'''.format(self.coredata.options[OptionKey
for s in sources: for s in sources:
if isinstance(s, str): if isinstance(s, str):
self.validate_within_subproject(self.subdir, s) self.validate_within_subproject(self.subdir, s)
s = mesonlib.File.from_source_file(self.environment.source_dir, self.subdir, s) results.append(mesonlib.File.from_source_file(self.environment.source_dir, self.subdir, s))
elif not isinstance(s, (mesonlib.File, GeneratedListHolder, elif isinstance(s, mesonlib.File):
TargetHolder, CustomTargetIndexHolder,
GeneratedObjectsHolder)):
raise InterpreterException('Source item is {!r} instead of '
'string or File-type object'.format(s))
results.append(s) results.append(s)
elif isinstance(s, (GeneratedListHolder, TargetHolder,
CustomTargetIndexHolder,
GeneratedObjectsHolder)):
results.append(unholder(s))
else:
raise InterpreterException(f'Source item is {s!r} instead of '
'string or File-type object')
return results return results
def add_target(self, name, tobj): def add_target(self, name, tobj):

Loading…
Cancel
Save