From 784577ebb995eed5663f3bd416ba9b0db29a3334 Mon Sep 17 00:00:00 2001 From: Rico Tiongson Date: Sat, 2 Mar 2019 10:47:34 +0800 Subject: [PATCH] Add working initial python porting definition for comfortable-swipe --- comfortable-swipe.cpp | 6 +++ comfortable-swipe.python.cpp | 82 ++++++++++++++++++++++++++++++++++++ setup.py | 29 +++++++------ 3 files changed, 105 insertions(+), 12 deletions(-) create mode 100644 comfortable-swipe.python.cpp diff --git a/comfortable-swipe.cpp b/comfortable-swipe.cpp index 65359b5..590b4a2 100644 --- a/comfortable-swipe.cpp +++ b/comfortable-swipe.cpp @@ -21,6 +21,12 @@ along with this program. If not, see . #include // std::string #include "lib/comfortable_swipe" +/* A FORWARD DECLARATION */ +int main(int argc, char** args); + +/* Import python module here */ +#include "comfortable-swipe.python.cpp" + /* MAIN DRIVER FUNCTION */ int main(int argc, char** args) diff --git a/comfortable-swipe.python.cpp b/comfortable-swipe.python.cpp new file mode 100644 index 0000000..31dd3ea --- /dev/null +++ b/comfortable-swipe.python.cpp @@ -0,0 +1,82 @@ +/* +Comfortable Swipe +by Rico Tiongson + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +/* Porting to Python */ +#ifdef __COMFORTABLE_SWIPE__PYTHON__ +#ifndef __COMFORTABLE_SWIPE__PYTHON_MAIN__ +#define __COMFORTABLE_SWIPE__PYTHON_MAIN__ + +#include +#include + +// some useful readable macros +// http://python3porting.com/cextensions.html +#if PY_MAJOR_VERSION >= 3 + #define MOD_ERROR_VAL NULL + #define MOD_SUCCESS_VAL(val) val + #define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void) + #define MOD_DEF(ob, name, doc, methods) \ + static struct PyModuleDef moduledef = { \ + PyModuleDef_HEAD_INIT, name, doc, -1, methods, }; \ + ob = PyModule_Create(&moduledef); +#else + #define MOD_ERROR_VAL + #define MOD_SUCCESS_VAL(val) + #define MOD_INIT(name) void init##name(void) + #define MOD_DEF(ob, name, doc, methods) \ + ob = Py_InitModule3(name, methods, doc); +#endif /* PY_MAJOR_VERSION >= 3 */ + +static PyObject * +test(PyObject * self, PyObject * args, PyObject * kwargs) +{ + std::puts("TESTING FUNCTION"); + Py_RETURN_NONE; +} + + +// python module methods +static PyMethodDef comfortable_swipe_methods[] = { + /* The cast of the function is necessary since PyCFunction values + * only take two PyObject* parameters, and test() takes + * three. + */ + { + "test", + (PyCFunction) test, + METH_VARARGS | METH_KEYWORDS, + "Test" + }, + {NULL, NULL, 0, NULL} /* sentinel */ +}; + +// how the python module is defined +MOD_INIT(comfortable_swipe) +{ + PyObject *m; + + MOD_DEF(m, "comfortable_swipe", "Comfortable swipe", comfortable_swipe_methods); + + if (m == NULL) + return MOD_ERROR_VAL; + + return MOD_SUCCESS_VAL(m); +} + +#endif /* __COMFORTABLE_SWIPE__PYTHON_MAIN__ */ +#endif /* __COMFORTABLE_SWIPE__PYTHON__ */ \ No newline at end of file diff --git a/setup.py b/setup.py index fec3eb1..91a4bb3 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,5 @@ import os -from setuptools import setup +from setuptools import setup, find_packages from setuptools.extension import Extension __CWD__ = os.getcwd() @@ -11,6 +11,16 @@ VERSION = '1.1.0' PROGRAM = os.path.join('/usr/local/bin', NAME) CONFIG = os.path.join(PROGRAM, 'comfortable-swipe.conf') +# for C++ library +cpp_sources = ['comfortable-swipe.cpp'] +cpp_macros = dict( + __COMFORTABLE_SWIPE__PYTHON__='', + __COMFORTABLE_SWIPE__PYTHON_MODULE_NAME__='"{}"'.format(NAME.replace('-', '_')), + __COMFORTABLE_SWIPE__PROGRAM__='"{}"'.format(PROGRAM), + __COMFORTABLE_SWIPE__VERSION__='"{}"'.format(VERSION), + __COMFORTABLE_SWIPE__CONFIG__='"{}"'.format(CONFIG) +) + try: # make sure working directory is here os.chdir(__DIR__) @@ -23,20 +33,13 @@ try: with open('LICENSE', 'r') as LICENSE_file: LICENSE = LICENSE_file.read() - # have a dictionary of macros - macros = dict( - __COMFORTABLE_SWIPE__PROGRAM__=f'"{PROGRAM}"', - __COMFORTABLE_SWIPE__VERSION__=f'"{VERSION}"', - __COMFORTABLE_SWIPE__CONFIG__=f'"{CONFIG}"' - ) - # read C++ library for comfortable swipe comfortable_swipe = Extension( - name='comfortable_swipe', - define_macros=list(macros.items()), + name=NAME.replace('-', '_'), + define_macros=list(cpp_macros.items()), libraries=['xdo'], include_dirs=['/usr/local/lib'], - sources=['comfortable-swipe.cpp'], + sources=cpp_sources, extra_compile_args=['-O2', '-Wno-unused-result'] ) @@ -52,9 +55,11 @@ try: author_email='thericotiongson@gmail.com', url=__URL__, # import external modules (aka. C++) - ext_modules=[comfortable_swipe], + packages=find_packages(), + ext_modules=[comfortable_swipe] ) + finally: # move working directory back to where it was before os.chdir(__DIR__)