Add python extensions to cpp libraries

This commit is contained in:
Rico Tiongson 2019-03-02 13:41:16 +08:00
parent 784577ebb9
commit 6549160985
14 changed files with 24 additions and 218 deletions

View File

@ -19,16 +19,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <ios> // std::ios #include <ios> // std::ios
#include <iostream> // std::cin, std::cout, std::cerr #include <iostream> // std::cin, std::cout, std::cerr
#include <string> // std::string #include <string> // std::string
#include "lib/comfortable_swipe" #include "lib/comfortable-swipe"
/* A FORWARD DECLARATION */ /* A FORWARD DECLARATION */
int main(int argc, char** args); int main(int argc, char** args);
/* Import python module here */
#include "comfortable-swipe.python.cpp"
/* MAIN DRIVER FUNCTION */ /* MAIN DRIVER FUNCTION */
int main(int argc, char** args) int main(int argc, char** args)
{ {
// improve buffering by decoupling loggers from stdio // improve buffering by decoupling loggers from stdio

View File

@ -1,82 +0,0 @@
/*
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 <http://www.gnu.org/licenses/>.
*/
/* Porting to Python */
#ifdef __COMFORTABLE_SWIPE__PYTHON__
#ifndef __COMFORTABLE_SWIPE__PYTHON_MAIN__
#define __COMFORTABLE_SWIPE__PYTHON_MAIN__
#include <iostream>
#include <Python.h>
// 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__ */

View File

View File

@ -1,44 +0,0 @@
#ifndef __COMFORTABLE_SWIPE__
#define __COMFORTABLE_SWIPE__
/*
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 <http://www.gnu.org/licenses/>.
*/
#include "index.hpp"
/**
* Make sure to include all implementation (.cpp) files below to be ready for export.
*/
#include "gesture/xdo_gesture.cpp"
#include "gesture/swipe_gesture.cpp"
#include "gesture/swipe_gesture.regex.cpp"
#include "service/autostart.cpp"
#include "service/buffer.cpp"
#include "service/config.cpp"
#include "service/debug.cpp"
#include "service/help.cpp"
#include "service/restart.cpp"
#include "service/start.cpp"
#include "service/status.cpp"
#include "service/stop.cpp"
#include "util/autostart_filename.cpp"
#include "util/conf_filename.cpp"
#include "util/read_config_file.cpp"
#endif /* __COMFORTABLE_SWIPE__ */

View File

@ -1,68 +0,0 @@
#ifndef __COMFORTABLE_SWIPE__index_hpp__
#define __COMFORTABLE_SWIPE__index_hpp__
/*
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 <http://www.gnu.org/licenses/>.
*/
// global defines
#ifndef __COMFORTABLE_SWIPE__PROGRAM__
#define __COMFORTABLE_SWIPE__PROGRAM__ "/usr/local/bin/comfortable-swipe"
#endif /* __COMFORTABLE_SWIPE__PROGRAM__ */
#ifndef __COMFORTABLE_SWIPE__CONFIG__
#define __COMFORTABLE_SWIPE__CONFIG__ "/usr/local/share/comfortable-swipe/comfortable-swipe.conf"
#endif /* __COMFORTABLE_SWIPE__CONFIG__ */
#ifndef __COMFORTABLE_SWIPE__VERSION__
#error __COMFORTABLE_SWIPE__VERSION__ must be defined.
#endif /* __COMFORTABLE_SWIPE__VERSION__ */
#include <map> // std::map
#include <string> // std::string
/**
* Make sure to include your header files here so that they can be imported by other modules.
*/
#include "gesture/xdo_gesture.h"
#include "gesture/swipe_gesture.h"
extern "C"
{
namespace comfortable_swipe
{
namespace util
{
const char* autostart_filename();
constexpr const char* conf_filename();
std::map<std::string, std::string> read_config_file(const char*);
}
namespace service
{
void autostart();
void buffer();
void config();
void debug();
void help();
void restart();
void start();
void status();
void stop();
}
}
}
#endif /* __COMFORTABLE_SWIPE__index_hpp__ */

View File

@ -19,12 +19,12 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "../util/__index__.hpp"
#include <iostream> // std::cerr, std::cout, std::endl #include <iostream> // std::cerr, std::cout, std::endl
#include <fstream> // std::ifstream, std::ofstream #include <fstream> // std::ifstream, std::ofstream
#include <string> // std::string #include <string> // std::string
#include <cstdio> // std::remove #include <cstdio> // std::remove
#include <cstdlib> // std::system #include <cstdlib> // std::system
#include "../index.hpp"
namespace comfortable_swipe::service namespace comfortable_swipe::service
{ {

View File

@ -19,8 +19,9 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "../util/__index__.hpp"
#include "../gesture/__index__.hpp"
#include <cstdio> // fgets_unlocked, stdin #include <cstdio> // fgets_unlocked, stdin
#include "../index.hpp"
/** /**
* Starts the comfortable-swipe service by buffering libinput debug-events. * Starts the comfortable-swipe service by buffering libinput debug-events.

View File

@ -19,7 +19,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "../index.hpp" #include "../util/__index__.hpp"
#include <cstdio> // std::puts #include <cstdio> // std::puts
namespace comfortable_swipe::service namespace comfortable_swipe::service

View File

@ -19,8 +19,8 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "../util/__index__.hpp"
#include <cstdio> // std::puts, std::printf #include <cstdio> // std::puts, std::printf
#include "../index.hpp"
namespace comfortable_swipe::service namespace comfortable_swipe::service
{ {

View File

@ -19,7 +19,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "../index.hpp" #include "../service/__index__.hpp"
namespace comfortable_swipe::service namespace comfortable_swipe::service
{ {

View File

@ -19,7 +19,6 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "../index.hpp"
#include <cstdlib> // std::system #include <cstdlib> // std::system
namespace comfortable_swipe::service namespace comfortable_swipe::service

View File

@ -19,7 +19,8 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "../index.hpp" #include "../util/__index__.hpp"
#include "../gesture/__index__.hpp"
#include <stdexcept> // std::runtime_error #include <stdexcept> // std::runtime_error
#include <unistd.h> // popen, pclose, getpid, access, F_OK #include <unistd.h> // popen, pclose, getpid, access, F_OK
#include <memory> // std::unique_ptr #include <memory> // std::unique_ptr

View File

@ -19,8 +19,6 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "../index.hpp"
namespace comfortable_swipe::util namespace comfortable_swipe::util
{ {
/** /**

View File

@ -7,14 +7,16 @@ __DIR__ = os.path.abspath(os.path.dirname(__file__))
__URL__ = 'https://github.com/Hikari9/comfortable-swipe-ubuntu' __URL__ = 'https://github.com/Hikari9/comfortable-swipe-ubuntu'
NAME = 'comfortable-swipe' NAME = 'comfortable-swipe'
PYTHON_NAME = NAME.replace('-', '_')
VERSION = '1.1.0' VERSION = '1.1.0'
PROGRAM = os.path.join('/usr/local/bin', NAME) PROGRAM = os.path.join('/usr/local/bin', NAME)
CONFIG = os.path.join(PROGRAM, 'comfortable-swipe.conf') CONFIG = os.path.join('/usr/local/share', NAME, NAME + '.conf')
# for C++ library # for C++ library
cpp_sources = ['comfortable-swipe.cpp'] cpp_sources = ['comfortable-swipe.cpp']
cpp_macros = dict( cpp_macros = dict(
__COMFORTABLE_SWIPE__PYTHON__='', __COMFORTABLE_SWIPE__PYTHON__='',
__COMFORTABLE_SWIPE__BOOST_PYTHON__='',
__COMFORTABLE_SWIPE__PYTHON_MODULE_NAME__='"{}"'.format(NAME.replace('-', '_')), __COMFORTABLE_SWIPE__PYTHON_MODULE_NAME__='"{}"'.format(NAME.replace('-', '_')),
__COMFORTABLE_SWIPE__PROGRAM__='"{}"'.format(PROGRAM), __COMFORTABLE_SWIPE__PROGRAM__='"{}"'.format(PROGRAM),
__COMFORTABLE_SWIPE__VERSION__='"{}"'.format(VERSION), __COMFORTABLE_SWIPE__VERSION__='"{}"'.format(VERSION),
@ -33,16 +35,18 @@ try:
with open('LICENSE', 'r') as LICENSE_file: with open('LICENSE', 'r') as LICENSE_file:
LICENSE = LICENSE_file.read() LICENSE = LICENSE_file.read()
# read C++ library for comfortable swipe # read C++ libraries for comfortable swipe
comfortable_swipe = Extension( extension_names = ['gesture', 'service', 'util']
name=NAME.replace('-', '_'), extensions = []
define_macros=list(cpp_macros.items()),
libraries=['xdo'],
include_dirs=['/usr/local/lib'],
sources=cpp_sources,
extra_compile_args=['-O2', '-Wno-unused-result']
) for extension_name in extension_names:
extensions.append(Extension(
name='{}.{}'.format(PYTHON_NAME, extension_name),
define_macros=list(cpp_macros.items()),
sources=['lib/__index__.cpp'],
extra_compile_args=['-O2', '-Wno-unused-result'],
libraries=['xdo', 'boost_python']
))
# setup python script # setup python script
setup( setup(
@ -56,7 +60,7 @@ try:
url=__URL__, url=__URL__,
# import external modules (aka. C++) # import external modules (aka. C++)
packages=find_packages(), packages=find_packages(),
ext_modules=[comfortable_swipe] ext_modules=extensions
) )