aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Klumpp <matthias@tenstral.net>2016-08-19 03:04:51 +0200
committerMatthias Klumpp <matthias@tenstral.net>2016-08-20 18:48:28 +0200
commit57c54a678c8eec18df345a44075d59f6384be8f0 (patch)
treea98c03f4d722eeb341b3465e9b5de11c35d66840
parent3eb90414f62f857abbb1c62e8e4c823b7b1473e6 (diff)
downloadmeson-57c54a678c8eec18df345a44075d59f6384be8f0.zip
meson-57c54a678c8eec18df345a44075d59f6384be8f0.tar.gz
meson-57c54a678c8eec18df345a44075d59f6384be8f0.tar.bz2
Allow build definitions to retrieve the unittest flag of a D compiler
D allows programmers to define their tests alongside the actual code in a unittest scope[1]. When compiled with a special flag, the compiler will build a binary containing the tests instead of the actual application. This is a strightforward and easy way to run tests and works well with Mesons test() command. Since using just one flag name to enable unittest mode would be too boring, compiler developers invented multiple ones. Adding this helper method makes it easy for people writing Meson build descriptions for D projects to enable unittestmode. [1]: https://dlang.org/spec/unittest.html
-rw-r--r--mesonbuild/compilers.py6
-rw-r--r--mesonbuild/interpreter.py7
-rw-r--r--test cases/d/4 unittest/app.d34
-rw-r--r--test cases/d/4 unittest/installed_files.txt1
-rw-r--r--test cases/d/4 unittest/meson.build8
5 files changed, 56 insertions, 0 deletions
diff --git a/mesonbuild/compilers.py b/mesonbuild/compilers.py
index 88184cb..450e8a5 100644
--- a/mesonbuild/compilers.py
+++ b/mesonbuild/compilers.py
@@ -1505,6 +1505,9 @@ class DCompiler(Compiler):
def get_soname_args(self, shlib_name, path, soversion):
return []
+ def get_unittest_flag(self):
+ return ['-unittest']
+
def build_rpath_args(self, build_dir, rpath_paths, install_rpath):
# This method is to be used by LDC and DMD.
# GDC can deal with the verbatim flags.
@@ -1562,6 +1565,9 @@ class GnuDCompiler(DCompiler):
def build_rpath_args(self, build_dir, rpath_paths, install_rpath):
return build_unix_rpath_args(build_dir, rpath_paths, install_rpath)
+ def get_unittest_flag(self):
+ return ['-funittest']
+
class LLVMDCompiler(DCompiler):
def __init__(self, exelist, version, is_cross):
DCompiler.__init__(self, exelist, version, is_cross)
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 5a6d702..763eb7d 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -597,6 +597,7 @@ class CompilerHolder(InterpreterObject):
'find_library': self.find_library_method,
'has_argument' : self.has_argument_method,
'first_supported_argument' : self.first_supported_argument_method,
+ 'get_unittest_flag' : self.get_unittest_flag_method,
})
def version_method(self, args, kwargs):
@@ -650,6 +651,12 @@ class CompilerHolder(InterpreterObject):
def get_id_method(self, args, kwargs):
return self.compiler.get_id()
+ def get_unittest_flag_method(self, args, kwargs):
+ # At time, only D compilers have this feature.
+ if not getattr(self.compiler, "get_unittest_flag", None):
+ return ''
+ return self.compiler.get_unittest_flag()
+
def has_member_method(self, args, kwargs):
if len(args) != 2:
raise InterpreterException('Has_member takes exactly two arguments.')
diff --git a/test cases/d/4 unittest/app.d b/test cases/d/4 unittest/app.d
new file mode 100644
index 0000000..751e754
--- /dev/null
+++ b/test cases/d/4 unittest/app.d
@@ -0,0 +1,34 @@
+
+import std.stdio;
+
+uint getFour ()
+{
+ auto getTwo ()
+ {
+ return 1 + 1;
+ }
+
+ return getTwo () + getTwo ();
+}
+
+void main ()
+{
+ import core.stdc.stdlib : exit;
+
+ writeln ("Four: ", getFour ());
+ exit (4);
+}
+
+unittest
+{
+ writeln ("TEST");
+ import core.stdc.stdlib : exit;
+
+ assert (getFour () > 2);
+ assert (getFour () == 4);
+
+ // we explicitly terminate here to give the unittest program a different exit
+ // code than the main application has.
+ // (this prevents the regular main() from being executed)
+ exit (0);
+}
diff --git a/test cases/d/4 unittest/installed_files.txt b/test cases/d/4 unittest/installed_files.txt
new file mode 100644
index 0000000..e718389
--- /dev/null
+++ b/test cases/d/4 unittest/installed_files.txt
@@ -0,0 +1 @@
+usr/bin/dapp?exe
diff --git a/test cases/d/4 unittest/meson.build b/test cases/d/4 unittest/meson.build
new file mode 100644
index 0000000..ca39adf
--- /dev/null
+++ b/test cases/d/4 unittest/meson.build
@@ -0,0 +1,8 @@
+project('D Unittests', 'd')
+
+e = executable('dapp', 'app.d', install : true)
+test('dapp_run', e, should_fail: true)
+
+e_test = executable('dapp_test', 'app.d',
+ d_args: meson.get_compiler('d').get_unittest_flag())
+test('dapp_test', e_test)