lib/Debian/Debhelper/Buildsystem/dh_virtualenv.pm (144 lines of code) (raw):

package Debian::Debhelper::Buildsystem::dh_virtualenv; use strict; use base 'Debian::Debhelper::Buildsystem'; use Debian::Debhelper::Dh_Lib; use File::Spec; sub DESCRIPTION { 'Python Virtualenv'; } sub DEFAULT_BUILD_DIRECTORY { my $this=shift; return $this->canonpath($this->get_sourcepath("build")); } sub check_auto_buildable { my $this=shift; return -e $this->get_sourcepath("setup.py") ? 1 : 0; } sub new { my $class = shift; my $this = $class->SUPER::new(@_); $this->prefer_out_of_source_building(); return $this; } sub get_install_root { my $prefix = "/usr/share/python"; if (defined $ENV{DH_VIRTUALENV_INSTALL_ROOT}) { $prefix = $ENV{DH_VIRTUALENV_INSTALL_ROOT}; } return $prefix; } sub get_venv_builddir { my $this = shift; my $builddir = $this->get_builddir(); my $virtualenv_name = $ENV{DH_VIRTUALENV_INSTALL_SUFFIX} || $this->sourcepackage(); my $prefix = $this->get_install_root(); return "$builddir$prefix/$virtualenv_name"; } sub get_exec { my $this = shift; my $executable = shift; my $builddir = $this->get_venv_builddir(); return "$builddir/bin/$executable"; } sub get_python { my $this = shift; return $this->get_exec("python"); } sub get_pip { my $this = shift; return ($this->get_exec("python"), "-m", "pip"); } sub configure { my $this = shift; doit('mkdir', '-p', $this->get_venv_builddir()); } sub build { my $this = shift; my $sourcedir = $this->get_sourcedir(); my $builddir = $this->get_venv_builddir(); my @params = (); my $reqfile = ('requirements.txt'); my @pipargs = (); if (defined $ENV{DH_VIRTUALENV_ARGUMENTS}) { @params = split(' ', $ENV{DH_VIRTUALENV_ARGUMENTS}); } if (defined $ENV{DH_REQUIREMENTS_FILE}) { $reqfile = $ENV{DH_REQUIREMENTS_FILE}; } if (defined $ENV{DH_PIP_EXTRA_ARGS}) { @pipargs = split(' ', $ENV{DH_PIP_EXTRA_ARGS}); } $this->doit_in_builddir( 'virtualenv', @params, Cwd::abs_path($builddir)); my $python = $this->get_python(); my @pip = $this->get_pip(); if (defined $ENV{DH_UPGRADE_PIP}) { my $version = length $ENV{DH_UPGRADE_PIP} && '=='.$ENV{DH_UPGRADE_PIP} || ''; $this->doit_in_sourcedir( @pip, 'install', '-U', 'pip' . $version, @pipargs); } if (defined $ENV{DH_UPGRADE_SETUPTOOLS}) { my $version = length $ENV{DH_UPGRADE_SETUPTOOLS} && '=='.$ENV{DH_UPGRADE_SETUPTOOLS} || ''; $this->doit_in_sourcedir( @pip, 'install', '-U', 'setuptools' . $version, @pipargs); } if (defined $ENV{DH_UPGRADE_WHEEL}) { my $version = length $ENV{DH_UPGRADE_WHEEL} && '=='.$ENV{DH_UPGRADE_WHEEL} || ''; $this->doit_in_sourcedir( @pip, 'install', '-U', 'wheel' . $version, @pipargs); } $this->doit_in_sourcedir( @pip, 'install', '-r', $reqfile, @pipargs); } sub test { my $this = shift; my $python = $this->get_python(); $this->doit_in_sourcedir( $python, 'setup.py', 'test'); } sub install { my $this = shift; my $destdir = shift; my @pip = $this->get_pip(); my $python = $this->get_python(); my $sourcepackage = $this->sourcepackage(); my $venv = $this->get_venv_builddir(); my $prefix = $this->get_install_root(); $this->doit_in_sourcedir( @pip, 'install', '.'); # Before we copy files, let's make the symlinks in the 'usr/local' # relative to the build path. my @files_in_local = <"$venv/local/*">; foreach (@files_in_local) { if ( -l $_ ) { my $target = readlink; my $relpath = File::Spec->abs2rel($target, "$venv/local"); my $basename = Debian::Debhelper::Dh_Lib->basename($_); unlink; symlink($relpath, $_); } } $this->doit_in_builddir('mkdir', '-p', $destdir); $this->doit_in_builddir('cp', '-r', '-T', '.', $destdir); my $new_python = undef; my @binaries = undef; if (defined $ENV{DH_VIRTUALENV_INSTALL_SUFFIX}) { $new_python = "$prefix/" . $ENV{DH_VIRTUALENV_INSTALL_SUFFIX} . "/bin/python"; my $curdir = "$destdir$prefix/" . $ENV{DH_VIRTUALENV_INSTALL_SUFFIX} . "/bin/*"; @binaries = glob($curdir); } else { $new_python = "$prefix/$sourcepackage/bin/python"; @binaries = <"$destdir$prefix/$sourcepackage/bin/*">; } # Fix shebangs so that we use the Python in the final location # instead of the Python in the build directory { local $^I = q{}; local @ARGV = grep { -T } @binaries; while ( <> ) { s|^#!.*bin/(env )?python|#!$new_python|; print; } } } sub clean { my $this = shift; $this->rmdir_builddir(); } 1