[lxc-devel] [PATCH 2/2] build: Make setup.py run from srcdir to avoid distutils errors
Daniel Miranda
danielkza2 at gmail.com
Mon Aug 25 21:16:43 UTC 2014
distutils can't handle paths to source files containing '..'. It will
try to navigate away from the build directory and fail. To fix that,
before building the python module, transform all the path variables then
cd to the srcdir, and set the build directory manually.
This is hopefully the last needed fix to use separate build and
source diretories.
---
src/python-lxc/setup.py.in | 30 +++++++++++++++++++++++++-----
1 file changed, 25 insertions(+), 5 deletions(-)
diff --git a/src/python-lxc/setup.py.in b/src/python-lxc/setup.py.in
index 4304f75..b23ee07 100644
--- a/src/python-lxc/setup.py.in
+++ b/src/python-lxc/setup.py.in
@@ -21,15 +21,35 @@
# 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
-module = Extension('_lxc', sources=['@srcdir@/lxc.c'],
- include_dirs=['@top_builddir@/src', '@top_srcdir@/src'],
- library_dirs=['@top_builddir@/src/lxc'], libraries=['lxc'])
+# 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': '@srcdir@/lxc'},
- ext_modules=[module])
+ package_dir={'lxc': 'lxc'},
+ ext_modules=[module],
+ options={'build': {'build_base': os.path.join(builddir, 'build')}})
--
1.9.3
More information about the lxc-devel
mailing list