From fe3de315ed7ce24c49756af4ebdaa6b88f86a12d Mon Sep 17 00:00:00 2001 From: Modestas Vainius Date: Mon, 15 Jun 2009 15:58:31 +0300 Subject: Fix build directory handling in python_distutils build system. * Apparently, Distutils does out of source tree building by default. * Default build directory is "$srcdir/build". * --build-base command line option is ineffective (some even fail) unless it is passed to the "build" command. However, if build-base is set in the config file, all setup.py commands use it (build, install and clean). That's a big flaw in Distutils design but it has been like this for a long time. Therefore write a custom distutils cfg file in the build directory to make build-base work. The best choice for config file path is $HOME/.pydistutils.cfg (one of the paths Distutils reads) and setting $HOME to the build directory. Signed-off-by: Modestas Vainius --- Debian/Debhelper/Buildsystem/python_distutils.pm | 67 ++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 4 deletions(-) (limited to 'Debian') diff --git a/Debian/Debhelper/Buildsystem/python_distutils.pm b/Debian/Debhelper/Buildsystem/python_distutils.pm index bfb76eea..26411736 100644 --- a/Debian/Debhelper/Buildsystem/python_distutils.pm +++ b/Debian/Debhelper/Buildsystem/python_distutils.pm @@ -8,24 +8,77 @@ package Debian::Debhelper::Buildsystem::python_distutils; use strict; +use Cwd (); +use Debian::Debhelper::Dh_Lib qw(error); use base 'Debian::Debhelper::Buildsystem'; sub DESCRIPTION { "Python distutils" } +sub DEFAULT_BUILD_DIRECTORY { + my $this=shift; + return $this->_canonpath($this->get_sourcepath("build")); +} + +sub new { + my $class=shift; + my $this=$class->SUPER::new(@_); + my %args=@_; + # Out of source tree building is prefered. + $this->enforce_out_of_source_building($args{builddir}); + return $this; +} + sub check_auto_buildable { my $this=shift; return -e $this->get_sourcepath("setup.py"); } -sub setup_py { +sub not_our_cfg { my $this=shift; - my $act=shift; + my $ret; + if (open(my $cfg, $this->get_buildpath(".pydistutils.cfg"))) { + $ret = not "# Created by dh_auto\n" eq <$cfg>; + close DISTUTILSCFG; + } + return $ret; +} - if ($this->get_builddir()) { - unshift @_, "--build-base=" . $this->get_build_rel2sourcedir(); +sub create_cfg { + my $this=shift; + if (open(my $cfg, ">", $this->get_buildpath(".pydistutils.cfg"))) { + print $cfg "# Created by dh_auto", "\n"; + print $cfg "[build]\nbuild-base=", $this->get_build_rel2sourcedir(), "\n"; + close $cfg; + return 1; } + return 0; +} + +sub pre_building_step { + my $this=shift; + my $step=shift; + + return unless grep /$step/, qw(build install clean); + + # --build-base can only be passed to the build command. However, + # it is always read from the config file (really weird design). + # Therefore create such a cfg config file. + if ($this->get_buildpath() ne $this->DEFAULT_BUILD_DIRECTORY()) { + not $this->not_our_cfg() or + error("cannot set custom build directory: .pydistutils.cfg is in use"); + $this->mkdir_builddir(); + $this->create_cfg() or + error("cannot set custom build directory: unwritable .pydistutils.cfg"); + # Distutils reads $HOME/.pydistutils.cfg + $ENV{HOME} = Cwd::abs_path($this->get_buildpath()); + } +} + +sub setup_py { + my $this=shift; + my $act=shift; $this->doit_in_sourcedir("python", "setup.py", $act, @_); } @@ -43,6 +96,12 @@ sub install { sub clean { my $this=shift; $this->setup_py("clean", "-a", @_); + + # Config file will remain if it was created by us + if (!$this->not_our_cfg()) { + unlink($this->get_buildpath(".pydistutils.cfg")); + $this->rmdir_builddir(1); # only if empty + } # The setup.py might import files, leading to python creating pyc # files. $this->doit_in_sourcedir('find', '.', '-name', '*.pyc', '-exec', 'rm', '{}', ';'); -- cgit v1.2.3