aboutsummaryrefslogtreecommitdiffstats
path: root/meson/test cases/python3
diff options
context:
space:
mode:
Diffstat (limited to 'meson/test cases/python3')
-rw-r--r--meson/test cases/python3/1 basic/gluon/__init__.py0
-rw-r--r--meson/test cases/python3/1 basic/gluon/gluonator.py2
-rw-r--r--meson/test cases/python3/1 basic/meson.build32
-rwxr-xr-xmeson/test cases/python3/1 basic/prog.py9
-rw-r--r--meson/test cases/python3/1 basic/subdir/meson.build4
-rwxr-xr-xmeson/test cases/python3/1 basic/subdir/subprog.py12
-rwxr-xr-xmeson/test cases/python3/2 extmodule/blaster.py14
-rw-r--r--meson/test cases/python3/2 extmodule/ext/meson.build6
-rw-r--r--meson/test cases/python3/2 extmodule/ext/tachyon_module.c49
-rw-r--r--meson/test cases/python3/2 extmodule/meson.build37
-rwxr-xr-xmeson/test cases/python3/3 cython/cytest.py23
-rw-r--r--meson/test cases/python3/3 cython/libdir/cstorer.pxd9
-rw-r--r--meson/test cases/python3/3 cython/libdir/meson.build12
-rw-r--r--meson/test cases/python3/3 cython/libdir/storer.c24
-rw-r--r--meson/test cases/python3/3 cython/libdir/storer.h8
-rw-r--r--meson/test cases/python3/3 cython/libdir/storer.pyx16
-rw-r--r--meson/test cases/python3/3 cython/meson.build20
-rw-r--r--meson/test cases/python3/4 custom target depends extmodule/blaster.py32
-rw-r--r--meson/test cases/python3/4 custom target depends extmodule/ext/lib/meson-tachyonlib.c8
-rw-r--r--meson/test cases/python3/4 custom target depends extmodule/ext/lib/meson-tachyonlib.h6
-rw-r--r--meson/test cases/python3/4 custom target depends extmodule/ext/lib/meson.build4
-rw-r--r--meson/test cases/python3/4 custom target depends extmodule/ext/meson.build6
-rw-r--r--meson/test cases/python3/4 custom target depends extmodule/ext/tachyon_module.c51
-rw-r--r--meson/test cases/python3/4 custom target depends extmodule/meson.build41
24 files changed, 425 insertions, 0 deletions
diff --git a/meson/test cases/python3/1 basic/gluon/__init__.py b/meson/test cases/python3/1 basic/gluon/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/meson/test cases/python3/1 basic/gluon/__init__.py
diff --git a/meson/test cases/python3/1 basic/gluon/gluonator.py b/meson/test cases/python3/1 basic/gluon/gluonator.py
new file mode 100644
index 000000000..b53d6ded3
--- /dev/null
+++ b/meson/test cases/python3/1 basic/gluon/gluonator.py
@@ -0,0 +1,2 @@
+def gluoninate():
+ return 42
diff --git a/meson/test cases/python3/1 basic/meson.build b/meson/test cases/python3/1 basic/meson.build
new file mode 100644
index 000000000..4b8567d67
--- /dev/null
+++ b/meson/test cases/python3/1 basic/meson.build
@@ -0,0 +1,32 @@
+project('python sample', 'c')
+
+py3_mod = import('python3')
+py3 = py3_mod.find_python()
+
+py3_version = py3_mod.language_version()
+if py3_version.version_compare('< 3.2')
+ error('Invalid python version!?')
+endif
+
+py3_purelib = py3_mod.sysconfig_path('purelib')
+if not py3_purelib.to_lower().startswith('lib') or not py3_purelib.endswith('site-packages')
+ error('Python3 purelib path seems invalid?')
+endif
+
+# could be 'lib64' or 'Lib' on some systems
+py3_platlib = py3_mod.sysconfig_path('platlib')
+if not py3_platlib.to_lower().startswith('lib') or not py3_platlib.endswith('site-packages')
+ error('Python3 platlib path seems invalid?')
+endif
+
+# could be 'Include' on Windows
+py3_include = py3_mod.sysconfig_path('include')
+if not py3_include.to_lower().startswith('include')
+ error('Python3 include path seems invalid?')
+endif
+
+main = files('prog.py')
+
+test('toplevel', py3, args : main)
+
+subdir('subdir')
diff --git a/meson/test cases/python3/1 basic/prog.py b/meson/test cases/python3/1 basic/prog.py
new file mode 100755
index 000000000..9d95aea27
--- /dev/null
+++ b/meson/test cases/python3/1 basic/prog.py
@@ -0,0 +1,9 @@
+#!/usr/bin/env python3
+
+from gluon import gluonator
+import sys
+
+print('Running mainprog from root dir.')
+
+if gluonator.gluoninate() != 42:
+ sys.exit(1)
diff --git a/meson/test cases/python3/1 basic/subdir/meson.build b/meson/test cases/python3/1 basic/subdir/meson.build
new file mode 100644
index 000000000..8fe91b92e
--- /dev/null
+++ b/meson/test cases/python3/1 basic/subdir/meson.build
@@ -0,0 +1,4 @@
+test('subdir',
+ py3,
+ args : files('subprog.py'),
+ env : 'PYTHONPATH=' + meson.source_root())
diff --git a/meson/test cases/python3/1 basic/subdir/subprog.py b/meson/test cases/python3/1 basic/subdir/subprog.py
new file mode 100755
index 000000000..08652f084
--- /dev/null
+++ b/meson/test cases/python3/1 basic/subdir/subprog.py
@@ -0,0 +1,12 @@
+#!/usr/bin/env python3
+
+# In order to run this program, PYTHONPATH must be set to
+# point to source root.
+
+from gluon import gluonator
+import sys
+
+print('Running mainprog from subdir.')
+
+if gluonator.gluoninate() != 42:
+ sys.exit(1)
diff --git a/meson/test cases/python3/2 extmodule/blaster.py b/meson/test cases/python3/2 extmodule/blaster.py
new file mode 100755
index 000000000..529b02840
--- /dev/null
+++ b/meson/test cases/python3/2 extmodule/blaster.py
@@ -0,0 +1,14 @@
+#!/usr/bin/env python3
+
+import tachyon
+import sys
+
+result = tachyon.phaserize('shoot')
+
+if not isinstance(result, int):
+ print('Returned result not an integer.')
+ sys.exit(1)
+
+if result != 1:
+ print(f'Returned result {result} is not 1.')
+ sys.exit(1)
diff --git a/meson/test cases/python3/2 extmodule/ext/meson.build b/meson/test cases/python3/2 extmodule/ext/meson.build
new file mode 100644
index 000000000..d5d8849e3
--- /dev/null
+++ b/meson/test cases/python3/2 extmodule/ext/meson.build
@@ -0,0 +1,6 @@
+pylib = py3_mod.extension_module('tachyon',
+ 'tachyon_module.c',
+ dependencies : py3_dep,
+)
+
+pypathdir = meson.current_build_dir()
diff --git a/meson/test cases/python3/2 extmodule/ext/tachyon_module.c b/meson/test cases/python3/2 extmodule/ext/tachyon_module.c
new file mode 100644
index 000000000..b2592e482
--- /dev/null
+++ b/meson/test cases/python3/2 extmodule/ext/tachyon_module.c
@@ -0,0 +1,49 @@
+/*
+ Copyright 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.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/* A very simple Python extension module. */
+
+#include <Python.h>
+#include <string.h>
+
+static PyObject* phaserize(PyObject *self, PyObject *args) {
+ const char *message;
+ int result;
+
+ if(!PyArg_ParseTuple(args, "s", &message))
+ return NULL;
+
+ result = strcmp(message, "shoot") ? 0 : 1;
+ return PyLong_FromLong(result);
+}
+
+static PyMethodDef TachyonMethods[] = {
+ {"phaserize", phaserize, METH_VARARGS,
+ "Shoot tachyon cannons."},
+ {NULL, NULL, 0, NULL}
+};
+
+static struct PyModuleDef tachyonmodule = {
+ PyModuleDef_HEAD_INIT,
+ "tachyon",
+ NULL,
+ -1,
+ TachyonMethods
+};
+
+PyMODINIT_FUNC PyInit_tachyon(void) {
+ return PyModule_Create(&tachyonmodule);
+}
diff --git a/meson/test cases/python3/2 extmodule/meson.build b/meson/test cases/python3/2 extmodule/meson.build
new file mode 100644
index 000000000..def21b027
--- /dev/null
+++ b/meson/test cases/python3/2 extmodule/meson.build
@@ -0,0 +1,37 @@
+project('Python extension module', 'c',
+ default_options : ['buildtype=release'])
+# Because Windows Python ships only with optimized libs,
+# we must build this project the same way.
+
+py3_mod = import('python3')
+py3 = py3_mod.find_python()
+py3_dep = dependency('python3', required : false)
+cc = meson.get_compiler('c')
+
+if py3_dep.found()
+ message('Detected Python version: ' + py3_dep.version())
+ # Building extensions for Python 3 using Visual Studio 2015
+ # no longer works (or, rather, they build but don't run).
+ # Disable the tests in this case.
+ if py3_dep.version().version_compare('>=3.8') and cc.get_id() == 'msvc' and cc.version().version_compare('<=19.00.24215.1')
+ error('MESON_SKIP_TEST: Python modules do not work with Python 3.8 and VS2015 or earlier.')
+ endif
+
+ subdir('ext')
+
+ test('extmod',
+ py3,
+ args : files('blaster.py'),
+ env : ['PYTHONPATH=' + pypathdir])
+
+ # Check we can apply a version constraint
+ dependency('python3', version: '>=@0@'.format(py3_dep.version()))
+
+else
+ error('MESON_SKIP_TEST: Python3 libraries not found, skipping test.')
+endif
+
+py3_pkg_dep = dependency('python3', method: 'pkg-config', required : false)
+if py3_pkg_dep.found()
+ python_lib_dir = py3_pkg_dep.get_pkgconfig_variable('libdir')
+endif
diff --git a/meson/test cases/python3/3 cython/cytest.py b/meson/test cases/python3/3 cython/cytest.py
new file mode 100755
index 000000000..43443dc66
--- /dev/null
+++ b/meson/test cases/python3/3 cython/cytest.py
@@ -0,0 +1,23 @@
+#!/usr/bin/env python3
+
+from storer import Storer
+import sys
+
+s = Storer()
+
+if s.get_value() != 0:
+ print('Initial value incorrect.')
+ sys.exit(1)
+
+s.set_value(42)
+
+if s.get_value() != 42:
+ print('Setting value failed.')
+ sys.exit(1)
+
+try:
+ s.set_value('not a number')
+ print('Using wrong argument type did not fail.')
+ sys.exit(1)
+except TypeError:
+ pass
diff --git a/meson/test cases/python3/3 cython/libdir/cstorer.pxd b/meson/test cases/python3/3 cython/libdir/cstorer.pxd
new file mode 100644
index 000000000..7b730fc75
--- /dev/null
+++ b/meson/test cases/python3/3 cython/libdir/cstorer.pxd
@@ -0,0 +1,9 @@
+
+cdef extern from "storer.h":
+ ctypedef struct Storer:
+ pass
+
+ Storer* storer_new();
+ void storer_destroy(Storer *s);
+ int storer_get_value(Storer *s);
+ void storer_set_value(Storer *s, int v);
diff --git a/meson/test cases/python3/3 cython/libdir/meson.build b/meson/test cases/python3/3 cython/libdir/meson.build
new file mode 100644
index 000000000..4aaa041fc
--- /dev/null
+++ b/meson/test cases/python3/3 cython/libdir/meson.build
@@ -0,0 +1,12 @@
+pyx_c = custom_target('storer_pyx',
+ output : 'storer_pyx.c',
+ input : 'storer.pyx',
+ depend_files : 'cstorer.pxd',
+ command : [cython, '@INPUT@', '-o', '@OUTPUT@'],
+)
+
+slib = py3_mod.extension_module('storer',
+ 'storer.c', pyx_c,
+ dependencies : py3_dep)
+
+pydir = meson.current_build_dir()
diff --git a/meson/test cases/python3/3 cython/libdir/storer.c b/meson/test cases/python3/3 cython/libdir/storer.c
new file mode 100644
index 000000000..0199bb850
--- /dev/null
+++ b/meson/test cases/python3/3 cython/libdir/storer.c
@@ -0,0 +1,24 @@
+#include"storer.h"
+#include<stdlib.h>
+
+struct _Storer {
+ int value;
+};
+
+Storer* storer_new() {
+ Storer *s = malloc(sizeof(struct _Storer));
+ s->value = 0;
+ return s;
+}
+
+void storer_destroy(Storer *s) {
+ free(s);
+}
+
+int storer_get_value(Storer *s) {
+ return s->value;
+}
+
+void storer_set_value(Storer *s, int v) {
+ s->value = v;
+}
diff --git a/meson/test cases/python3/3 cython/libdir/storer.h b/meson/test cases/python3/3 cython/libdir/storer.h
new file mode 100644
index 000000000..4f7191711
--- /dev/null
+++ b/meson/test cases/python3/3 cython/libdir/storer.h
@@ -0,0 +1,8 @@
+#pragma once
+
+typedef struct _Storer Storer;
+
+Storer* storer_new();
+void storer_destroy(Storer *s);
+int storer_get_value(Storer *s);
+void storer_set_value(Storer *s, int v);
diff --git a/meson/test cases/python3/3 cython/libdir/storer.pyx b/meson/test cases/python3/3 cython/libdir/storer.pyx
new file mode 100644
index 000000000..ed551dc5f
--- /dev/null
+++ b/meson/test cases/python3/3 cython/libdir/storer.pyx
@@ -0,0 +1,16 @@
+cimport cstorer
+
+cdef class Storer:
+ cdef cstorer.Storer* _c_storer
+
+ def __cinit__(self):
+ self._c_storer = cstorer.storer_new()
+
+ def __dealloc__(self):
+ cstorer.storer_destroy(self._c_storer)
+
+ cpdef int get_value(self):
+ return cstorer.storer_get_value(self._c_storer)
+
+ cpdef set_value(self, int value):
+ cstorer.storer_set_value(self._c_storer, value)
diff --git a/meson/test cases/python3/3 cython/meson.build b/meson/test cases/python3/3 cython/meson.build
new file mode 100644
index 000000000..753b906cf
--- /dev/null
+++ b/meson/test cases/python3/3 cython/meson.build
@@ -0,0 +1,20 @@
+project('cython', 'c',
+ default_options : ['warning_level=3'])
+
+cython = find_program('cython3', required : false)
+py3_dep = dependency('python3', required : false)
+
+if cython.found() and py3_dep.found()
+ py3_dep = dependency('python3')
+ py3_mod = import('python3')
+ py3 = py3_mod.find_python()
+ subdir('libdir')
+
+ test('cython tester',
+ py3,
+ args : files('cytest.py'),
+ env : ['PYTHONPATH=' + pydir]
+ )
+else
+ error('MESON_SKIP_TEST: Cython3 or Python3 libraries not found, skipping test.')
+endif
diff --git a/meson/test cases/python3/4 custom target depends extmodule/blaster.py b/meson/test cases/python3/4 custom target depends extmodule/blaster.py
new file mode 100644
index 000000000..d2c93ad03
--- /dev/null
+++ b/meson/test cases/python3/4 custom target depends extmodule/blaster.py
@@ -0,0 +1,32 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+import argparse
+
+from pathlib import Path
+
+filedir = Path(os.path.dirname(__file__)).resolve()
+if list(filedir.glob('ext/*tachyon.*')):
+ sys.path.insert(0, (filedir / 'ext').as_posix())
+
+import tachyon
+
+parser = argparse.ArgumentParser()
+parser.add_argument('-o', dest='output', default=None)
+
+options = parser.parse_args(sys.argv[1:])
+
+result = tachyon.phaserize('shoot')
+
+if options.output:
+ with open(options.output, 'w') as f:
+ f.write('success')
+
+if not isinstance(result, int):
+ print('Returned result not an integer.')
+ sys.exit(1)
+
+if result != 1:
+ print(f'Returned result {result} is not 1.')
+ sys.exit(1)
diff --git a/meson/test cases/python3/4 custom target depends extmodule/ext/lib/meson-tachyonlib.c b/meson/test cases/python3/4 custom target depends extmodule/ext/lib/meson-tachyonlib.c
new file mode 100644
index 000000000..aeff29655
--- /dev/null
+++ b/meson/test cases/python3/4 custom target depends extmodule/ext/lib/meson-tachyonlib.c
@@ -0,0 +1,8 @@
+#ifdef _MSC_VER
+__declspec(dllexport)
+#endif
+const char*
+tachyon_phaser_command (void)
+{
+ return "shoot";
+}
diff --git a/meson/test cases/python3/4 custom target depends extmodule/ext/lib/meson-tachyonlib.h b/meson/test cases/python3/4 custom target depends extmodule/ext/lib/meson-tachyonlib.h
new file mode 100644
index 000000000..dca71d311
--- /dev/null
+++ b/meson/test cases/python3/4 custom target depends extmodule/ext/lib/meson-tachyonlib.h
@@ -0,0 +1,6 @@
+#pragma once
+
+#ifdef _MSC_VER
+__declspec(dllimport)
+#endif
+const char* tachyon_phaser_command (void);
diff --git a/meson/test cases/python3/4 custom target depends extmodule/ext/lib/meson.build b/meson/test cases/python3/4 custom target depends extmodule/ext/lib/meson.build
new file mode 100644
index 000000000..b1f893849
--- /dev/null
+++ b/meson/test cases/python3/4 custom target depends extmodule/ext/lib/meson.build
@@ -0,0 +1,4 @@
+libtachyon = shared_library('tachyonlib', 'meson-tachyonlib.c')
+
+libtachyon_dep = declare_dependency(link_with : libtachyon,
+ include_directories : include_directories('.'))
diff --git a/meson/test cases/python3/4 custom target depends extmodule/ext/meson.build b/meson/test cases/python3/4 custom target depends extmodule/ext/meson.build
new file mode 100644
index 000000000..5ccbe223c
--- /dev/null
+++ b/meson/test cases/python3/4 custom target depends extmodule/ext/meson.build
@@ -0,0 +1,6 @@
+subdir('lib')
+
+pylib = py3_mod.extension_module('tachyon',
+ 'tachyon_module.c',
+ dependencies : [libtachyon_dep, py3_dep],
+)
diff --git a/meson/test cases/python3/4 custom target depends extmodule/ext/tachyon_module.c b/meson/test cases/python3/4 custom target depends extmodule/ext/tachyon_module.c
new file mode 100644
index 000000000..b48032bbb
--- /dev/null
+++ b/meson/test cases/python3/4 custom target depends extmodule/ext/tachyon_module.c
@@ -0,0 +1,51 @@
+/*
+ Copyright 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.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/* A very simple Python extension module. */
+
+#include <Python.h>
+#include <string.h>
+
+#include "meson-tachyonlib.h"
+
+static PyObject* phaserize(PyObject *self, PyObject *args) {
+ const char *message;
+ int result;
+
+ if(!PyArg_ParseTuple(args, "s", &message))
+ return NULL;
+
+ result = strcmp(message, tachyon_phaser_command()) ? 0 : 1;
+ return PyLong_FromLong(result);
+}
+
+static PyMethodDef TachyonMethods[] = {
+ {"phaserize", phaserize, METH_VARARGS,
+ "Shoot tachyon cannons."},
+ {NULL, NULL, 0, NULL}
+};
+
+static struct PyModuleDef tachyonmodule = {
+ PyModuleDef_HEAD_INIT,
+ "tachyon",
+ NULL,
+ -1,
+ TachyonMethods
+};
+
+PyMODINIT_FUNC PyInit_tachyon(void) {
+ return PyModule_Create(&tachyonmodule);
+}
diff --git a/meson/test cases/python3/4 custom target depends extmodule/meson.build b/meson/test cases/python3/4 custom target depends extmodule/meson.build
new file mode 100644
index 000000000..d76aa36a4
--- /dev/null
+++ b/meson/test cases/python3/4 custom target depends extmodule/meson.build
@@ -0,0 +1,41 @@
+project('Python extension module', 'c',
+ default_options : ['buildtype=release'])
+# Because Windows Python ships only with optimized libs,
+# we must build this project the same way.
+
+py3_mod = import('python3')
+py3 = py3_mod.find_python()
+py3_dep = dependency('python3', required : false)
+cc = meson.get_compiler('c')
+
+# Copy to the builddir so that blaster.py can find the built tachyon module
+# FIXME: We should automatically detect this case and append the correct paths
+# to PYTHONLIBDIR
+blaster_py = configure_file(input : 'blaster.py',
+ output : 'blaster.py',
+ configuration : configuration_data())
+
+check_exists = '''
+import os, sys
+with open(sys.argv[1], 'rb') as f:
+ assert(f.read() == b'success')
+'''
+if py3_dep.found()
+ message('Detected Python version: ' + py3_dep.version())
+ if py3_dep.version().version_compare('>=3.8') and cc.get_id() == 'msvc' and cc.version().version_compare('<=19.00.24215.1')
+ error('MESON_SKIP_TEST: Python modules do not work with Python 3.8 and VS2015 or earlier.')
+ endif
+
+ subdir('ext')
+
+ out_txt = custom_target('tachyon flux',
+ input : blaster_py,
+ output : 'out.txt',
+ command : [py3, '@INPUT@', '-o', '@OUTPUT@'],
+ depends : pylib,
+ build_by_default: true)
+
+ test('flux', py3, args : ['-c', check_exists, out_txt])
+else
+ error('MESON_SKIP_TEST: Python3 libraries not found, skipping test.')
+endif