aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/backend/backends.py3
-rw-r--r--mesonbuild/backend/ninjabackend.py17
-rw-r--r--mesonbuild/modules/pkgconfig.py15
-rw-r--r--mesonbuild/scripts/depfixer.py23
-rw-r--r--mesonbuild/scripts/meson_install.py18
-rw-r--r--test cases/common/51 pkgconfig-gen/meson.build5
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',
)