aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contributing.txt8
-rw-r--r--docs/markdown/Gnome-module.md2
-rw-r--r--mesonbuild/backend/backends.py1
-rw-r--r--mesonbuild/backend/ninjabackend.py14
-rw-r--r--mesonbuild/backend/vs2015backend.py1
-rw-r--r--mesonbuild/backend/xcodebackend.py87
-rw-r--r--mesonbuild/build.py14
-rw-r--r--mesonbuild/interpreter.py11
-rw-r--r--mesonbuild/mesonmain.py6
-rw-r--r--mesonbuild/scripts/depfixer.py2
-rw-r--r--mesonbuild/scripts/dist.py4
-rw-r--r--mesonbuild/wrap/wrap.py4
-rw-r--r--test cases/failing/51 reserved meson prefix/meson-foo/meson.build0
-rw-r--r--test cases/failing/51 reserved meson prefix/meson.build3
-rw-r--r--test cases/failing/53 slashname/meson.build12
-rw-r--r--test cases/failing/53 slashname/sub/meson.build2
-rw-r--r--test cases/failing/53 slashname/sub/prog.c6
-rw-r--r--test cases/fortran/8 module names/meson.build6
-rw-r--r--test cases/fortran/8 module names/mod1.f906
-rw-r--r--test cases/fortran/8 module names/mod2.f906
-rw-r--r--test cases/fortran/8 module names/test.f907
-rw-r--r--test cases/objc/4 objc args/meson.build4
-rw-r--r--test cases/objc/4 objc args/prog.m11
-rw-r--r--test cases/objc/5 objc++ args/meson.build4
-rw-r--r--test cases/objc/5 objc++ args/prog.mm16
-rw-r--r--test cases/osx/4 framework/meson.build18
-rw-r--r--test cases/osx/4 framework/prog.c3
-rw-r--r--test cases/osx/4 framework/stat.c1
-rw-r--r--test cases/osx/4 framework/xcode-frameworks.pngbin0 -> 421385 bytes
29 files changed, 235 insertions, 24 deletions
diff --git a/contributing.txt b/contributing.txt
index fc6e0ba..925109a 100644
--- a/contributing.txt
+++ b/contributing.txt
@@ -19,6 +19,14 @@ following:
- all new features must come with a test (or several if it is
a big feature)
+Meson uses Flake8 for style guide enforcement. The Flake8 options for
+the project are contained in setup.cfg.
+
+To run Flake8 on your local clone of Meson:
+
+ $ python3 -m pip install flake8
+ $ cd meson
+ $ flake8
C/C++ coding style
diff --git a/docs/markdown/Gnome-module.md b/docs/markdown/Gnome-module.md
index 079dfcb..46e9c53 100644
--- a/docs/markdown/Gnome-module.md
+++ b/docs/markdown/Gnome-module.md
@@ -148,6 +148,8 @@ Compiles and installs gtkdoc documentation. Takes one positional arguments; The
* `html_assets`: a list of assets for the HTML pages
* `content_files`: a list of content files
+This creates a `$module-doc` target that can be ran to build docs and normally these are only built on install.
+
### gnome.gtkdoc_html_dir()
Takes as argument a module name and returns the path where that module's HTML files will be installed. Usually used with `install_data` to install extra files, such as images, to the output directory.
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')
diff --git a/test cases/failing/51 reserved meson prefix/meson-foo/meson.build b/test cases/failing/51 reserved meson prefix/meson-foo/meson.build
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test cases/failing/51 reserved meson prefix/meson-foo/meson.build
diff --git a/test cases/failing/51 reserved meson prefix/meson.build b/test cases/failing/51 reserved meson prefix/meson.build
new file mode 100644
index 0000000..1339035
--- /dev/null
+++ b/test cases/failing/51 reserved meson prefix/meson.build
@@ -0,0 +1,3 @@
+project('test')
+
+subdir('meson-foo')
diff --git a/test cases/failing/53 slashname/meson.build b/test cases/failing/53 slashname/meson.build
new file mode 100644
index 0000000..bba5301
--- /dev/null
+++ b/test cases/failing/53 slashname/meson.build
@@ -0,0 +1,12 @@
+project('slashname', 'c')
+
+# Traverse this subdir so the corresponding dir
+# is created inside the build dir.
+subdir('sub')
+
+# Try to create an executable that would go in the "sub" dir
+# inside the build dir. This is prohibited.
+executable('sub/prog', pf)
+
+error('Re-enable me once slash in name is finally prohibited.')
+
diff --git a/test cases/failing/53 slashname/sub/meson.build b/test cases/failing/53 slashname/sub/meson.build
new file mode 100644
index 0000000..e104890
--- /dev/null
+++ b/test cases/failing/53 slashname/sub/meson.build
@@ -0,0 +1,2 @@
+pf = files('prog.c')
+
diff --git a/test cases/failing/53 slashname/sub/prog.c b/test cases/failing/53 slashname/sub/prog.c
new file mode 100644
index 0000000..722de0a
--- /dev/null
+++ b/test cases/failing/53 slashname/sub/prog.c
@@ -0,0 +1,6 @@
+#include<stdio.h>
+
+int main(int argc, char **argv) {
+ printf("I should not be run ever.\n");
+ return 1;
+}
diff --git a/test cases/fortran/8 module names/meson.build b/test cases/fortran/8 module names/meson.build
new file mode 100644
index 0000000..632c597
--- /dev/null
+++ b/test cases/fortran/8 module names/meson.build
@@ -0,0 +1,6 @@
+project('mod_name_case', 'fortran')
+
+sources = ['test.f90', 'mod1.f90', 'mod2.f90']
+
+exe = executable('mod_name_case', sources)
+test('mod_name_case', exe)
diff --git a/test cases/fortran/8 module names/mod1.f90 b/test cases/fortran/8 module names/mod1.f90
new file mode 100644
index 0000000..69cc900
--- /dev/null
+++ b/test cases/fortran/8 module names/mod1.f90
@@ -0,0 +1,6 @@
+module MyMod1
+ implicit none
+
+ integer, parameter :: myModVal1 = 1
+
+end module MyMod1
diff --git a/test cases/fortran/8 module names/mod2.f90 b/test cases/fortran/8 module names/mod2.f90
new file mode 100644
index 0000000..971df44
--- /dev/null
+++ b/test cases/fortran/8 module names/mod2.f90
@@ -0,0 +1,6 @@
+module mymod2
+ implicit none
+
+ integer, parameter :: myModVal2 = 2
+
+end module mymod2
diff --git a/test cases/fortran/8 module names/test.f90 b/test cases/fortran/8 module names/test.f90
new file mode 100644
index 0000000..ff5a545
--- /dev/null
+++ b/test cases/fortran/8 module names/test.f90
@@ -0,0 +1,7 @@
+program test
+ use mymod1
+ use MyMod2
+
+ integer, parameter :: testVar = myModVal1 + myModVal2
+
+end program test
diff --git a/test cases/objc/4 objc args/meson.build b/test cases/objc/4 objc args/meson.build
new file mode 100644
index 0000000..8887d96
--- /dev/null
+++ b/test cases/objc/4 objc args/meson.build
@@ -0,0 +1,4 @@
+project('objective c args', 'objc')
+
+exe = executable('prog', 'prog.m', objc_args : ['-DMESON_TEST'])
+test('objective c args', exe)
diff --git a/test cases/objc/4 objc args/prog.m b/test cases/objc/4 objc args/prog.m
new file mode 100644
index 0000000..bfd686a
--- /dev/null
+++ b/test cases/objc/4 objc args/prog.m
@@ -0,0 +1,11 @@
+#import<stdio.h>
+
+int main(int argc, char **argv)
+{
+#ifdef MESON_TEST
+ int x = 3;
+#endif
+
+ printf("x = %d\n", x);
+ return 0;
+}
diff --git a/test cases/objc/5 objc++ args/meson.build b/test cases/objc/5 objc++ args/meson.build
new file mode 100644
index 0000000..e0e34b0
--- /dev/null
+++ b/test cases/objc/5 objc++ args/meson.build
@@ -0,0 +1,4 @@
+project('objective c++ args', 'objcpp')
+
+exe = executable('prog', 'prog.mm', objcpp_args : ['-DMESON_OBJCPP_TEST'])
+test('objective c++ args', exe)
diff --git a/test cases/objc/5 objc++ args/prog.mm b/test cases/objc/5 objc++ args/prog.mm
new file mode 100644
index 0000000..3decaf2
--- /dev/null
+++ b/test cases/objc/5 objc++ args/prog.mm
@@ -0,0 +1,16 @@
+#import<stdio.h>
+
+class TestClass
+{
+};
+
+int main(int argc, char **argv)
+{
+#ifdef MESON_OBJCPP_TEST
+int x = 1;
+#endif
+
+ printf("x = %x\n", x);
+
+ return 0;
+}
diff --git a/test cases/osx/4 framework/meson.build b/test cases/osx/4 framework/meson.build
new file mode 100644
index 0000000..8d93bf9
--- /dev/null
+++ b/test cases/osx/4 framework/meson.build
@@ -0,0 +1,18 @@
+# Primitive test for adding frameworks in XCode
+# When opening the xcodeproj, the Folder "Frameworks" should contain two frameworks (OpenGL.framework and Foundation.framework)
+# "Target Membership" of ...
+# - OpenGL.framework should be only to prog@exe
+# - Foundation.framework should be only to stat@sta
+# "Build Phase" / "Link Binary with Libraries" for the target
+# - "prog@exe" should be only "Foundation.framework"
+# - "stat@sta" should be only "OpenGL.framework"
+# see "xcode-frameworks.png" for an example
+
+project('xcode framework test', 'c', default_options : ['libdir=libtest'])
+
+dep_libs = [dependency('appleframeworks', modules : ['OpenGL'], required : true)]
+dep_main = [dependency('appleframeworks', modules : ['Foundation'], required : true)]
+
+stlib = static_library('stat', 'stat.c', install : true, dependencies: dep_libs)
+exe = executable('prog', 'prog.c', install : true, dependencies: dep_main)
+
diff --git a/test cases/osx/4 framework/prog.c b/test cases/osx/4 framework/prog.c
new file mode 100644
index 0000000..11b7fad
--- /dev/null
+++ b/test cases/osx/4 framework/prog.c
@@ -0,0 +1,3 @@
+int main(int argc, char **argv) {
+ return 0;
+}
diff --git a/test cases/osx/4 framework/stat.c b/test cases/osx/4 framework/stat.c
new file mode 100644
index 0000000..fa76a65
--- /dev/null
+++ b/test cases/osx/4 framework/stat.c
@@ -0,0 +1 @@
+int func() { return 933; }
diff --git a/test cases/osx/4 framework/xcode-frameworks.png b/test cases/osx/4 framework/xcode-frameworks.png
new file mode 100644
index 0000000..673d05a
--- /dev/null
+++ b/test cases/osx/4 framework/xcode-frameworks.png
Binary files differ