commit
ea60a22cd5
21 changed files with 334 additions and 8 deletions
@ -0,0 +1,2 @@ |
||||
def gluoninate(): |
||||
return 42 |
@ -0,0 +1,9 @@ |
||||
project('python sample', 'c') |
||||
|
||||
py3 = find_program('python3') |
||||
|
||||
main = files('prog.py') |
||||
|
||||
test('toplevel', py3, args : main) |
||||
|
||||
subdir('subdir') |
@ -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) |
@ -0,0 +1,5 @@ |
||||
submain = find_program('subprog.py') |
||||
|
||||
test('subdir', |
||||
submain, |
||||
env : 'PYTHONPATH=' + meson.source_root()) |
@ -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) |
@ -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('Returned result {} is not 1.'.format(result)) |
||||
sys.exit(1) |
@ -0,0 +1,17 @@ |
||||
if host_machine.system() == 'darwin' |
||||
# Default suffix is 'dylib' but Python does not use for extensions. |
||||
suffix = 'so' |
||||
elif host_machine.system() == 'windows' |
||||
# On Windows the extension is pyd for some unexplainable reason. |
||||
suffix = 'pyd' |
||||
else |
||||
suffix = [] |
||||
endif |
||||
|
||||
pylib = shared_library('tachyon', |
||||
'tachyon_module.c', |
||||
dependencies : py3_dep, |
||||
name_prefix : '', |
||||
name_suffix : suffix) |
||||
|
||||
pypathdir = meson.current_build_dir() |
@ -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); |
||||
} |
@ -0,0 +1,12 @@ |
||||
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_dep = dependency('python3') |
||||
|
||||
subdir('ext') |
||||
|
||||
test('extmod', |
||||
find_program('blaster.py'), |
||||
env : ['PYTHONPATH=' + pypathdir]) |
@ -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 |
@ -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); |
@ -0,0 +1,23 @@ |
||||
if host_machine.system() == 'darwin' |
||||
# Default suffix is 'dylib' but Python does not use for extensions. |
||||
suffix = 'so' |
||||
elif host_machine.system() == 'windows' |
||||
# On Windows the extension is pyd for some unexplainable reason. |
||||
suffix = 'pyd' |
||||
else |
||||
suffix = [] |
||||
endif |
||||
|
||||
pyx_c = custom_target('storer_pyx', |
||||
output : 'storer_pyx.c', |
||||
input : 'storer.pyx', |
||||
command : [cython, '@INPUT@', '-o', '@OUTPUT@'], |
||||
) |
||||
|
||||
slib = shared_library('storer', |
||||
'storer.c', pyx_c, |
||||
name_prefix : '', |
||||
name_suffix : suffix, |
||||
dependencies : py3_dep) |
||||
|
||||
pydir = meson.current_build_dir() |
@ -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; |
||||
} |
@ -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); |
@ -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) |
@ -0,0 +1,17 @@ |
||||
project('cython', 'c', |
||||
default_options : ['warning_level=3']) |
||||
|
||||
cython = find_program('cython3', required : false) |
||||
|
||||
if cython.found() |
||||
py3_dep = dependency('python3') |
||||
|
||||
subdir('libdir') |
||||
|
||||
test('cython tester', |
||||
find_program('cytest.py'), |
||||
env : ['PYTHONPATH=' + pydir] |
||||
) |
||||
else |
||||
message('Cython not found, skipping test.') |
||||
endif |
Loading…
Reference in new issue