diff options
-rw-r--r-- | mesonbuild/backend/backends.py | 3 | ||||
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 17 | ||||
-rw-r--r-- | mesonbuild/modules/pkgconfig.py | 15 | ||||
-rw-r--r-- | mesonbuild/scripts/depfixer.py | 23 | ||||
-rw-r--r-- | mesonbuild/scripts/meson_install.py | 18 | ||||
-rw-r--r-- | test cases/common/51 pkgconfig-gen/meson.build | 5 |
6 files changed, 51 insertions, 30 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py index d352b8b..313580b 100644 --- a/mesonbuild/backend/backends.py +++ b/mesonbuild/backend/backends.py @@ -21,12 +21,11 @@ import subprocess from ..coredata import MesonException class InstallData(): - def __init__(self, source_dir, build_dir, prefix, depfixer): + def __init__(self, source_dir, build_dir, prefix): self.source_dir = source_dir self.build_dir= build_dir self.prefix = prefix self.targets = [] - self.depfixer = depfixer self.headers = [] self.man = [] self.data = [] diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index f5c992c..dfd792b 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -136,7 +136,10 @@ class NinjaBackend(backends.Backend): def detect_vs_dep_prefix(self, outfile, tempfilename): '''VS writes its dependency in a locale dependent format. Detect the search prefix to use.''' - if shutil.which('cl') is None: + # Of course there is another program called 'cl' on + # some platforms. Let's just require that on Windows + # cl points to msvc. + if not mesonlib.is_windows() or shutil.which('cl') is None: return outfile outfile.close() open(os.path.join(self.environment.get_scratch_dir(), 'incdetect.c'), @@ -233,7 +236,8 @@ int dummy; self.generate_cs_target(target, outfile) return if 'vala' in self.environment.coredata.compilers.keys() and self.has_vala(target): - vala_output_files = self.generate_vala_compile(target, outfile) + vc = self.environment.coredata.compilers['vala'] + vala_output_files = self.generate_vala_compile(vc, target, outfile) gen_src_deps += vala_output_files if 'swift' in self.environment.coredata.compilers.keys() and self.has_swift(target): self.generate_swift_target(target, outfile) @@ -457,10 +461,9 @@ int dummy; script_root = self.environment.get_script_dir() install_script = os.path.join(script_root, 'meson_install.py') install_data_file = os.path.join(self.environment.get_scratch_dir(), 'install.dat') - depfixer = [sys.executable, self.environment.get_build_command(), '--internal', 'depfixer'] d = InstallData(self.environment.get_source_dir(), self.environment.get_build_dir(), - self.environment.get_prefix(), depfixer) + self.environment.get_prefix()) elem = NinjaBuildElement(self.all_outputs, 'install', 'CUSTOM_COMMAND', 'PHONY') elem.add_dep('all') elem.add_item('DESC', 'Installing files.') @@ -788,7 +791,7 @@ int dummy; break return result - def generate_vala_compile(self, target, outfile): + def generate_vala_compile(self, compiler, target, outfile): """Vala is compiled into C. Set up all necessary build steps here.""" valac = self.environment.coredata.compilers['vala'] (src, vapi_src) = self.split_vala_sources(target.get_sources()) @@ -808,7 +811,9 @@ int dummy; generated_c_files = [] outputs = [vapiname] - args = ['-d', self.get_target_private_dir(target)] + args = [] + args += self.build.get_global_args(compiler) + args += ['-d', self.get_target_private_dir(target)] args += ['-C']#, '-o', cname] if not isinstance(target, build.Executable): outputs.append(hname) diff --git a/mesonbuild/modules/pkgconfig.py b/mesonbuild/modules/pkgconfig.py index f18decf..ffe03e2 100644 --- a/mesonbuild/modules/pkgconfig.py +++ b/mesonbuild/modules/pkgconfig.py @@ -21,7 +21,8 @@ class PkgConfigModule: def print_hello(self, state, args, kwargs): print('Hello from a Meson module') - def generate_pkgconfig_file(self, state, libraries, subdirs, name, description, version, filebase): + def generate_pkgconfig_file(self, state, libraries, subdirs, name, description, version, filebase, + pub_reqs, priv_reqs, priv_libs): outdir = state.environment.scratch_dir fname = os.path.join(outdir, filebase + '.pc') ofile = open(fname, 'w') @@ -34,6 +35,12 @@ class PkgConfigModule: ofile.write('Description: %s\n' % description) if len(version) > 0: ofile.write('Version: %s\n' % version) + if len(pub_reqs) > 0: + ofile.write('Requires: {}\n'.format(' '.join(pub_reqs))) + if len(priv_reqs) > 0: + ofile.write('Requires.private: {}\n'.format(' '.join(priv_reqs))) + if len(priv_libs) > 0: + ofile.write('Libraries.private: {}\n'.format(' '.join(priv_libs))) ofile.write('Libs: -L${libdir} ') for l in libraries: ofile.write('-l%s ' % l.name) @@ -73,9 +80,13 @@ class PkgConfigModule: description = kwargs.get('description', None) if not isinstance(description, str): raise coredata.MesonException('Description is not a string.') + pub_reqs = mesonlib.stringlistify(kwargs.get('requires', [])) + priv_reqs = mesonlib.stringlistify(kwargs.get('requires_private', [])) + priv_libs = mesonlib.stringlistify(kwargs.get('libraries_private', [])) pcfile = filebase + '.pc' pkgroot = os.path.join(state.environment.coredata.get_builtin_option('libdir'), 'pkgconfig') - self.generate_pkgconfig_file(state, libs, subdirs, name, description, version, filebase) + self.generate_pkgconfig_file(state, libs, subdirs, name, description, version, filebase, + pub_reqs, priv_reqs, priv_libs) return build.Data(False, state.environment.get_scratch_dir(), [pcfile], pkgroot) def initialize(): diff --git a/mesonbuild/scripts/depfixer.py b/mesonbuild/scripts/depfixer.py index 1ab83b6..8ff0dd1 100644 --- a/mesonbuild/scripts/depfixer.py +++ b/mesonbuild/scripts/depfixer.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -# Copyright 2013-2014 The Meson development team +# Copyright 2013-2016 The Meson development team # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -110,8 +110,9 @@ class SectionHeader(DataSizes): self.sh_entsize = struct.unpack(self.Word, ifile.read(self.WordSize))[0] class Elf(DataSizes): - def __init__(self, bfile): + def __init__(self, bfile, verbose=True): self.bfile = bfile + self.verbose = verbose self.bf = open(bfile, 'r+b') (self.ptrsize, self.is_le) = self.detect_elf_type() super().__init__(self.ptrsize, self.is_le) @@ -124,22 +125,21 @@ class Elf(DataSizes): if data[1:4] != b'ELF': # This script gets called to non-elf targets too # so just ignore them. - print('File "%s" is not an ELF file.' % self.bfile) + if self.verbose: + print('File "%s" is not an ELF file.' % self.bfile) sys.exit(0) if data[4] == 1: ptrsize = 32 elif data[4] == 2: ptrsize = 64 else: - print('File "%s" has unknown ELF class.' % self.bfile) - sys.exit(1) + sys.exit('File "%s" has unknown ELF class.' % self.bfile) if data[5] == 1: is_le = True elif data[5] == 2: is_le = False else: - print('File "%s" has unknown ELF endianness.' % self.bfile) - sys.exit(1) + sys.exit('File "%s" has unknown ELF endianness.' % self.bfile) return (ptrsize, is_le) def parse_header(self): @@ -257,14 +257,17 @@ class Elf(DataSizes): self.bf.write(newname) def fix_rpath(self, new_rpath): + if isinstance(new_rpath, str): + new_rpath = new_rpath.encode('utf8') rp_off = self.get_rpath_offset() if rp_off is None: - print('File does not have rpath. It should be a fully static executable.') + if self.verbose: + print('File does not have rpath. It should be a fully static executable.') return self.bf.seek(rp_off) old_rpath = self.read_str() if len(old_rpath) < len(new_rpath): - print("New rpath must not be longer than the old one.") + sys.exit("New rpath must not be longer than the old one.") self.bf.seek(rp_off) self.bf.write(new_rpath) self.bf.write(b'\0'*(len(old_rpath) - len(new_rpath) + 1)) @@ -295,7 +298,7 @@ def run(args): e.print_rpath() else: new_rpath = args[1] - e.fix_rpath(new_rpath.encode('utf8')) + e.fix_rpath(new_rpath) return 0 if __name__ == '__main__': diff --git a/mesonbuild/scripts/meson_install.py b/mesonbuild/scripts/meson_install.py index 8e3d0ca..1937277 100644 --- a/mesonbuild/scripts/meson_install.py +++ b/mesonbuild/scripts/meson_install.py @@ -16,6 +16,7 @@ import sys, pickle, os, shutil, subprocess, gzip, platform from glob import glob +from mesonbuild.scripts import depfixer def do_install(datafilename): ifile = open(datafilename, 'rb') @@ -203,15 +204,14 @@ def install_targets(d): print("Symlink creation does not work on this platform.") printed_symlink_error = True if is_elf_platform(): - p = subprocess.Popen(d.depfixer + [outname, install_rpath], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - (stdo, stde) = p.communicate() - if p.returncode != 0: - print('Could not fix dependency info.\n') - print('Stdout:\n%s\n' % stdo.decode()) - print('Stderr:\n%s\n' % stde.decode()) - sys.exit(1) + try: + e = depfixer.Elf(outname, True) + e.fix_rpath(install_rpath) + except SystemExit as e: + if isinstance(e.code, int) and e.code == 0: + pass + else: + raise def run(args): if len(args) != 1: diff --git a/test cases/common/51 pkgconfig-gen/meson.build b/test cases/common/51 pkgconfig-gen/meson.build index a54fd66..4044b3d 100644 --- a/test cases/common/51 pkgconfig-gen/meson.build +++ b/test cases/common/51 pkgconfig-gen/meson.build @@ -12,5 +12,8 @@ pkgg.generate( version : libver, name : 'libsimple', filebase : 'simple', - description : 'A simple demo library.' + description : 'A simple demo library.', + requires : 'glib-2.0', # Not really, but only here to test that this works. + requires_private : ['gio-2.0', 'gobject-2.0'], + libraries_private : '-lz', ) |