build: plumb structured sources into BuildTargets

pull/9339/head
Dylan Baker 3 years ago
parent cbc62e892a
commit 7d1431a060
  1. 2
      mesonbuild/ast/introspection.py
  2. 73
      mesonbuild/build.py
  3. 37
      mesonbuild/interpreter/interpreter.py
  4. 16
      mesonbuild/modules/gnome.py
  5. 11
      mesonbuild/modules/unstable_rust.py
  6. 1
      unittests/allplatformstests.py

@ -249,7 +249,7 @@ class IntrospectionInterpreter(AstInterpreter):
objects = [] # type: T.List[T.Any] objects = [] # type: T.List[T.Any]
empty_sources = [] # type: T.List[T.Any] empty_sources = [] # type: T.List[T.Any]
# Passing the unresolved sources list causes errors # Passing the unresolved sources list causes errors
target = targetclass(name, self.subdir, self.subproject, for_machine, empty_sources, objects, self.environment, kwargs_reduced) target = targetclass(name, self.subdir, self.subproject, for_machine, empty_sources, [], objects, self.environment, kwargs_reduced)
new_target = { new_target = {
'name': target.get_basename(), 'name': target.get_basename(),

@ -739,14 +739,16 @@ class BuildTarget(Target):
install_dir: T.List[T.Union[str, bool]] install_dir: T.List[T.Union[str, bool]]
def __init__(self, name: str, subdir: str, subproject: 'SubProject', for_machine: MachineChoice, def __init__(self, name: str, subdir: str, subproject: SubProject, for_machine: MachineChoice,
sources: T.List['SourceOutputs'], objects, environment: environment.Environment, kwargs): sources: T.List['SourceOutputs'], structured_sources: T.Optional[StructuredSources],
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.compilers = OrderedDict() # type: OrderedDict[str, Compiler] self.compilers = OrderedDict() # type: OrderedDict[str, Compiler]
self.objects: T.List[T.Union[str, 'File', 'ExtractedObjects']] = [] self.objects: T.List[T.Union[str, 'File', 'ExtractedObjects']] = []
self.structured_sources = structured_sources
self.external_deps: T.List[dependencies.Dependency] = [] self.external_deps: T.List[dependencies.Dependency] = []
self.include_dirs: T.List['IncludeDirs'] = [] self.include_dirs: T.List['IncludeDirs'] = []
self.link_language = kwargs.get('link_language') self.link_language = kwargs.get('link_language')
@ -778,13 +780,18 @@ class BuildTarget(Target):
self.process_kwargs(kwargs, environment) self.process_kwargs(kwargs, environment)
self.check_unknown_kwargs(kwargs) self.check_unknown_kwargs(kwargs)
self.process_compilers() self.process_compilers()
if not any([self.sources, self.generated, self.objects, self.link_whole]): if not any([self.sources, self.generated, self.objects, self.link_whole, self.structured_sources]):
raise InvalidArguments(f'Build target {name} has no sources.') raise InvalidArguments(f'Build target {name} has no sources.')
self.process_compilers_late() self.process_compilers_late()
self.validate_sources() self.validate_sources()
self.validate_install(environment) self.validate_install(environment)
self.check_module_linking() self.check_module_linking()
if self.structured_sources and any([self.sources, self.generated]):
raise MesonException('cannot mix structured sources and unstructured sources')
if self.structured_sources and 'rust' not in self.compilers:
raise MesonException('structured sources are only supported in Rust targets')
def __repr__(self): def __repr__(self):
repr_str = "<{0} {1}: {2}>" repr_str = "<{0} {1}: {2}>"
return repr_str.format(self.__class__.__name__, self.get_id(), self.filename) return repr_str.format(self.__class__.__name__, self.get_id(), self.filename)
@ -888,21 +895,31 @@ class BuildTarget(Target):
self.compilers[lang] = compilers[lang] self.compilers[lang] = compilers[lang]
break break
def process_compilers(self): def process_compilers(self) -> None:
''' '''
Populate self.compilers, which is the list of compilers that this Populate self.compilers, which is the list of compilers that this
target will use for compiling all its sources. target will use for compiling all its sources.
We also add compilers that were used by extracted objects to simplify We also add compilers that were used by extracted objects to simplify
dynamic linker determination. dynamic linker determination.
''' '''
if not self.sources and not self.generated and not self.objects: if not any([self.sources, self.generated, self.objects, self.structured_sources]):
return return
# Populate list of compilers # Populate list of compilers
compilers = self.environment.coredata.compilers[self.for_machine] compilers = self.environment.coredata.compilers[self.for_machine]
# Pre-existing sources # Pre-existing sources
sources = list(self.sources) sources: T.List['FileOrString'] = list(self.sources)
generated = self.generated.copy()
if self.structured_sources:
for v in self.structured_sources.sources.values():
for src in v:
if isinstance(src, (str, File)):
sources.append(src)
else:
generated.append(src)
# All generated sources # All generated sources
for gensrc in self.generated: for gensrc in generated:
for s in gensrc.get_outputs(): for s in gensrc.get_outputs():
# Generated objects can't be compiled, so don't use them for # Generated objects can't be compiled, so don't use them for
# compiler detection. If our target only has generated objects, # compiler detection. If our target only has generated objects,
@ -1626,6 +1643,16 @@ You probably should put it in link_with instead.''')
elif self.generated: elif self.generated:
if self.generated[0].get_outputs()[0].endswith('.rs'): if self.generated[0].get_outputs()[0].endswith('.rs'):
return True return True
elif self.structured_sources:
for v in self.structured_sources.sources.values():
for s in v:
if isinstance(s, (str, File)):
if s.endswith('.rs'):
return True
else:
for ss in s.get_outputs():
if ss.endswith('.rs'):
return True
return False return False
def get_using_msvc(self) -> bool: def get_using_msvc(self) -> bool:
@ -1827,12 +1854,13 @@ class Executable(BuildTarget):
known_kwargs = known_exe_kwargs known_kwargs = known_exe_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[File], structured_sources: T.Optional['StructuredSources'],
objects, environment: environment.Environment, kwargs):
self.typename = 'executable' self.typename = 'executable'
key = OptionKey('b_pie') key = OptionKey('b_pie')
if 'pie' not in kwargs and key in environment.coredata.options: if 'pie' not in kwargs and key in environment.coredata.options:
kwargs['pie'] = environment.coredata.options[key].value kwargs['pie'] = environment.coredata.options[key].value
super().__init__(name, subdir, subproject, for_machine, sources, objects, environment, kwargs) super().__init__(name, subdir, subproject, for_machine, sources, structured_sources, objects, environment, kwargs)
# Unless overridden, executables have no suffix or prefix. Except on # Unless overridden, executables have no suffix or prefix. Except on
# Windows and with C#/Mono executables where the suffix is 'exe' # Windows and with C#/Mono executables where the suffix is 'exe'
if not hasattr(self, 'prefix'): if not hasattr(self, 'prefix'):
@ -1952,9 +1980,11 @@ class Executable(BuildTarget):
class StaticLibrary(BuildTarget): class StaticLibrary(BuildTarget):
known_kwargs = known_stlib_kwargs known_kwargs = known_stlib_kwargs
def __init__(self, name, subdir, subproject, for_machine: MachineChoice, sources, objects, environment, kwargs): def __init__(self, name: str, subdir: str, subproject: str, for_machine: MachineChoice,
sources: T.List[File], structured_sources: T.Optional['StructuredSources'],
objects, environment: environment.Environment, kwargs):
self.typename = 'static library' self.typename = 'static library'
super().__init__(name, subdir, subproject, for_machine, sources, objects, environment, kwargs) super().__init__(name, subdir, subproject, for_machine, sources, structured_sources, objects, environment, kwargs)
if 'cs' in self.compilers: if 'cs' in self.compilers:
raise InvalidArguments('Static libraries not supported for C#.') raise InvalidArguments('Static libraries not supported for C#.')
if 'rust' in self.compilers: if 'rust' in self.compilers:
@ -2013,7 +2043,9 @@ class StaticLibrary(BuildTarget):
class SharedLibrary(BuildTarget): class SharedLibrary(BuildTarget):
known_kwargs = known_shlib_kwargs known_kwargs = known_shlib_kwargs
def __init__(self, name, subdir, subproject, for_machine: MachineChoice, sources, objects, environment, kwargs): def __init__(self, name: str, subdir: str, subproject: str, for_machine: MachineChoice,
sources: T.List[File], structured_sources: T.Optional['StructuredSources'],
objects, environment: environment.Environment, kwargs):
self.typename = 'shared library' self.typename = 'shared library'
self.soversion = None self.soversion = None
self.ltversion = None self.ltversion = None
@ -2030,7 +2062,7 @@ class SharedLibrary(BuildTarget):
self.debug_filename = None self.debug_filename = None
# Use by the pkgconfig module # Use by the pkgconfig module
self.shared_library_only = False self.shared_library_only = False
super().__init__(name, subdir, subproject, for_machine, sources, objects, environment, kwargs) super().__init__(name, subdir, subproject, for_machine, sources, structured_sources, objects, environment, kwargs)
if 'rust' in self.compilers: if 'rust' in self.compilers:
# If no crate type is specified, or it's the generic lib type, use dylib # If no crate type is specified, or it's the generic lib type, use dylib
if not hasattr(self, 'rust_crate_type') or self.rust_crate_type == 'lib': if not hasattr(self, 'rust_crate_type') or self.rust_crate_type == 'lib':
@ -2338,12 +2370,15 @@ class SharedLibrary(BuildTarget):
class SharedModule(SharedLibrary): class SharedModule(SharedLibrary):
known_kwargs = known_shmod_kwargs known_kwargs = known_shmod_kwargs
def __init__(self, name, subdir, subproject, for_machine: MachineChoice, sources, objects, environment, kwargs): def __init__(self, name: str, subdir: str, subproject: str, for_machine: MachineChoice,
sources: T.List[File], structured_sources: T.Optional['StructuredSources'],
objects, environment: environment.Environment, kwargs):
if 'version' in kwargs: if 'version' in kwargs:
raise MesonException('Shared modules must not specify the version kwarg.') raise MesonException('Shared modules must not specify the version kwarg.')
if 'soversion' in kwargs: if 'soversion' in kwargs:
raise MesonException('Shared modules must not specify the soversion kwarg.') raise MesonException('Shared modules must not specify the soversion kwarg.')
super().__init__(name, subdir, subproject, for_machine, sources, objects, environment, kwargs) super().__init__(name, subdir, subproject, for_machine, sources,
structured_sources, objects, environment, kwargs)
self.typename = 'shared module' self.typename = 'shared module'
# We need to set the soname in cases where build files link the module # We need to set the soname in cases where build files link the module
# to build targets, see: https://github.com/mesonbuild/meson/issues/9492 # to build targets, see: https://github.com/mesonbuild/meson/issues/9492
@ -2663,15 +2698,19 @@ class AliasTarget(RunTarget):
class Jar(BuildTarget): class Jar(BuildTarget):
known_kwargs = known_jar_kwargs known_kwargs = known_jar_kwargs
def __init__(self, name, subdir, subproject, for_machine: MachineChoice, sources, objects, environment, kwargs): def __init__(self, name: str, subdir: str, subproject: str, for_machine: MachineChoice,
sources: T.List[File], structured_sources: T.Optional['StructuredSources'],
objects, environment: environment.Environment, kwargs):
self.typename = 'jar' self.typename = 'jar'
super().__init__(name, subdir, subproject, for_machine, sources, objects, environment, kwargs) super().__init__(name, subdir, subproject, for_machine, sources, structured_sources, objects, environment, kwargs)
for s in self.sources: for s in self.sources:
if not s.endswith('.java'): if not s.endswith('.java'):
raise InvalidArguments(f'Jar source {s} is not a java file.') raise InvalidArguments(f'Jar source {s} is not a java file.')
for t in self.link_targets: for t in self.link_targets:
if not isinstance(t, Jar): if not isinstance(t, Jar):
raise InvalidArguments(f'Link target {t} is not a jar target.') raise InvalidArguments(f'Link target {t} is not a jar target.')
if self.structured_sources:
raise InvalidArguments(f'structured sources are not supported in Java targets.')
self.filename = self.name + '.jar' self.filename = self.name + '.jar'
self.outputs = [self.filename] self.outputs = [self.filename]
self.java_args = kwargs.get('java_args', []) self.java_args = kwargs.get('java_args', [])

@ -105,7 +105,7 @@ if T.TYPE_CHECKING:
# Input source types passed to the build.Target classes # Input source types passed to the build.Target classes
SourceOutputs = T.Union[mesonlib.File, build.GeneratedList, SourceOutputs = T.Union[mesonlib.File, build.GeneratedList,
build.BuildTarget, build.CustomTargetIndex, build.CustomTarget, build.BuildTarget, build.CustomTargetIndex, build.CustomTarget,
build.ExtractedObjects, build.GeneratedList] build.ExtractedObjects, build.GeneratedList, build.StructuredSources]
def _project_version_validator(value: T.Union[T.List, str, mesonlib.File, None]) -> T.Optional[str]: def _project_version_validator(value: T.Union[T.List, str, mesonlib.File, None]) -> T.Optional[str]:
@ -2863,7 +2863,7 @@ Try setting b_lundef to false instead.'''.format(self.coredata.options[OptionKey
else: else:
raise InterpreterException(f'Unknown default_library value: {default_library}.') raise InterpreterException(f'Unknown default_library value: {default_library}.')
def build_target(self, node, args, kwargs, targetclass): def build_target(self, node: mparser.BaseNode, args, kwargs, targetclass):
@FeatureNewKwargs('build target', '0.42.0', ['rust_crate_type', 'build_rpath', 'implicit_include_directories']) @FeatureNewKwargs('build target', '0.42.0', ['rust_crate_type', 'build_rpath', 'implicit_include_directories'])
@FeatureNewKwargs('build target', '0.41.0', ['rust_args']) @FeatureNewKwargs('build target', '0.41.0', ['rust_args'])
@FeatureNewKwargs('build target', '0.40.0', ['build_by_default']) @FeatureNewKwargs('build target', '0.40.0', ['build_by_default'])
@ -2896,8 +2896,39 @@ Try setting b_lundef to false instead.'''.format(self.coredata.options[OptionKey
# passed to library() when default_library == 'static'. # passed to library() when default_library == 'static'.
kwargs = {k: v for k, v in kwargs.items() if k in targetclass.known_kwargs} kwargs = {k: v for k, v in kwargs.items() if k in targetclass.known_kwargs}
srcs: T.List['SourceInputs'] = []
struct: T.Optional[build.StructuredSources] = build.StructuredSources()
for s in sources:
if isinstance(s, build.StructuredSources):
struct = struct + s
else:
srcs.append(s)
if not struct:
struct = None
else:
# Validate that we won't end up with two outputs with the same name.
# i.e, don't allow:
# [structured_sources('foo/bar.rs'), structured_sources('bar/bar.rs')]
for v in struct.sources.values():
outputs: T.Set[str] = set()
for f in v:
o: T.List[str]
if isinstance(f, str):
o = [os.path.basename(f)]
elif isinstance(f, mesonlib.File):
o = [f.fname]
else:
o = f.get_outputs()
conflicts = outputs.intersection(o)
if conflicts:
raise InvalidArguments.from_node(
f"Conflicting sources in structured sources: {', '.join(sorted(conflicts))}",
node=node)
outputs.update(o)
kwargs['include_directories'] = self.extract_incdirs(kwargs) kwargs['include_directories'] = self.extract_incdirs(kwargs)
target = targetclass(name, self.subdir, self.subproject, for_machine, sources, objs, self.environment, kwargs) target = targetclass(name, self.subdir, self.subproject, for_machine, srcs, struct, objs, self.environment, kwargs)
target.project_version = self.project_version target.project_version = self.project_version
self.add_stdlib_info(target) self.add_stdlib_info(target)

@ -607,10 +607,10 @@ class GnomeModule(ExtensionModule):
def _get_link_args(self, state: 'ModuleState', def _get_link_args(self, state: 'ModuleState',
lib: T.Union[build.SharedLibrary, build.StaticLibrary], lib: T.Union[build.SharedLibrary, build.StaticLibrary],
depends: T.Sequence[T.Union[build.BuildTarget, 'build.GeneratedTypes', 'FileOrString']], depends: T.Sequence[T.Union[build.BuildTarget, 'build.GeneratedTypes', 'FileOrString', build.StructuredSources]],
include_rpath: bool = False, include_rpath: bool = False,
use_gir_args: bool = False use_gir_args: bool = False
) -> T.Tuple[T.List[str], T.List[T.Union[build.BuildTarget, 'build.GeneratedTypes', 'FileOrString']]]: ) -> T.Tuple[T.List[str], T.List[T.Union[build.BuildTarget, 'build.GeneratedTypes', 'FileOrString', build.StructuredSources]]]:
link_command: T.List[str] = [] link_command: T.List[str] = []
new_depends = list(depends) new_depends = list(depends)
# Construct link args # Construct link args
@ -638,12 +638,12 @@ class GnomeModule(ExtensionModule):
def _get_dependencies_flags( def _get_dependencies_flags(
self, deps: T.Sequence[T.Union['Dependency', build.BuildTarget, build.CustomTarget, build.CustomTargetIndex]], self, deps: T.Sequence[T.Union['Dependency', build.BuildTarget, build.CustomTarget, build.CustomTargetIndex]],
state: 'ModuleState', state: 'ModuleState',
depends: T.Sequence[T.Union[build.BuildTarget, 'build.GeneratedTypes', 'FileOrString']], depends: T.Sequence[T.Union[build.BuildTarget, 'build.GeneratedTypes', 'FileOrString', build.StructuredSources]],
include_rpath: bool = False, include_rpath: bool = False,
use_gir_args: bool = False, use_gir_args: bool = False,
separate_nodedup: bool = False separate_nodedup: bool = False
) -> T.Tuple[OrderedSet[str], OrderedSet[str], OrderedSet[str], T.Optional[T.List[str]], OrderedSet[str], ) -> T.Tuple[OrderedSet[str], OrderedSet[str], OrderedSet[str], T.Optional[T.List[str]], OrderedSet[str],
T.List[T.Union[build.BuildTarget, 'build.GeneratedTypes', 'FileOrString']]]: T.List[T.Union[build.BuildTarget, 'build.GeneratedTypes', 'FileOrString', build.StructuredSources]]]:
cflags: OrderedSet[str] = OrderedSet() cflags: OrderedSet[str] = OrderedSet()
internal_ldflags: OrderedSet[str] = OrderedSet() internal_ldflags: OrderedSet[str] = OrderedSet()
external_ldflags: OrderedSet[str] = OrderedSet() external_ldflags: OrderedSet[str] = OrderedSet()
@ -931,7 +931,7 @@ class GnomeModule(ExtensionModule):
girfile: str, girfile: str,
scan_command: T.Sequence[T.Union['FileOrString', Executable, ExternalProgram, OverrideProgram]], scan_command: T.Sequence[T.Union['FileOrString', Executable, ExternalProgram, OverrideProgram]],
generated_files: T.Sequence[T.Union[str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList]], generated_files: T.Sequence[T.Union[str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList]],
depends: T.Sequence[T.Union['FileOrString', build.BuildTarget, 'build.GeneratedTypes']], depends: T.Sequence[T.Union['FileOrString', build.BuildTarget, 'build.GeneratedTypes', build.StructuredSources]],
kwargs: T.Dict[str, T.Any]) -> GirTarget: kwargs: T.Dict[str, T.Any]) -> GirTarget:
install = kwargs['install_gir'] install = kwargs['install_gir']
if install is None: if install is None:
@ -989,8 +989,8 @@ class GnomeModule(ExtensionModule):
def _gather_typelib_includes_and_update_depends( def _gather_typelib_includes_and_update_depends(
state: 'ModuleState', state: 'ModuleState',
deps: T.Sequence[T.Union[Dependency, build.BuildTarget, build.CustomTarget, build.CustomTargetIndex]], deps: T.Sequence[T.Union[Dependency, build.BuildTarget, build.CustomTarget, build.CustomTargetIndex]],
depends: T.Sequence[T.Union[build.BuildTarget, 'build.GeneratedTypes', 'FileOrString']] depends: T.Sequence[T.Union[build.BuildTarget, 'build.GeneratedTypes', 'FileOrString', build.StructuredSources]]
) -> T.Tuple[T.List[str], T.List[T.Union[build.BuildTarget, 'build.GeneratedTypes', 'FileOrString']]]: ) -> T.Tuple[T.List[str], T.List[T.Union[build.BuildTarget, 'build.GeneratedTypes', 'FileOrString', build.StructuredSources]]]:
# Need to recursively add deps on GirTarget sources from our # Need to recursively add deps on GirTarget sources from our
# dependencies and also find the include directories needed for the # dependencies and also find the include directories needed for the
# typelib generation custom target below. # typelib generation custom target below.
@ -1092,7 +1092,7 @@ class GnomeModule(ExtensionModule):
srcdir = os.path.join(state.environment.get_source_dir(), state.subdir) srcdir = os.path.join(state.environment.get_source_dir(), state.subdir)
builddir = os.path.join(state.environment.get_build_dir(), state.subdir) builddir = os.path.join(state.environment.get_build_dir(), state.subdir)
depends: T.List[T.Union['FileOrString', 'build.GeneratedTypes', build.BuildTarget]] = [] depends: T.List[T.Union['FileOrString', 'build.GeneratedTypes', build.BuildTarget, build.StructuredSources]] = []
depends.extend(gir_dep.sources) depends.extend(gir_dep.sources)
depends.extend(girtargets) depends.extend(girtargets)

@ -17,7 +17,7 @@ import typing as T
from . import ExtensionModule, ModuleReturnValue from . import ExtensionModule, ModuleReturnValue
from .. import mlog from .. import mlog
from ..build import BothLibraries, BuildTarget, CustomTargetIndex, Executable, ExtractedObjects, GeneratedList, IncludeDirs, CustomTarget from ..build import BothLibraries, BuildTarget, CustomTargetIndex, Executable, ExtractedObjects, GeneratedList, IncludeDirs, CustomTarget, StructuredSources
from ..dependencies import Dependency, ExternalLibrary from ..dependencies import Dependency, ExternalLibrary
from ..interpreter.interpreter import TEST_KWARGS from ..interpreter.interpreter import TEST_KWARGS
from ..interpreterbase import ContainerTypeInfo, InterpreterException, KwargInfo, FeatureNew, typed_kwargs, typed_pos_args, noPosargs from ..interpreterbase import ContainerTypeInfo, InterpreterException, KwargInfo, FeatureNew, typed_kwargs, typed_pos_args, noPosargs
@ -149,10 +149,9 @@ class RustModule(ExtensionModule):
new_target_kwargs['dependencies'] = new_target_kwargs.get('dependencies', []) + dependencies new_target_kwargs['dependencies'] = new_target_kwargs.get('dependencies', []) + dependencies
new_target = Executable( new_target = Executable(
name, base_target.subdir, state.subproject, name, base_target.subdir, state.subproject, base_target.for_machine,
base_target.for_machine, base_target.sources, base_target.sources, base_target.structured_sources,
base_target.objects, base_target.environment, base_target.objects, base_target.environment, new_target_kwargs
new_target_kwargs
) )
test = self.interpreter.make_test( test = self.interpreter.make_test(
@ -203,7 +202,7 @@ class RustModule(ExtensionModule):
name: str name: str
if isinstance(header, File): if isinstance(header, File):
name = header.fname name = header.fname
elif isinstance(header, (BuildTarget, BothLibraries, ExtractedObjects)): elif isinstance(header, (BuildTarget, BothLibraries, ExtractedObjects, StructuredSources)):
raise InterpreterException('bindgen source file must be a C header, not an object or build target') raise InterpreterException('bindgen source file must be a C header, not an object or build target')
else: else:
name = header.get_outputs()[0] name = header.get_outputs()[0]

@ -3988,6 +3988,7 @@ class AllPlatformTests(BasePlatformTests):
def output_name(name, type_): def output_name(name, type_):
return type_(name=name, subdir=None, subproject=None, return type_(name=name, subdir=None, subproject=None,
for_machine=MachineChoice.HOST, sources=[], for_machine=MachineChoice.HOST, sources=[],
structured_sources=None,
objects=[], environment=env, kwargs={}).filename objects=[], environment=env, kwargs={}).filename
shared_lib_name = lambda name: output_name(name, SharedLibrary) shared_lib_name = lambda name: output_name(name, SharedLibrary)

Loading…
Cancel
Save