diff options
Diffstat (limited to 'mesonbuild')
-rw-r--r-- | mesonbuild/backend/backends.py | 1 | ||||
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 14 | ||||
-rw-r--r-- | mesonbuild/backend/vs2015backend.py | 1 | ||||
-rw-r--r-- | mesonbuild/backend/xcodebackend.py | 87 | ||||
-rw-r--r-- | mesonbuild/build.py | 14 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 11 | ||||
-rw-r--r-- | mesonbuild/mesonmain.py | 6 | ||||
-rw-r--r-- | mesonbuild/scripts/depfixer.py | 2 | ||||
-rw-r--r-- | mesonbuild/scripts/dist.py | 4 | ||||
-rw-r--r-- | mesonbuild/wrap/wrap.py | 4 |
10 files changed, 120 insertions, 24 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py index 75974a5..4cfdd9e 100644 --- a/mesonbuild/backend/backends.py +++ b/mesonbuild/backend/backends.py @@ -629,7 +629,6 @@ class Backend: return True return False - def get_custom_target_sources(self, target): ''' Custom target sources can be of various object types; strings, File, diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index e12678d..6bd9633 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -812,7 +812,7 @@ int dummy; def generate_tests(self, outfile): self.serialize_tests() test_exe = get_meson_script(self.environment, 'mesontest') - cmd = [sys.executable, test_exe, '--no-rebuild'] + cmd = [sys.executable, '-u', test_exe, '--no-rebuild'] if not self.environment.coredata.get_builtin_option('stdsplit'): cmd += ['--no-stdsplit'] if self.environment.coredata.get_builtin_option('errorlogs'): @@ -824,7 +824,7 @@ int dummy; elem.write(outfile) # And then benchmarks. - cmd = [sys.executable, test_exe, '--benchmark', '--logbase', + cmd = [sys.executable, '-u', test_exe, '--benchmark', '--logbase', 'benchmarklog', '--num-processes=1', '--no-rebuild'] elem = NinjaBuildElement(self.all_outputs, 'benchmark', 'CUSTOM_COMMAND', ['all', 'PHONY']) elem.add_item('COMMAND', cmd) @@ -1722,8 +1722,8 @@ rule FORTRAN_DEP_HACK for line in f: modmatch = modre.match(line) if modmatch is not None: - modname = modmatch.group(1) - if modname.lower() == 'procedure': + modname = modmatch.group(1).lower() + if modname == 'procedure': # MODULE PROCEDURE construct continue if modname in module_files: @@ -1743,7 +1743,7 @@ rule FORTRAN_DEP_HACK for line in f: usematch = usere.match(line) if usematch is not None: - usename = usematch.group(1) + usename = usematch.group(1).lower() if usename not in tdeps: # The module is not provided by any source file. This # is due to: @@ -1989,7 +1989,7 @@ rule FORTRAN_DEP_HACK rel_src = os.path.join(src.subdir, src.fname) if os.path.isabs(rel_src): assert(rel_src.startswith(self.environment.get_build_dir())) - rel_src = rel_src[len(self.environment.get_build_dir())+1:] + rel_src = rel_src[len(self.environment.get_build_dir()) + 1:] abs_src = os.path.join(self.environment.get_build_dir(), rel_src) elif isinstance(src, mesonlib.File): rel_src = src.rel_to_builddir(self.build_to_src) @@ -2008,7 +2008,7 @@ rule FORTRAN_DEP_HACK src_filename = os.path.join(src.subdir, src.fname) if os.path.isabs(src_filename): assert(src_filename.startswith(self.environment.get_build_dir())) - src_filename = src_filename[len(self.environment.get_build_dir())+1:] + src_filename = src_filename[len(self.environment.get_build_dir()) + 1:] else: src_filename = src.fname elif os.path.isabs(src): diff --git a/mesonbuild/backend/vs2015backend.py b/mesonbuild/backend/vs2015backend.py index eb543ee..29b33fb 100644 --- a/mesonbuild/backend/vs2015backend.py +++ b/mesonbuild/backend/vs2015backend.py @@ -21,4 +21,3 @@ class Vs2015Backend(Vs2010Backend): self.name = 'vs2015' self.platform_toolset = 'v140' self.vs_version = '2015' - diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py index 16c0daf..c48fb07 100644 --- a/mesonbuild/backend/xcodebackend.py +++ b/mesonbuild/backend/xcodebackend.py @@ -14,6 +14,7 @@ from . import backends from .. import build +from .. import dependencies from .. import mesonlib import uuid, os, sys @@ -77,6 +78,7 @@ class XCodeBackend(backends.Backend): self.generate_buildall_configurations_map() self.generate_test_configurations_map() self.generate_native_target_map() + self.generate_native_frameworks_map() self.generate_source_phase_map() self.generate_target_dependency_map() self.generate_pbxdep_map() @@ -91,6 +93,7 @@ class XCodeBackend(backends.Backend): self.generate_pbx_build_style() self.generate_pbx_container_item_proxy() self.generate_pbx_file_reference() + self.generate_pbx_frameworks_buildphase() self.generate_pbx_group() self.generate_pbx_native_target() self.generate_pbx_project() @@ -133,9 +136,14 @@ class XCodeBackend(backends.Backend): self.buildstylemap = {'debug': self.gen_id()} def generate_build_phase_map(self): - self.buildphasemap = {} - for t in self.build.targets: - self.buildphasemap[t] = self.gen_id() + for tname, t in self.build.targets.items(): + # generate id for our own target-name + t.buildphasemap = {} + t.buildphasemap[tname] = self.gen_id() + # each target can have it's own Frameworks/Sources/..., generate id's for those + t.buildphasemap['Frameworks'] = self.gen_id() + t.buildphasemap['Resources'] = self.gen_id() + t.buildphasemap['Sources'] = self.gen_id() def generate_build_configuration_map(self): self.buildconfmap = {} @@ -162,6 +170,16 @@ class XCodeBackend(backends.Backend): for t in self.build.targets: self.native_targets[t] = self.gen_id() + def generate_native_frameworks_map(self): + self.native_frameworks = {} + self.native_frameworks_fileref = {} + for t in self.build.targets.values(): + for dep in t.get_external_deps(): + if isinstance(dep, dependencies.AppleFrameworks): + for f in dep.frameworks: + self.native_frameworks[f] = self.gen_id() + self.native_frameworks_fileref[f] = self.gen_id() + def generate_target_dependency_map(self): self.target_dependency_map = {} for tname, t in self.build.targets.items(): @@ -222,7 +240,14 @@ class XCodeBackend(backends.Backend): self.ofile.write('\n/* Begin PBXBuildFile section */\n') templ = '%s /* %s */ = { isa = PBXBuildFile; fileRef = %s /* %s */; settings = { COMPILER_FLAGS = "%s"; }; };\n' otempl = '%s /* %s */ = { isa = PBXBuildFile; fileRef = %s /* %s */;};\n' + for t in self.build.targets.values(): + + for dep in t.get_external_deps(): + if isinstance(dep, dependencies.AppleFrameworks): + for f in dep.frameworks: + self.ofile.write('%s /* %s.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = %s /* %s.framework */; };\n' % (self.native_frameworks[f], f, self.native_frameworks_fileref[f], f)) + for s in t.sources: if isinstance(s, mesonlib.File): s = s.fname @@ -276,6 +301,12 @@ class XCodeBackend(backends.Backend): def generate_pbx_file_reference(self): self.ofile.write('\n/* Begin PBXFileReference section */\n') + + for t in self.build.targets.values(): + for dep in t.get_external_deps(): + if isinstance(dep, dependencies.AppleFrameworks): + for f in dep.frameworks: + self.ofile.write('%s /* %s.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = %s.framework; path = System/Library/Frameworks/%s.framework; sourceTree = SDKROOT; };\n' % (self.native_frameworks_fileref[f], f, f, f)) src_templ = '%s /* %s */ = { isa = PBXFileReference; explicitFileType = "%s"; fileEncoding = 4; name = "%s"; path = "%s"; sourceTree = SOURCE_ROOT; };\n' for fname, idval in self.filemap.items(): fullpath = os.path.join(self.environment.get_source_dir(), fname) @@ -300,6 +331,27 @@ class XCodeBackend(backends.Backend): self.ofile.write(target_templ % (idval, tname, typestr, path, reftype)) self.ofile.write('/* End PBXFileReference section */\n') + def generate_pbx_frameworks_buildphase(self): + for tname, t in self.build.targets.items(): + self.ofile.write('\n/* Begin PBXFrameworksBuildPhase section */\n') + self.indent_level += 1 + self.write_line('%s /* %s */ = {\n' % (t.buildphasemap['Frameworks'], 'Frameworks')) + self.indent_level += 1 + self.write_line('isa = PBXFrameworksBuildPhase;\n') + self.write_line('buildActionMask = %s;\n' % (2147483647)) + self.write_line('files = (\n') + self.indent_level += 1 + for dep in t.get_external_deps(): + if isinstance(dep, dependencies.AppleFrameworks): + for f in dep.frameworks: + self.write_line('%s /* %s.framework in Frameworks */,\n' % (self.native_frameworks[f], f)) + self.indent_level -= 1 + self.write_line(');\n') + self.write_line('runOnlyForDeploymentPostprocessing = 0;\n') + self.indent_level -= 1 + self.write_line('};\n') + self.ofile.write('/* End PBXFrameworksBuildPhase section */\n') + def generate_pbx_group(self): groupmap = {} target_src_map = {} @@ -310,6 +362,7 @@ class XCodeBackend(backends.Backend): sources_id = self.gen_id() resources_id = self.gen_id() products_id = self.gen_id() + frameworks_id = self.gen_id() self.write_line('%s = {' % self.maingroup_id) self.indent_level += 1 self.write_line('isa = PBXGroup;') @@ -318,6 +371,7 @@ class XCodeBackend(backends.Backend): self.write_line('%s /* Sources */,' % sources_id) self.write_line('%s /* Resources */,' % resources_id) self.write_line('%s /* Products */,' % products_id) + self.write_line('%s /* Frameworks */,' % frameworks_id) self.indent_level -= 1 self.write_line(');') self.write_line('sourceTree = "<group>";') @@ -349,6 +403,26 @@ class XCodeBackend(backends.Backend): self.indent_level -= 1 self.write_line('};') + self.write_line('%s /* Frameworks */ = {' % frameworks_id) + self.indent_level += 1 + self.write_line('isa = PBXGroup;') + self.write_line('children = (') + # write frameworks + self.indent_level += 1 + + for t in self.build.targets.values(): + for dep in t.get_external_deps(): + if isinstance(dep, dependencies.AppleFrameworks): + for f in dep.frameworks: + self.write_line('%s /* %s.framework */,\n' % (self.native_frameworks_fileref[f], f)) + + self.indent_level -= 1 + self.write_line(');') + self.write_line('name = Frameworks;') + self.write_line('sourceTree = "<group>";') + self.indent_level -= 1 + self.write_line('};') + # Targets for t in self.build.targets: self.write_line('%s /* %s */ = {' % (groupmap[t], t)) @@ -409,7 +483,9 @@ class XCodeBackend(backends.Backend): % (self.buildconflistmap[tname], tname)) self.write_line('buildPhases = (') self.indent_level += 1 - self.write_line('%s /* Sources */,' % self.buildphasemap[tname]) + t = self.build.targets[tname] + for bpname, bpval in t.buildphasemap.items(): + self.write_line('%s /* %s yyy */,' % (bpval, bpname)) self.indent_level -= 1 self.write_line(');') self.write_line('buildRules = (') @@ -503,7 +579,8 @@ class XCodeBackend(backends.Backend): def generate_pbx_sources_build_phase(self): self.ofile.write('\n/* Begin PBXSourcesBuildPhase section */\n') for name, phase_id in self.source_phase.items(): - self.write_line('%s /* Sources */ = {' % self.buildphasemap[name]) + t = self.build.targets[name] + self.write_line('%s /* Sources */ = {' % (t.buildphasemap[name])) self.indent_level += 1 self.write_line('isa = PBXSourcesBuildPhase;') self.write_line('buildActionMask = 2147483647;') diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 855c0bd..eb1b826 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -28,6 +28,8 @@ known_basic_kwargs = {'install': True, 'c_pch': True, 'cpp_pch': True, 'c_args': True, + 'objc_args': True, + 'objcpp_args': True, 'cpp_args': True, 'cs_args': True, 'vala_args': True, @@ -268,6 +270,8 @@ class EnvironmentVariables: class Target: def __init__(self, name, subdir, build_by_default): + if '/' in name or '\\' in name: + raise InvalidArguments('Target name must not contain a path separator.') self.name = name self.subdir = subdir self.build_by_default = build_by_default @@ -627,6 +631,14 @@ class BuildTarget(Target): if not isinstance(valalist, list): valalist = [valalist] self.add_compiler_args('vala', valalist) + objclist = kwargs.get('objc_args', []) + if not isinstance(objclist, list): + objclist = [objclist] + self.add_compiler_args('objc', objclist) + objcpplist = kwargs.get('objcpp_args', []) + if not isinstance(objcpplist, list): + objcpplist = [objcpplist] + self.add_compiler_args('objcpp', objcpplist) fortranlist = kwargs.get('fortran_args', []) if not isinstance(fortranlist, list): fortranlist = [fortranlist] @@ -1089,7 +1101,7 @@ class Executable(BuildTarget): if not hasattr(self, 'suffix'): # Executable for Windows or C#/Mono if (for_windows(is_cross, environment) or - for_cygwin(is_cross, environment) or 'cs' in self.compilers): + for_cygwin(is_cross, environment) or 'cs' in self.compilers): self.suffix = 'exe' else: self.suffix = '' diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 948a6d4..ca3cf75 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -2227,6 +2227,8 @@ class Interpreter(InterpreterBase): raise InvalidArguments('Subdir contains ..') if self.subdir == '' and args[0] == self.subproject_dir: raise InvalidArguments('Must not go into subprojects dir with subdir(), use subproject() instead.') + if self.subdir == '' and args[0].startswith('meson-'): + raise InvalidArguments('The "meson-" prefix is reserved and cannot be used for top-level subdir().') prev_subdir = self.subdir subdir = os.path.join(prev_subdir, args[0]) if os.path.isabs(subdir): @@ -2593,7 +2595,14 @@ different subdirectory. else: mlog.debug('Unknown target type:', str(targetholder)) raise RuntimeError('Unreachable code') - target = targetclass(name, self.subdir, self.subproject, is_cross, sources, objs, self.environment, kwargs) + # Fix failing test 53 when removing this. + if '/' in name or '\\' in name: + mlog.warning('Target name must not contain a path separator. This will become a hard error in a future release.') + subpart, name = os.path.split(name) + subdir = os.path.join(self.subdir, subpart) + else: + subdir = self.subdir + target = targetclass(name, subdir, self.subproject, is_cross, sources, objs, self.environment, kwargs) if is_cross: self.add_cross_stdlib_info(target) l = targetholder(target, self) diff --git a/mesonbuild/mesonmain.py b/mesonbuild/mesonmain.py index 4fecc58..dacc478 100644 --- a/mesonbuild/mesonmain.py +++ b/mesonbuild/mesonmain.py @@ -64,11 +64,11 @@ add_builtin_argument('errorlogs', action='store_false') parser.add_argument('--cross-file', default=None, help='File describing cross compilation environment.') -parser.add_argument('-D', action='append', dest='projectoptions', default=[], - help='Set project options.') +parser.add_argument('-D', action='append', dest='projectoptions', default=[], metavar="option", + help='Set the value of an option, can be used several times to set multiple options.') parser.add_argument('-v', '--version', action='version', version=coredata.version) - # See the mesonlib.WrapMode enum for documentation +# See the mesonlib.WrapMode enum for documentation parser.add_argument('--wrap-mode', default=WrapMode.default, type=lambda t: getattr(WrapMode, t), choices=WrapMode, help='Special wrap mode to use') diff --git a/mesonbuild/scripts/depfixer.py b/mesonbuild/scripts/depfixer.py index 2de50ba..1169b7e 100644 --- a/mesonbuild/scripts/depfixer.py +++ b/mesonbuild/scripts/depfixer.py @@ -103,7 +103,7 @@ class SectionHeader(DataSizes): self.sh_addralign = struct.unpack(self.XWord, ifile.read(self.XWordSize))[0] else: self.sh_addralign = struct.unpack(self.Word, ifile.read(self.WordSize))[0] -#Elf64_Xword +# Elf64_Xword if is_64: self.sh_entsize = struct.unpack(self.XWord, ifile.read(self.XWordSize))[0] else: diff --git a/mesonbuild/scripts/dist.py b/mesonbuild/scripts/dist.py index 064708e..325a882 100644 --- a/mesonbuild/scripts/dist.py +++ b/mesonbuild/scripts/dist.py @@ -83,8 +83,8 @@ def create_dist(dist_name, src_root, bld_root, dist_sub): with tarfile.open(xzname, 'w:xz') as tf: tf.add(distdir, os.path.split(distdir)[1]) # Create only .tar.xz for now. - #zipname = distdir + '.zip' - #create_zip(zipname, distdir) + # zipname = distdir + '.zip' + # create_zip(zipname, distdir) shutil.rmtree(distdir) return (xzname, ) diff --git a/mesonbuild/wrap/wrap.py b/mesonbuild/wrap/wrap.py index b17d931..ac84d0e 100644 --- a/mesonbuild/wrap/wrap.py +++ b/mesonbuild/wrap/wrap.py @@ -50,7 +50,7 @@ def open_wrapdburl(urlstring): global ssl_warning_printed if has_ssl: try: - return urllib.request.urlopen(urlstring)#, context=build_ssl_context()) + return urllib.request.urlopen(urlstring)# , context=build_ssl_context()) except urllib.error.URLError: if not ssl_warning_printed: print('SSL connection failed. Falling back to unencrypted connections.') @@ -274,7 +274,7 @@ class Resolver: mlog.log('Using', mlog.bold(packagename), 'from cache.') return srcurl = p.get('source_url') - mlog.log('Dowloading', mlog.bold(packagename), 'from', mlog.bold(srcurl)) + mlog.log('Downloading', mlog.bold(packagename), 'from', mlog.bold(srcurl)) srcdata = self.get_data(srcurl) dhash = self.get_hash(srcdata) expected = p.get('source_hash') |