[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