From 9e43ff821c1549d5813eebd5a9ca81a7869786e7 Mon Sep 17 00:00:00 2001 From: Milton Woods Date: Fri, 31 Mar 2017 09:38:58 +1000 Subject: Extendable Perl (#3614) * perl: make extendable and add Module::Build package * perl: allow 'spack create' to identify perl packages from their contents * perl-module-build: fix indenting of package docstring * perl: split install() method for extensions into phases * perl: auto-detect build method (Makefile.PL vs Build.PL) and define a 'check' method * PerlPackage: use import statements similar to those in AutotoolsPackage * PerlModule: fix detection of Build.PL * PerlPackageTemplate: remove extraneous lines to avoid flake8 warnings * PerlPackageTemplate: split into separate templates for Makefile.PL and Build.PL * PerlPackage: add cross-references to docstrings * AutotoolsPackage: fix ambiguous cross-references to avoid errors in doc tests * PerlbuildPackageTemplate: depend on perl-module-build if Build.PL exists --- .../builtin/packages/perl-module-build/package.py | 41 ++++++++++++++++++++ var/spack/repos/builtin/packages/perl/package.py | 45 +++++++++++++++++++++- 2 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 var/spack/repos/builtin/packages/perl-module-build/package.py (limited to 'var') diff --git a/var/spack/repos/builtin/packages/perl-module-build/package.py b/var/spack/repos/builtin/packages/perl-module-build/package.py new file mode 100644 index 0000000000..cccc5d7b5a --- /dev/null +++ b/var/spack/repos/builtin/packages/perl-module-build/package.py @@ -0,0 +1,41 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the LICENSE file for our notice and the LGPL. +# +# This program 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) version 2.1, February 1999. +# +# This program 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 terms and +# conditions of 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 program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +# +from spack import * + + +class PerlModuleBuild(PerlPackage): + """Module::Build is a system for building, testing, and installing Perl + modules. It is meant to be an alternative to ExtUtils::MakeMaker. + Developers may alter the behavior of the module through subclassing in a + much more straightforward way than with MakeMaker. It also does not + require a make on your system - most of the Module::Build code is + pure-perl and written in a very cross-platform way. + """ + + homepage = "http://search.cpan.org/perldoc/Module::Build" + url = "http://search.cpan.org/CPAN/authors/id/L/LE/LEONT/Module-Build-0.4220.tar.gz" + + version('0.4220', '9df204e188462a4410d496f316c2c531') diff --git a/var/spack/repos/builtin/packages/perl/package.py b/var/spack/repos/builtin/packages/perl/package.py index 4bacad427b..b8874c124e 100644 --- a/var/spack/repos/builtin/packages/perl/package.py +++ b/var/spack/repos/builtin/packages/perl/package.py @@ -23,6 +23,8 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## # +# Author: Milton Woods +# Date: March 22, 2017 # Author: George Hartzell # Date: July 21, 2016 # Author: Justin Too @@ -36,7 +38,7 @@ class Perl(Package): # Perl doesn't use Autotools, it should subclass Package 27 years of development.""" homepage = "http://www.perl.org" # URL must remain http:// so Spack can bootstrap curl - url = "http://www.cpan.org/src/5.0/perl-5.24.1.tar.gz" + url = "http://www.cpan.org/src/5.0/perl-5.24.1.tar.gz" version('5.24.1', '765ef511b5b87a164e2531403ee16b3c') version('5.24.0', 'c5bf7f3285439a2d3b6a488e14503701') @@ -46,6 +48,8 @@ class Perl(Package): # Perl doesn't use Autotools, it should subclass Package # https://rt.perl.org/Public/Bug/Display.html?id=123784 # version('5.18.4' , '1f9334ff730adc05acd3dd7130d295db') + extendable = True + # Installing cpanm alongside the core makes it safe and simple for # people/projects to install their own sets of perl modules. Not # having it in core increases the "energy of activation" for doing @@ -80,3 +84,42 @@ class Perl(Package): # Perl doesn't use Autotools, it should subclass Package perl('Makefile.PL') make() make('install') + + def setup_environment(self, spack_env, run_env): + """Set PERL5LIB to support activation of Perl packages""" + run_env.set('PERL5LIB', join_path(self.prefix, 'lib', 'perl5')) + + def setup_dependent_environment(self, spack_env, run_env, extension_spec): + """Set PATH and PERL5LIB to include the extension and + any other perl extensions it depends on, + assuming they were installed with INSTALL_BASE defined.""" + perl_lib_dirs = [] + perl_bin_dirs = [] + for d in extension_spec.traverse( + deptype=('build', 'run'), deptype_query='run'): + if d.package.extends(self.spec): + perl_lib_dirs.append(join_path(d.prefix, 'lib', 'perl5')) + perl_bin_dirs.append(join_path(d.prefix, 'bin')) + perl_bin_path = ':'.join(perl_bin_dirs) + perl_lib_path = ':'.join(perl_lib_dirs) + spack_env.prepend_path('PATH', perl_bin_path) + spack_env.prepend_path('PERL5LIB', perl_lib_path) + run_env.prepend_path('PATH', perl_bin_path) + run_env.prepend_path('PERL5LIB', perl_lib_path) + + def setup_dependent_package(self, module, ext_spec): + """Called before perl modules' install() methods. + In most cases, extensions will only need to have one line: + perl('Makefile.PL','INSTALL_BASE=%s' % self.prefix) + """ + + # perl extension builds can have a global perl executable function + module.perl = Executable(join_path(self.spec.prefix.bin, 'perl')) + + # Add variables for library directory + module.perl_lib_dir = join_path(ext_spec.prefix, 'lib', 'perl5') + + # Make the site packages directory for extensions, + # if it does not exist already. + if ext_spec.package.is_extension: + mkdirp(module.perl_lib_dir) -- cgit v1.2.3-70-g09d2