diff --git a/meson.build b/meson.build index 35974852b..8d5bdd812 100644 --- a/meson.build +++ b/meson.build @@ -40,6 +40,7 @@ subdir('include') subdir('src') subdir('dbus') subdir('netplan') +subdir('python-cffi') subdir('examples') subdir('doc') diff --git a/python-cffi/.gitignore b/python-cffi/.gitignore new file mode 100644 index 000000000..789470f7f --- /dev/null +++ b/python-cffi/.gitignore @@ -0,0 +1,4 @@ +_libnetplan*.c +_libnetplan*.o +_libnetplan*.so + diff --git a/python-cffi/__init__.py b/python-cffi/__init__.py new file mode 100644 index 000000000..3202b1210 --- /dev/null +++ b/python-cffi/__init__.py @@ -0,0 +1,17 @@ +# Copyright (C) 2023 Canonical, Ltd. +# Author: Lukas Märdian +# +# 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; version 3. +# +# 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 . + +# Re-export submodules +from .state import * diff --git a/python-cffi/libnetplan_build.py b/python-cffi/libnetplan_build.py new file mode 100755 index 000000000..07be6ed09 --- /dev/null +++ b/python-cffi/libnetplan_build.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 + +# Copyright (C) 2023 Canonical, Ltd. +# Author: Lukas Märdian +# +# 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; version 3. +# +# 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 . + +from cffi import FFI +ffibuilder = FFI() + +# cdef() expects a single string declaring the C types, functions and +# globals needed to use the shared object. It must be in valid C syntax. +ffibuilder.cdef(""" + typedef struct netplan_state NetplanState; + typedef enum { + NETPLAN_BACKEND_NONE, + NETPLAN_BACKEND_NETWORKD, + NETPLAN_BACKEND_NM, + NETPLAN_BACKEND_OVS, + NETPLAN_BACKEND_MAX_, + } NetplanBackend; + NetplanState* netplan_state_new(); + void netplan_state_reset(NetplanState* np_state); + void netplan_state_clear(NetplanState** np_state); + NetplanBackend netplan_state_get_backend(const NetplanState* np_state); +""") + +# set_source() gives the name of the python extension module to +# produce, and some C source code as a string. This C code needs +# to make the declarated functions, types and globals available, +# so it is often just the "#include". +ffibuilder.set_source_pkgconfig("_libnetplan0", ['netplan', 'glib-2.0'], +""" + #include "netplan/netplan.h" // the C header of the library +""", + libraries=['netplan', 'glib-2.0']) # library name, for the linker + +if __name__ == "__main__": + ffibuilder.compile(verbose=False) diff --git a/python-cffi/meson.build b/python-cffi/meson.build new file mode 100644 index 000000000..e288709ee --- /dev/null +++ b/python-cffi/meson.build @@ -0,0 +1,18 @@ +pymod = import('python') +python = pymod.find_installation('python3') + + + +#https://mesonbuild.com/FAQ.html#but-i-really-want-to-use-wildcards +out = run_command('sh', '-c', 'python3 libnetplan_build.py && find -name _libnetplan*.so', check: true) +cffi_so = out.stdout().strip().split('\n') +message(cffi_so) + +bindings_sources = ''' + __init__.py + state.py +'''.split() + +bindings = python.install_sources( + [bindings_sources, cffi_so], + subdir: 'netplan') diff --git a/python-cffi/state.py b/python-cffi/state.py new file mode 100644 index 000000000..ca7f309a3 --- /dev/null +++ b/python-cffi/state.py @@ -0,0 +1,21 @@ +# Copyright (C) 2023 Canonical, Ltd. +# Author: Lukas Märdian +# +# 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; version 3. +# +# 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 . + +from ._libnetplan import ffi, lib + +class State(): + def __init__(self): + state = lib.netplan_state_new() + print(lib.netplan_state_get_backend(state))