The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxc/pull/1031
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === This PR makes it possible to build python-lxc bindings without the rest of LXC source and build trees. Only public header and compiled library are required. Builds driven by automake should still work as they did before. This is the first step towards #392
From d51f78ed31f88c0d69def88eec38d76cef685b9e Mon Sep 17 00:00:00 2001 From: Aleksandr Mezin <mezin.alexan...@gmail.com> Date: Thu, 26 May 2016 16:03:57 +0600 Subject: [PATCH 1/5] python-lxc: don't use private lxc/namespace.h Signed-off-by: Aleksandr Mezin <mezin.alexan...@gmail.com> --- src/python-lxc/lxc.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/python-lxc/lxc.c b/src/python-lxc/lxc.c index 4f637d0..61c192c 100644 --- a/src/python-lxc/lxc.c +++ b/src/python-lxc/lxc.c @@ -26,10 +26,38 @@ #include "structmember.h" #include <lxc/lxccontainer.h> #include "lxc/utils.h" -#include "lxc/namespace.h" #include "lxc/confile.h" #include <stdio.h> #include <sys/wait.h> +#include <sched.h> + +/* + * CLONE_* definitions copied from lxc/namespace.h + */ +#ifndef CLONE_FS +# define CLONE_FS 0x00000200 +#endif +#ifndef CLONE_NEWNS +# define CLONE_NEWNS 0x00020000 +#endif +#ifndef CLONE_NEWCGROUP +# define CLONE_NEWCGROUP 0x02000000 +#endif +#ifndef CLONE_NEWUTS +# define CLONE_NEWUTS 0x04000000 +#endif +#ifndef CLONE_NEWIPC +# define CLONE_NEWIPC 0x08000000 +#endif +#ifndef CLONE_NEWUSER +# define CLONE_NEWUSER 0x10000000 +#endif +#ifndef CLONE_NEWPID +# define CLONE_NEWPID 0x20000000 +#endif +#ifndef CLONE_NEWNET +# define CLONE_NEWNET 0x40000000 +#endif /* Helper functions */ From 0fbd2f6a8976d27743a532ac6d7cbf384a4cb307 Mon Sep 17 00:00:00 2001 From: Aleksandr Mezin <mezin.alexan...@gmail.com> Date: Thu, 26 May 2016 16:07:28 +0600 Subject: [PATCH 2/5] python-lxc: don't use private lxc/utils.h Signed-off-by: Aleksandr Mezin <mezin.alexan...@gmail.com> --- src/python-lxc/lxc.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/python-lxc/lxc.c b/src/python-lxc/lxc.c index 61c192c..fbbabdb 100644 --- a/src/python-lxc/lxc.c +++ b/src/python-lxc/lxc.c @@ -25,7 +25,6 @@ #include <Python.h> #include "structmember.h" #include <lxc/lxccontainer.h> -#include "lxc/utils.h" #include "lxc/confile.h" #include <stdio.h> #include <sys/wait.h> @@ -61,6 +60,23 @@ /* Helper functions */ +/* Copied from lxc/utils.c */ +static int lxc_wait_for_pid_status(pid_t pid) +{ + int status, ret; + +again: + ret = waitpid(pid, &status, 0); + if (ret == -1) { + if (errno == EINTR) + goto again; + return -1; + } + if (ret != pid) + goto again; + return status; +} + char** convert_tuple_to_char_pointer_array(PyObject *argv) { int argc; From 58a44782d9a9a24c4f671526918fc58c74fad48c Mon Sep 17 00:00:00 2001 From: Aleksandr Mezin <mezin.alexan...@gmail.com> Date: Fri, 27 May 2016 15:13:18 +0600 Subject: [PATCH 3/5] python-lxc: don't use private lxc/confile.h Signed-off-by: Aleksandr Mezin <mezin.alexan...@gmail.com> --- src/python-lxc/lxc.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/python-lxc/lxc.c b/src/python-lxc/lxc.c index fbbabdb..b69116d 100644 --- a/src/python-lxc/lxc.c +++ b/src/python-lxc/lxc.c @@ -25,7 +25,6 @@ #include <Python.h> #include "structmember.h" #include <lxc/lxccontainer.h> -#include "lxc/confile.h" #include <stdio.h> #include <sys/wait.h> #include <sched.h> @@ -58,6 +57,10 @@ # define CLONE_NEWNET 0x40000000 #endif +/* From sys/personality.h */ +#define PER_LINUX 0x0000 +#define PER_LINUX32 0x0008 + /* Helper functions */ /* Copied from lxc/utils.c */ @@ -77,6 +80,36 @@ static int lxc_wait_for_pid_status(pid_t pid) return status; } +/* Copied from lxc/confile.c, with HAVE_SYS_PERSONALITY_H check removed */ +signed long lxc_config_parse_arch(const char *arch) +{ + struct per_name { + char *name; + unsigned long per; + } pername[] = { + { "x86", PER_LINUX32 }, + { "linux32", PER_LINUX32 }, + { "i386", PER_LINUX32 }, + { "i486", PER_LINUX32 }, + { "i586", PER_LINUX32 }, + { "i686", PER_LINUX32 }, + { "athlon", PER_LINUX32 }, + { "linux64", PER_LINUX }, + { "x86_64", PER_LINUX }, + { "amd64", PER_LINUX }, + }; + size_t len = sizeof(pername) / sizeof(pername[0]); + + size_t i; + + for (i = 0; i < len; i++) { + if (!strcmp(pername[i].name, arch)) + return pername[i].per; + } + + return -1; +} + char** convert_tuple_to_char_pointer_array(PyObject *argv) { int argc; From 00d98acd9fc067a590ef43d4c6eb02d567da923c Mon Sep 17 00:00:00 2001 From: Aleksandr Mezin <mezin.alexan...@gmail.com> Date: Fri, 27 May 2016 15:38:42 +0600 Subject: [PATCH 4/5] python-lxc: pass include/library dirs as arguments to setup.py Signed-off-by: Aleksandr Mezin <mezin.alexan...@gmail.com> --- .gitignore | 1 - configure.ac | 1 - src/python-lxc/Makefile.am | 14 ++++++++---- src/python-lxc/setup.py | 34 +++++++++++++++++++++++++++ src/python-lxc/setup.py.in | 57 ---------------------------------------------- 5 files changed, 43 insertions(+), 64 deletions(-) create mode 100644 src/python-lxc/setup.py delete mode 100644 src/python-lxc/setup.py.in diff --git a/.gitignore b/.gitignore index adc965e..a2a34e2 100644 --- a/.gitignore +++ b/.gitignore @@ -66,7 +66,6 @@ src/lxc/lxc-wait src/lxc/lxc-user-nic src/lxc/version.h -src/python-lxc/setup.py src/python-lxc/build/ src/python-lxc/lxc/__pycache__/ diff --git a/configure.ac b/configure.ac index 9475b0e..13820ef 100644 --- a/configure.ac +++ b/configure.ac @@ -847,7 +847,6 @@ AC_CONFIG_FILES([ src/lxc/lxc.functions src/lxc/version.h src/python-lxc/Makefile - src/python-lxc/setup.py src/lua-lxc/Makefile diff --git a/src/python-lxc/Makefile.am b/src/python-lxc/Makefile.am index 4a014df..cbb2747 100644 --- a/src/python-lxc/Makefile.am +++ b/src/python-lxc/Makefile.am @@ -6,21 +6,25 @@ else DISTSETUPOPTS= endif +INSTALL_OPTS := install --prefix=$(prefix) --no-compile $(DISTSETUPOPTS) +CALL_SETUP_PY := cd @srcdir@ && $(PYTHON) setup.py build -b @abs_builddir@/build + all: - $(PYTHON) setup.py build + $(CALL_SETUP_PY) build_ext -I @abs_top_srcdir@/src -L @abs_top_builddir@/src/lxc install: - if [ "$(DESTDIR)" = "" ]; then \ - $(PYTHON) setup.py install --prefix=$(prefix) --no-compile $(DISTSETUPOPTS); \ + if [ -z "$(DESTDIR)" ]; then \ + $(CALL_SETUP_PY) $(INSTALL_OPTS); \ else \ - $(PYTHON) setup.py install --root=$(DESTDIR) --prefix=$(prefix) --no-compile $(DISTSETUPOPTS); \ + $(CALL_SETUP_PY) $(INSTALL_OPTS) --root=$(DESTDIR); \ fi clean-local: - rm -rf build + rm -rf @builddir@/build endif EXTRA_DIST = \ + setup.py \ lxc.c \ lxc/__init__.py \ examples/api_test.py \ diff --git a/src/python-lxc/setup.py b/src/python-lxc/setup.py new file mode 100644 index 0000000..d8cb166 --- /dev/null +++ b/src/python-lxc/setup.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +# +# python-lxc: Python bindings for LXC +# +# (C) Copyright Canonical Ltd. 2012 +# +# Authors: +# Stéphane Graber <stgra...@ubuntu.com> +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 +# USA + +from distutils.core import setup, Extension + + +setup(name='_lxc', + version='0.1', + description='LXC', + packages=['lxc'], + package_dir={'lxc': 'lxc'}, + ext_modules=[Extension('_lxc', sources=['lxc.c'], libraries=['lxc'])], + ) diff --git a/src/python-lxc/setup.py.in b/src/python-lxc/setup.py.in deleted file mode 100644 index fcb676e..0000000 --- a/src/python-lxc/setup.py.in +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python3 -# -# python-lxc: Python bindings for LXC -# -# (C) Copyright Canonical Ltd. 2012 -# -# Authors: -# Stéphane Graber <stgra...@ubuntu.com> -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 -# USA - -import os, os.path -from distutils.core import setup, Extension - -# Distutils doesn't cope well with source files that have relative paths going -# up in the directory tree: it tries to navigate outside of the build dir and -# fails miserably. Therefore, we will instead cd to the source directory, -# run this script from there, but write the build products to the correct path. -# -# Since we will be changing directories before building, we must transform -# all the path variables to their forms relative to srcdir. - -srcdir, builddir, top_srcdir, top_builddir = map(os.path.abspath, - ["@srcdir@", "@builddir@", "@top_srcdir@", "@top_builddir@"]) - -builddir, top_srcdir, top_builddir = map(lambda d: os.path.relpath(d, srcdir), - [builddir, top_srcdir, top_builddir]) - -os.chdir(srcdir) - -module = Extension('_lxc', sources=['lxc.c'], - include_dirs=[os.path.join(top_srcdir, 'src'), - os.path.join(top_builddir, 'src')], - library_dirs=[os.path.join(top_builddir, 'src/lxc')], - libraries=['lxc']) - - -setup(name='_lxc', - version='0.1', - description='LXC', - packages=['lxc'], - package_dir={'lxc': 'lxc'}, - ext_modules=[module], - options={'build': {'build_base': os.path.join(builddir, 'build')}}) From bc5822447b70839757e88b81a91c73ec10a05f1a Mon Sep 17 00:00:00 2001 From: Aleksandr Mezin <mezin.alexan...@gmail.com> Date: Fri, 27 May 2016 17:58:15 +0600 Subject: [PATCH 5/5] python-lxc: search for lxc library and headers using pkg-config Signed-off-by: Aleksandr Mezin <mezin.alexan...@gmail.com> --- src/python-lxc/Makefile.am | 2 +- src/python-lxc/setup.py | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/python-lxc/Makefile.am b/src/python-lxc/Makefile.am index cbb2747..4a2b86e 100644 --- a/src/python-lxc/Makefile.am +++ b/src/python-lxc/Makefile.am @@ -10,7 +10,7 @@ INSTALL_OPTS := install --prefix=$(prefix) --no-compile $(DISTSETUPOPTS) CALL_SETUP_PY := cd @srcdir@ && $(PYTHON) setup.py build -b @abs_builddir@/build all: - $(CALL_SETUP_PY) build_ext -I @abs_top_srcdir@/src -L @abs_top_builddir@/src/lxc + $(CALL_SETUP_PY) build_ext -I @abs_top_srcdir@/src -L @abs_top_builddir@/src/lxc --no-pkg-config install: if [ -z "$(DESTDIR)" ]; then \ diff --git a/src/python-lxc/setup.py b/src/python-lxc/setup.py index d8cb166..bbbb764 100644 --- a/src/python-lxc/setup.py +++ b/src/python-lxc/setup.py @@ -22,7 +22,44 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 # USA +import os +import subprocess + from distutils.core import setup, Extension +from distutils.command.build_ext import build_ext as BuildExtCommand + + +class LxcBuildExtCommand(BuildExtCommand): + user_options = BuildExtCommand.user_options + [ + ('no-pkg-config', None, + "don't use pkg-config to detect include/library paths") + ] + + def initialize_options(self): + super(LxcBuildExtCommand, self).initialize_options() + self.no_pkg_config = False + + def build_extensions(self): + if not self.no_pkg_config: + pkg_config_executable = os.environ.get('PKG_CONFIG_EXECUTABLE', + 'pkg-config') + + def get_pkg_config_var(name): + return subprocess.check_output([pkg_config_executable, + '--variable', name, 'lxc'], + universal_newlines=True) + + try: + includedir = get_pkg_config_var('includedir') + libdir = get_pkg_config_var('libdir') + + self.compiler.add_include_dir(includedir) + self.compiler.add_library_dir(libdir) + + except subprocess.CalledProcessError: + pass + + super(LxcBuildExtCommand, self).build_extensions() setup(name='_lxc', @@ -31,4 +68,5 @@ packages=['lxc'], package_dir={'lxc': 'lxc'}, ext_modules=[Extension('_lxc', sources=['lxc.c'], libraries=['lxc'])], + cmdclass={'build_ext': LxcBuildExtCommand}, )
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel