Can build a Python extension module.

pull/383/head
Jussi Pakkanen 9 years ago
parent a8120eb519
commit 98d00386b1
  1. 18
      mesonbuild/build.py
  2. 14
      test cases/python3/2 extmodule/blaster.py
  3. 6
      test cases/python3/2 extmodule/ext/meson.build
  4. 49
      test cases/python3/2 extmodule/ext/tachyon_module.c
  5. 9
      test cases/python3/2 extmodule/meson.build

@ -44,7 +44,9 @@ known_basic_kwargs = {'install' : True,
known_shlib_kwargs = known_basic_kwargs.copy() known_shlib_kwargs = known_basic_kwargs.copy()
known_shlib_kwargs.update({'version' : True, known_shlib_kwargs.update({'version' : True,
'soversion' : True}) 'soversion' : True,
'name_prefix' : True,
})
backslash_explanation = \ backslash_explanation = \
'''Compiler arguments have a backslash "\\" character. This is unfortunately not '''Compiler arguments have a backslash "\\" character. This is unfortunately not
@ -411,6 +413,11 @@ class BuildTarget():
if not os.path.isfile(trial): if not os.path.isfile(trial):
raise InvalidArguments('Tried to add non-existing resource %s.' % r) raise InvalidArguments('Tried to add non-existing resource %s.' % r)
self.resources = resources self.resources = resources
if 'name_prefix' in kwargs:
name_prefix = kwargs['name_prefix']
if not isinstance(name_prefix, str):
raise InvalidArguments('Name prefix must be a string.')
self.prefix = name_prefix
def get_subdir(self): def get_subdir(self):
return self.subdir return self.subdir
@ -654,7 +661,8 @@ class StaticLibrary(BuildTarget):
super().__init__(name, subdir, subproject, is_cross, sources, objects, environment, kwargs) super().__init__(name, subdir, subproject, is_cross, sources, objects, environment, kwargs)
if len(self.sources) > 0 and self.sources[0].endswith('.cs'): if len(self.sources) > 0 and self.sources[0].endswith('.cs'):
raise InvalidArguments('Static libraries not supported for C#.') raise InvalidArguments('Static libraries not supported for C#.')
self.prefix = environment.get_static_lib_prefix() if not hasattr(self, 'prefix'):
self.prefix = environment.get_static_lib_prefix()
self.suffix = environment.get_static_lib_suffix() self.suffix = environment.get_static_lib_suffix()
if len(self.sources) > 0 and self.sources[0].endswith('.rs'): if len(self.sources) > 0 and self.sources[0].endswith('.rs'):
self.suffix = 'rlib' self.suffix = 'rlib'
@ -675,11 +683,13 @@ class SharedLibrary(BuildTarget):
self.soversion = None self.soversion = None
super().__init__(name, subdir, subproject, is_cross, sources, objects, environment, kwargs); super().__init__(name, subdir, subproject, is_cross, sources, objects, environment, kwargs);
if len(self.sources) > 0 and self.sources[0].endswith('.cs'): if len(self.sources) > 0 and self.sources[0].endswith('.cs'):
prefix = 'lib'
self.suffix = 'dll' self.suffix = 'dll'
self.prefix = 'lib'
else: else:
self.prefix = environment.get_shared_lib_prefix() prefix = environment.get_shared_lib_prefix()
self.suffix = environment.get_shared_lib_suffix() self.suffix = environment.get_shared_lib_suffix()
if not hasattr(self, 'prefix'):
self.prefix = prefix
if len(self.sources) > 0 and self.sources[0].endswith('.rs'): if len(self.sources) > 0 and self.sources[0].endswith('.rs'):
self.suffix = 'rlib' self.suffix = 'rlib'
self.importsuffix = environment.get_import_lib_suffix() self.importsuffix = environment.get_import_lib_suffix()

@ -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,6 @@
pylib = shared_library('tachyon',
'tachyon_module.c',
dependencies : py3_dep,
name_prefix : '')
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,9 @@
project('Python extension module', 'c')
py3_dep = dependency('python3')
subdir('ext')
test('extmod',
find_program('blaster.py'),
env : ['PYTHONPATH=' + pypathdir])
Loading…
Cancel
Save