aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--authors.txt1
-rw-r--r--mesonbuild/backend/backends.py83
-rw-r--r--mesonbuild/backend/ninjabackend.py84
-rw-r--r--mesonbuild/build.py72
-rw-r--r--mesonbuild/compilers.py13
-rw-r--r--mesonbuild/interpreter.py2
-rw-r--r--mesonbuild/mesonlib.py44
-rw-r--r--mesonbuild/modules/gnome.py11
-rw-r--r--mesonbuild/modules/pkgconfig.py8
-rw-r--r--test cases/common/110 extract same name/meson.build3
-rw-r--r--test cases/common/84 extract from nested subdir/meson.build8
-rw-r--r--test cases/frameworks/7 gnome/mkenums/meson-sample.h2
-rw-r--r--test cases/vala/5 target glib/meson.build6
-rw-r--r--test cases/vala/8 generated sources/installed_files.txt1
-rw-r--r--test cases/vala/8 generated sources/meson.build1
-rw-r--r--test cases/vala/8 generated sources/onlygen/maingen.in3
-rw-r--r--test cases/vala/8 generated sources/onlygen/meson.build7
17 files changed, 232 insertions, 117 deletions
diff --git a/authors.txt b/authors.txt
index bdad5bd..0222ff6 100644
--- a/authors.txt
+++ b/authors.txt
@@ -51,3 +51,4 @@ Guillaume Poirier-Morency
Scott D Phillips
Gautier Pelloux-Prayer
Alexandre Foley
+Jouni Kosonen
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index 0eb4c6e..fd71924 100644
--- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py
@@ -19,7 +19,7 @@ from .. import mesonlib
from .. import compilers
import json
import subprocess
-from ..mesonlib import MesonException
+from ..mesonlib import MesonException, get_compiler_for_source, classify_unity_sources
class InstallData():
def __init__(self, source_dir, build_dir, prefix):
@@ -78,21 +78,6 @@ class Backend():
priv_dirname = self.get_target_private_dir_abs(t)
os.makedirs(priv_dirname, exist_ok=True)
- def get_compiler_for_lang(self, lang):
- for i in self.build.compilers:
- if i.language == lang:
- return i
- raise RuntimeError('No compiler for language ' + lang)
-
- def get_compiler_for_source(self, src, is_cross):
- comp = self.build.cross_compilers if is_cross else self.build.compilers
- for i in comp:
- if i.can_compile(src):
- return i
- if isinstance(src, mesonlib.File):
- src = src.fname
- raise RuntimeError('No specified compiler can handle file ' + src)
-
def get_target_filename(self, t):
if isinstance(t, build.CustomTarget):
if len(t.get_outputs()) != 1:
@@ -153,14 +138,17 @@ class Backend():
# target that the GeneratedList is used in
return os.path.join(self.get_target_private_dir(target), src)
+ def get_unity_source_filename(self, target, suffix):
+ return target.name + '-unity.' + suffix
+
def generate_unity_files(self, target, unity_src):
- langlist = {}
abs_files = []
result = []
+ compsrcs = classify_unity_sources(target.compilers.values(), unity_src)
- def init_language_file(language, suffix):
+ def init_language_file(suffix):
outfilename = os.path.join(self.get_target_private_dir_abs(target),
- target.name + '-unity' + suffix)
+ self.get_unity_source_filename(target, suffix))
outfileabs = os.path.join(self.environment.get_build_dir(),
outfilename)
outfileabs_tmp = outfileabs + '.tmp'
@@ -171,20 +159,12 @@ class Backend():
result.append(outfilename)
return open(outfileabs_tmp, 'w')
- try:
- for src in unity_src:
- comp = self.get_compiler_for_source(src, target.is_cross)
- language = comp.get_language()
- try:
- ofile = langlist[language]
- except KeyError:
- suffix = '.' + comp.get_default_suffix()
- ofile = langlist[language] = init_language_file(language,
- suffix)
- ofile.write('#include<%s>\n' % src)
- finally:
- for x in langlist.values():
- x.close()
+ # For each language, generate a unity source file and return the list
+ for comp, srcs in compsrcs.items():
+ lang = comp.get_language()
+ with init_language_file(comp.get_default_suffix()) as ofile:
+ for src in srcs:
+ ofile.write('#include<%s>\n' % src)
[mesonlib.replace_if_different(x, x + '.tmp') for x in abs_files]
return result
@@ -278,24 +258,37 @@ class Backend():
for s in src:
if c.can_compile(s):
return c
- raise RuntimeError('Unreachable code')
+ raise AssertionError("BUG: Couldn't determine linker for sources {!r}".format(src))
def object_filename_from_source(self, target, source):
- return source.fname.replace('/', '_').replace('\\', '_') + '.' + self.environment.get_object_suffix()
+ if isinstance(source, mesonlib.File):
+ source = source.fname
+ return source.replace('/', '_').replace('\\', '_') + '.' + self.environment.get_object_suffix()
- def determine_ext_objs(self, extobj, proj_dir_to_build_root=''):
+ def determine_ext_objs(self, extobj, proj_dir_to_build_root):
result = []
targetdir = self.get_target_private_dir(extobj.target)
+ # With unity builds, there's just one object that contains all the
+ # sources, so if we want all the objects, just return that.
+ if self.environment.coredata.get_builtin_option('unity'):
+ if not extobj.unity_compatible:
+ # This should never happen
+ msg = 'BUG: Meson must not allow extracting single objects ' \
+ 'in Unity builds'
+ raise AssertionError(msg)
+ comp = get_compiler_for_source(extobj.target.compilers.values(),
+ extobj.srclist[0])
+ # The unity object name uses the full absolute path of the source file
+ osrc = os.path.join(self.get_target_private_dir_abs(extobj.target),
+ self.get_unity_source_filename(extobj.target,
+ comp.get_default_suffix()))
+ objname = self.object_filename_from_source(extobj.target, osrc)
+ objpath = os.path.join(proj_dir_to_build_root, targetdir, objname)
+ return [objpath]
for osrc in extobj.srclist:
- # If extracting in a subproject, the subproject
- # name gets duplicated in the file name.
- pathsegs = osrc.subdir.split(os.sep)
- if pathsegs[0] == 'subprojects':
- pathsegs = pathsegs[2:]
- fixedpath = os.sep.join(pathsegs)
- objname = os.path.join(proj_dir_to_build_root, targetdir,
- self.object_filename_from_source(extobj.target, osrc))
- result.append(objname)
+ objname = self.object_filename_from_source(extobj.target, osrc)
+ objpath = os.path.join(proj_dir_to_build_root, targetdir, objname)
+ result.append(objpath)
return result
def get_pch_include_args(self, compiler, target):
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index fa537ad..f826f89 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -18,7 +18,7 @@ from .. import build
from .. import mlog
from .. import dependencies
from .. import compilers
-from ..mesonlib import File, MesonException
+from ..mesonlib import File, MesonException, get_compiler_for_source
from .backends import InstallData
from ..build import InvalidArguments
import os, sys, pickle, re
@@ -258,6 +258,20 @@ int dummy;
srcs[f] = s
return srcs
+ # Languages that can mix with C or C++ but don't support unity builds yet
+ # because the syntax we use for unity builds is specific to C/++/ObjC/++.
+ langs_cant_unity = ('d', 'fortran')
+ def get_target_source_can_unity(self, target, source):
+ if isinstance(source, File):
+ source = source.fname
+ suffix = os.path.splitext(source)[1][1:]
+ for lang in self.langs_cant_unity:
+ if not lang in target.compilers:
+ continue
+ if suffix in target.compilers[lang].file_suffixes:
+ return False
+ return True
+
def generate_target(self, target, outfile):
if isinstance(target, build.CustomTarget):
self.generate_custom_target(target, outfile)
@@ -319,6 +333,18 @@ int dummy;
header_deps += self.get_generated_headers(target)
src_list = []
+ if is_unity:
+ # Warn about incompatible sources if a unity build is enabled
+ langs = set(target.compilers.keys())
+ langs_cant = langs.intersection(self.langs_cant_unity)
+ if langs_cant:
+ langs_are = langs = ', '.join(langs_cant).upper()
+ langs_are += ' are' if len(langs_cant) > 1 else ' is'
+ msg = '{} not supported in Unity builds yet, so {} ' \
+ 'sources in the {!r} target will be compiled normally' \
+ ''.format(langs_are, langs, target.name)
+ mlog.log(mlog.red('FIXME'), msg)
+
# Get a list of all generated *sources* (sources files, headers,
# objects, etc). Needed to determine the linker.
generated_output_sources = []
@@ -329,13 +355,14 @@ int dummy;
generated_source_files = []
for rel_src, gensrc in generated_sources.items():
generated_output_sources.append(rel_src)
+ raw_src = RawFilename(rel_src)
if self.environment.is_source(rel_src) and not self.environment.is_header(rel_src):
- if is_unity:
- unity_deps.append(rel_src)
+ if is_unity and self.get_target_source_can_unity(target, rel_src):
+ unity_deps.append(raw_src)
abs_src = os.path.join(self.environment.get_build_dir(), rel_src)
unity_src.append(abs_src)
else:
- generated_source_files.append(RawFilename(rel_src))
+ generated_source_files.append(raw_src)
elif self.environment.is_object(rel_src):
obj_list.append(rel_src)
elif self.environment.is_library(rel_src):
@@ -344,7 +371,7 @@ int dummy;
# Assume anything not specifically a source file is a header. This is because
# people generate files with weird suffixes (.inc, .fh) that they then include
# in their source files.
- header_deps.append(RawFilename(rel_src))
+ header_deps.append(raw_src)
# These are the generated source files that need to be built for use by
# this target. We create the Ninja build file elements for this here
# because we need `header_deps` to be fully generated in the above loop.
@@ -352,14 +379,17 @@ int dummy;
src_list.append(src)
obj_list.append(self.generate_single_compile(target, outfile, src, True,
header_deps=header_deps))
+
# Generate compilation targets for C sources generated from Vala
# sources. This can be extended to other $LANG->C compilers later if
# necessary. This needs to be separate for at least Vala
+ vala_generated_source_files = []
for src in vala_generated_sources:
+ raw_src = RawFilename(src)
src_list.append(src)
if is_unity:
unity_src.append(os.path.join(self.environment.get_build_dir(), src))
- header_deps.append(src)
+ header_deps.append(raw_src)
else:
# Generated targets are ordered deps because the must exist
# before the sources compiling them are used. After the first
@@ -367,17 +397,22 @@ int dummy;
# This should work in all cases. If it does not, then just
# move them from orderdeps to proper deps.
if self.environment.is_header(src):
- header_deps.append(src)
+ header_deps.append(raw_src)
else:
- # Passing 'vala' here signifies that we want the compile
- # arguments to be specialized for C code generated by
- # valac. For instance, no warnings should be emitted.
- obj_list.append(self.generate_single_compile(target, outfile, src, 'vala', [], header_deps))
+ # We gather all these and generate compile rules below
+ # after `header_deps` (above) is fully generated
+ vala_generated_source_files.append(raw_src)
+ for src in vala_generated_source_files:
+ # Passing 'vala' here signifies that we want the compile
+ # arguments to be specialized for C code generated by
+ # valac. For instance, no warnings should be emitted.
+ obj_list.append(self.generate_single_compile(target, outfile, src, 'vala', [], header_deps))
+
# Generate compile targets for all the pre-existing sources for this target
for f, src in target_sources.items():
if not self.environment.is_header(src):
src_list.append(src)
- if is_unity:
+ if is_unity and self.get_target_source_can_unity(target, src):
abs_src = os.path.join(self.environment.get_build_dir(),
src.rel_to_builddir(self.build_to_src))
unity_src.append(abs_src)
@@ -386,7 +421,7 @@ int dummy;
obj_list += self.flatten_object_list(target)
if is_unity:
for src in self.generate_unity_files(target, unity_src):
- obj_list.append(self.generate_single_compile(target, outfile, src, True, unity_deps + header_deps))
+ obj_list.append(self.generate_single_compile(target, outfile, RawFilename(src), True, unity_deps + header_deps))
linker = self.determine_linker(target, src_list + generated_output_sources)
elem = self.generate_link(target, outfile, outname, obj_list, linker, pch_objects)
self.generate_shlib_aliases(target, self.get_target_dir(target))
@@ -1668,14 +1703,14 @@ rule FORTRAN_DEP_HACK
def generate_single_compile(self, target, outfile, src, is_generated=False, header_deps=[], order_deps=[]):
"""
- Compiles only C/C++ and ObjC/ObjC++ sources
+ Compiles C/C++, ObjC/ObjC++, and D sources
"""
- if(isinstance(src, str) and src.endswith('.h')):
- raise RuntimeError('Fug')
+ if isinstance(src, str) and src.endswith('.h'):
+ raise AssertionError('BUG: sources should not contain headers')
if isinstance(src, RawFilename) and src.fname.endswith('.h'):
- raise RuntimeError('Fug')
+ raise AssertionError('BUG: sources should not contain headers')
extra_orderdeps = []
- compiler = self.get_compiler_for_source(src, target.is_cross)
+ compiler = get_compiler_for_source(target.compilers.values(), src)
commands = []
# The first thing is implicit include directories: source, build and private.
commands += compiler.get_include_args(self.get_target_private_dir(target), False)
@@ -1716,12 +1751,12 @@ rule FORTRAN_DEP_HACK
break
if isinstance(src, RawFilename):
rel_src = src.fname
- elif is_generated:
- if self.has_dir_part(src):
- rel_src = src
+ if os.path.isabs(src.fname):
+ abs_src = src.fname
else:
- rel_src = os.path.join(self.get_target_private_dir(target), src)
- abs_src = os.path.join(self.environment.get_source_dir(), rel_src)
+ abs_src = os.path.join(self.environment.get_build_dir(), src.fname)
+ elif is_generated:
+ raise AssertionError('BUG: broken generated source file handling for {!r}'.format(src))
else:
if isinstance(src, File):
rel_src = src.rel_to_builddir(self.build_to_src)
@@ -1805,6 +1840,7 @@ rule FORTRAN_DEP_HACK
return rel_obj
def has_dir_part(self, fname):
+ # FIXME FIXME: The usage of this is a terrible and unreliable hack
return '/' in fname or '\\' in fname
# Fortran is a bit weird (again). When you link against a library, just compiling a source file
@@ -1857,7 +1893,7 @@ rule FORTRAN_DEP_HACK
'directory as source, please put it in a subdirectory.' \
''.format(target.get_basename())
raise InvalidArguments(msg)
- compiler = self.get_compiler_for_lang(lang)
+ compiler = target.compilers[lang]
if compiler.id == 'msvc':
src = os.path.join(self.build_to_src, target.get_source_subdir(), pch[-1])
(commands, dep, dst, objs) = self.generate_msvc_pch_command(target, compiler, pch)
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index e16f118..f40df17 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -17,7 +17,7 @@ from . import environment
from . import dependencies
from . import mlog
import copy, os, re
-from .mesonlib import File, flatten, MesonException, stringlistify
+from .mesonlib import File, flatten, MesonException, stringlistify, classify_unity_sources
from .environment import for_windows, for_darwin
known_basic_kwargs = {'install' : True,
@@ -176,9 +176,42 @@ class IncludeDirs():
return self.extra_build_dirs
class ExtractedObjects():
+ '''
+ Holds a list of sources for which the objects must be extracted
+ '''
def __init__(self, target, srclist):
self.target = target
self.srclist = srclist
+ self.check_unity_compatible()
+
+ def check_unity_compatible(self):
+ # Figure out if the extracted object list is compatible with a Unity
+ # build. When we're doing a Unified build, we go through the sources,
+ # and create a single source file from each subset of the sources that
+ # can be compiled with a specific compiler. Then we create one object
+ # from each unified source file.
+ # If the list of sources for which we want objects is the same as the
+ # list of sources that go into each unified build, we're good.
+ self.unity_compatible = False
+ srclist_set = set(self.srclist)
+ # Objects for all the sources are required, so we're compatible
+ if srclist_set == set(self.target.sources):
+ self.unity_compatible = True
+ return
+ # Check if the srclist is a subset (of the target's sources) that is
+ # going to form a unified source file and a single object
+ compsrcs = classify_unity_sources(self.target.compilers.values(),
+ self.target.sources)
+ for srcs in compsrcs.values():
+ if srclist_set == set(srcs):
+ self.unity_compatible = True
+ return
+ msg = 'Single object files can not be extracted in Unity builds. ' \
+ 'You can only extract all the object files at once.'
+ raise MesonException(msg)
+
+ def get_want_all_objects(self):
+ return self.want_all_objects
class EnvironmentVariables():
def __init__(self):
@@ -313,6 +346,13 @@ class BuildTarget():
raise InvalidArguments(msg)
@staticmethod
+ def can_compile_sources(compiler, sources):
+ for s in sources:
+ if compiler.can_compile(s):
+ return True
+ return False
+
+ @staticmethod
def can_compile_remove_sources(compiler, sources):
removed = False
for s in sources[:]:
@@ -322,16 +362,23 @@ class BuildTarget():
return removed
def process_compilers(self):
- if len(self.sources) == 0:
+ if len(self.sources) + len(self.generated) == 0:
return
sources = list(self.sources)
+ for gensrc in self.generated:
+ sources += gensrc.get_outputs()
+ # Populate list of compilers
if self.is_cross:
compilers = self.environment.coredata.cross_compilers
else:
compilers = self.environment.coredata.compilers
for lang, compiler in compilers.items():
- if self.can_compile_remove_sources(compiler, sources):
+ if self.can_compile_sources(compiler, sources):
self.compilers[lang] = compiler
+ # If all our sources are Vala, our target also needs the C compiler but
+ # it won't get added above.
+ if 'vala' in self.compilers and 'c' not in self.compilers:
+ self.compilers['c'] = compilers['c']
def validate_sources(self):
if len(self.sources) == 0:
@@ -383,18 +430,15 @@ class BuildTarget():
if 'link_with' in self.kwargs:
self.kwargs['link_with'] = self.unpack_holder(self.kwargs['link_with'])
- def extract_objects(self, srcargs):
+ def extract_objects(self, srclist):
obj_src = []
- for srclist in srcargs:
- if not isinstance(srclist, list):
- srclist = [srclist]
- for src in srclist:
- if not isinstance(src, str):
- raise MesonException('Extraction arguments must be strings.')
- src = File(False, self.subdir, src)
- if src not in self.sources:
- raise MesonException('Tried to extract unknown source %s.' % src)
- obj_src.append(src)
+ for src in srclist:
+ if not isinstance(src, str):
+ raise MesonException('Object extraction arguments must be strings.')
+ src = File(False, self.subdir, src)
+ if src not in self.sources:
+ raise MesonException('Tried to extract unknown source %s.' % src)
+ obj_src.append(src)
return ExtractedObjects(self, obj_src)
def extract_all_objects(self):
diff --git a/mesonbuild/compilers.py b/mesonbuild/compilers.py
index 6ad2f1e..b7613aa 100644
--- a/mesonbuild/compilers.py
+++ b/mesonbuild/compilers.py
@@ -342,6 +342,9 @@ class Compiler():
def get_language(self):
return self.language
+ def get_default_suffix(self):
+ return self.default_suffix
+
def get_exelist(self):
return self.exelist[:]
@@ -497,9 +500,6 @@ class CCompiler(Compiler):
def get_depfile_suffix(self):
return 'd'
- def get_default_suffix(self):
- return self.default_suffix
-
def get_exelist(self):
return self.exelist[:]
@@ -1106,9 +1106,6 @@ class MonoCompiler(Compiler):
def get_dependency_gen_args(self, outtarget, outfile):
return []
- def get_default_suffix(self):
- return self.default_suffix
-
def get_linker_exelist(self):
return self.exelist[:]
@@ -1193,9 +1190,6 @@ class JavaCompiler(Compiler):
def get_dependency_gen_args(self, outtarget, outfile):
return []
- def get_default_suffix(self):
- return self.default_suffix
-
def get_linker_exelist(self):
return self.exelist[:]
@@ -1842,7 +1836,6 @@ class VisualStudioCPPCompiler(VisualStudioCCompiler):
def __init__(self, exelist, version, is_cross, exe_wrap):
self.language = 'cpp'
VisualStudioCCompiler.__init__(self, exelist, version, is_cross, exe_wrap)
- self.default_suffix = 'cpp'
self.base_options = ['b_pch'] # FIXME add lto, pgo and the like
def get_options(self):
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 44b5748..cc46665 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -2571,8 +2571,6 @@ requirements use the version keyword argument instead.''')
else:
obj = self.evaluate_statement(invokable)
method_name = node.name
- if method_name == 'extract_objects' and self.environment.coredata.get_builtin_option('unity'):
- raise InterpreterException('Single object files can not be extracted in Unity builds.')
args = node.args
if isinstance(obj, mparser.StringNode):
obj = obj.get_value()
diff --git a/mesonbuild/mesonlib.py b/mesonbuild/mesonlib.py
index abb5641..8133c48 100644
--- a/mesonbuild/mesonlib.py
+++ b/mesonbuild/mesonlib.py
@@ -70,6 +70,22 @@ class File:
def __hash__(self):
return hash((self.fname, self.subdir, self.is_built))
+def get_compiler_for_source(compilers, src):
+ for comp in compilers:
+ if comp.can_compile(src):
+ return comp
+ raise RuntimeError('No specified compiler can handle file {!s}'.format(src))
+
+def classify_unity_sources(compilers, sources):
+ compsrclist = {}
+ for src in sources:
+ comp = get_compiler_for_source(compilers, src)
+ if comp not in compsrclist:
+ compsrclist[comp] = [src]
+ else:
+ compsrclist[comp].append(src)
+ return compsrclist
+
def flatten(item):
if not isinstance(item, list):
return item
@@ -165,16 +181,18 @@ def version_compare(vstr1, vstr2):
return cmpop(varr1, varr2)
def default_libdir():
- try:
- pc = subprocess.Popen(['dpkg-architecture', '-qDEB_HOST_MULTIARCH'],
- stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
- (stdo, _) = pc.communicate()
- if pc.returncode == 0:
- archpath = stdo.decode().strip()
- return 'lib/' + archpath
- except Exception:
- pass
- if os.path.isdir('/usr/lib64'):
+ if is_debianlike():
+ try:
+ pc = subprocess.Popen(['dpkg-architecture', '-qDEB_HOST_MULTIARCH'],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.DEVNULL)
+ (stdo, _) = pc.communicate()
+ if pc.returncode == 0:
+ archpath = stdo.decode().strip()
+ return 'lib/' + archpath
+ except Exception:
+ pass
+ if os.path.isdir('/usr/lib64') and not os.path.islink('/usr/lib64'):
return 'lib64'
return 'lib'
@@ -255,10 +273,10 @@ def do_mesondefine(line, confdata):
def do_conf_file(src, dst, confdata):
try:
- with open(src) as f:
+ with open(src, encoding='utf-8') as f:
data = f.readlines()
- except Exception:
- raise MesonException('Could not read input file %s.' % src)
+ except Exception as e:
+ raise MesonException('Could not read input file %s: %s' % (src, str(e)))
# Only allow (a-z, A-Z, 0-9, _, -) as valid characters for a define
# Also allow escaping '@' with '\@'
regex = re.compile(r'[^\\]?@([-a-zA-Z0-9_]+)@')
diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py
index 1ae1527..0a1d916 100644
--- a/mesonbuild/modules/gnome.py
+++ b/mesonbuild/modules/gnome.py
@@ -344,9 +344,18 @@ class GnomeModule:
else:
raise MesonException(
'Gir includes must be str, GirTarget, or list of them')
+
+ cflags = []
if state.global_args.get('c'):
+ cflags += state.global_args['c']
+ for compiler in state.compilers:
+ if compiler.get_language() == 'c':
+ sanitize = compiler.get_options().get('b_sanitize')
+ if sanitize:
+ cflags += compilers.sanitizer_compile_args(sanitize)
+ if cflags:
scan_command += ['--cflags-begin']
- scan_command += state.global_args['c']
+ scan_command += cflags
scan_command += ['--cflags-end']
if kwargs.get('symbol_prefix'):
sym_prefix = kwargs.pop('symbol_prefix')
diff --git a/mesonbuild/modules/pkgconfig.py b/mesonbuild/modules/pkgconfig.py
index 0cfd309..7556375 100644
--- a/mesonbuild/modules/pkgconfig.py
+++ b/mesonbuild/modules/pkgconfig.py
@@ -45,10 +45,10 @@ class PkgConfigModule:
fname = os.path.join(outdir, pcfile)
with open(fname, 'w') as ofile:
ofile.write('prefix=%s\n' % coredata.get_builtin_option('prefix'))
- ofile.write('libdir=${prefix}/%s\n' %
- coredata.get_builtin_option('libdir'))
- ofile.write('includedir=${prefix}/%s\n\n' %
- coredata.get_builtin_option('includedir'))
+ # '${prefix}' is ignored if the second path is absolute (see
+ # 'os.path.join' for details)
+ ofile.write('libdir=%s\n' % os.path.join('${prefix}', coredata.get_builtin_option('libdir')))
+ ofile.write('includedir=%s\n' % os.path.join('${prefix}', coredata.get_builtin_option('includedir')))
ofile.write('Name: %s\n' % name)
if len(description) > 0:
ofile.write('Description: %s\n' % description)
diff --git a/test cases/common/110 extract same name/meson.build b/test cases/common/110 extract same name/meson.build
index 9384c47..0bfbb4d 100644
--- a/test cases/common/110 extract same name/meson.build
+++ b/test cases/common/110 extract same name/meson.build
@@ -1,6 +1,7 @@
project('object extraction', 'c')
lib = shared_library('somelib', ['lib.c', 'src/lib.c'])
-obj = lib.extract_objects(['lib.c', 'src/lib.c'])
+# Also tests that the object list is flattened properly
+obj = lib.extract_objects(['lib.c', ['src/lib.c']])
exe = executable('main', 'main.c', objects: obj)
test('extraction', exe)
diff --git a/test cases/common/84 extract from nested subdir/meson.build b/test cases/common/84 extract from nested subdir/meson.build
index 6db4290..3a42806 100644
--- a/test cases/common/84 extract from nested subdir/meson.build
+++ b/test cases/common/84 extract from nested subdir/meson.build
@@ -1,4 +1,8 @@
project('Extract objects from subdirs.', 'c')
-subdir('src')
-subdir('tst')
+if meson.is_unity()
+ message('Unity build: skipping incompatible test')
+else
+ subdir('src')
+ subdir('tst')
+endif
diff --git a/test cases/frameworks/7 gnome/mkenums/meson-sample.h b/test cases/frameworks/7 gnome/mkenums/meson-sample.h
index 51e5421..ee7b5cb 100644
--- a/test cases/frameworks/7 gnome/mkenums/meson-sample.h
+++ b/test cases/frameworks/7 gnome/mkenums/meson-sample.h
@@ -1,3 +1,5 @@
+#pragma once
+
typedef enum
{
MESON_THE_XVALUE,
diff --git a/test cases/vala/5 target glib/meson.build b/test cases/vala/5 target glib/meson.build
index 3f0d01e..f285d9f 100644
--- a/test cases/vala/5 target glib/meson.build
+++ b/test cases/vala/5 target glib/meson.build
@@ -1,4 +1,8 @@
-project('valatest', 'vala', 'c', default_options : ['werror=true'])
+project('valatest', 'vala', 'c')
+
+if not meson.is_unity()
+ add_global_arguments('-Werror', language : 'c')
+endif
valadeps = [dependency('glib-2.0', version : '>=2.32'), dependency('gobject-2.0')]
diff --git a/test cases/vala/8 generated sources/installed_files.txt b/test cases/vala/8 generated sources/installed_files.txt
index a4c37f6..e1e9432 100644
--- a/test cases/vala/8 generated sources/installed_files.txt
+++ b/test cases/vala/8 generated sources/installed_files.txt
@@ -1 +1,2 @@
usr/bin/generatedtest
+usr/bin/onlygentest
diff --git a/test cases/vala/8 generated sources/meson.build b/test cases/vala/8 generated sources/meson.build
index 7271821..6e03404 100644
--- a/test cases/vala/8 generated sources/meson.build
+++ b/test cases/vala/8 generated sources/meson.build
@@ -5,3 +5,4 @@ cd.set('x', 'y')
subdir('src')
subdir('tools')
+subdir('onlygen')
diff --git a/test cases/vala/8 generated sources/onlygen/maingen.in b/test cases/vala/8 generated sources/onlygen/maingen.in
new file mode 100644
index 0000000..33c14ce
--- /dev/null
+++ b/test cases/vala/8 generated sources/onlygen/maingen.in
@@ -0,0 +1,3 @@
+int main() {
+ return 0;
+}
diff --git a/test cases/vala/8 generated sources/onlygen/meson.build b/test cases/vala/8 generated sources/onlygen/meson.build
new file mode 100644
index 0000000..f48e0b8
--- /dev/null
+++ b/test cases/vala/8 generated sources/onlygen/meson.build
@@ -0,0 +1,7 @@
+onlygen = generator(copy,
+ output : '@BASENAME@.vala',
+ arguments : ['@INPUT@', '@OUTPUT@'])
+
+executable('onlygentest', onlygen.process('maingen.in'),
+ install : true,
+ dependencies: [dependency('glib-2.0'), dependency('gobject-2.0')])