From 7eb263effe3ac6f2f79e4f6c060b7ae96b7a9cc8 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 4 Aug 2017 16:52:10 -0500 Subject: Add a SConsPackage base class (#4936) * Add a SConsPackage base class * Make Matlab extendable * Most dependencies are actually required * Cantera requires older version of fmt --- lib/spack/docs/packaging_guide.rst | 3 ++ lib/spack/spack/__init__.py | 2 + lib/spack/spack/build_systems/scons.py | 92 ++++++++++++++++++++++++++++++++++ lib/spack/spack/cmd/build.py | 1 + lib/spack/spack/cmd/create.py | 13 +++-- 5 files changed, 104 insertions(+), 7 deletions(-) create mode 100644 lib/spack/spack/build_systems/scons.py (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index 5d7d69e3d7..af3f7b408a 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -2121,6 +2121,9 @@ The classes that are currently provided by Spack are: | :py:class:`.QMakePackage` | Specialized class for packages | | | build using QMake | +-------------------------------+----------------------------------+ + | :py:class:`.SConsPackage` | Specialized class for packages | + | | built using SCons | + +-------------------------------+----------------------------------+ | :py:class:`.WafPackage` | Specialized class for packages | | | built using Waf | +-------------------------------+----------------------------------+ diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index aca906f2e9..e8a010bb26 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -173,6 +173,7 @@ from spack.build_systems.makefile import MakefilePackage from spack.build_systems.autotools import AutotoolsPackage from spack.build_systems.cmake import CMakePackage from spack.build_systems.qmake import QMakePackage +from spack.build_systems.scons import SConsPackage from spack.build_systems.waf import WafPackage from spack.build_systems.python import PythonPackage from spack.build_systems.r import RPackage @@ -187,6 +188,7 @@ __all__ += [ 'AutotoolsPackage', 'CMakePackage', 'QMakePackage', + 'SConsPackage', 'WafPackage', 'PythonPackage', 'RPackage', diff --git a/lib/spack/spack/build_systems/scons.py b/lib/spack/spack/build_systems/scons.py new file mode 100644 index 0000000000..694ed936cc --- /dev/null +++ b/lib/spack/spack/build_systems/scons.py @@ -0,0 +1,92 @@ +############################################################################## +# 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 NOTICE and LICENSE files 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 +############################################################################## + +import inspect + +from spack.directives import depends_on +from spack.package import PackageBase, run_after + + +class SConsPackage(PackageBase): + """Specialized class for packages built using SCons. + + See http://scons.org/documentation.html for more information. + + This class provides the following phases that can be overridden: + + 1. :py:meth:`~.SConsPackage.build` + 2. :py:meth:`~.SConsPackage.install` + + Packages that use SCons as a build system are less uniform than packages + that use other build systems. Developers can add custom subcommands or + variables that control the build. You will likely need to override + :py:meth:`~.SConsPackage.build_args` to pass the appropriate variables. + """ + #: Phases of a SCons package + phases = ['build', 'install'] + + #: To be used in UI queries that require to know which + #: build-system class we are using + build_system_class = 'SConsPackage' + + #: Callback names for build-time test + build_time_test_callbacks = ['test'] + + depends_on('scons', type='build') + + def build_args(self, spec, prefix): + """Arguments to pass to build.""" + return [] + + def build(self, spec, prefix): + """Build the package.""" + args = self.build_args(spec, prefix) + + inspect.getmodule(self).scons(*args) + + def install_args(self, spec, prefix): + """Arguments to pass to install.""" + return [] + + def install(self, spec, prefix): + """Install the package.""" + args = self.install_args(spec, prefix) + + inspect.getmodule(self).scons('install', *args) + + # Testing + + def test(self): + """Run unit tests after build. + + By default, does nothing. Override this if you want to + add package-specific tests. + """ + pass + + run_after('build')(PackageBase._run_default_build_time_test_callbacks) + + # Check that self.prefix is there after installation + run_after('install')(PackageBase.sanity_check_prefix) diff --git a/lib/spack/spack/cmd/build.py b/lib/spack/spack/cmd/build.py index 8ecaca9c12..a4821214d6 100644 --- a/lib/spack/spack/cmd/build.py +++ b/lib/spack/spack/cmd/build.py @@ -35,6 +35,7 @@ build_system_to_phase = { AutotoolsPackage: 'build', CMakePackage: 'build', QMakePackage: 'build', + SConsPackage: 'build', WafPackage: 'build', PythonPackage: 'build', PerlPackage: 'build', diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index d8507d1108..ca49eb03fa 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -208,15 +208,14 @@ class QMakePackageTemplate(PackageTemplate): class SconsPackageTemplate(PackageTemplate): """Provides appropriate overrides for SCons-based packages""" - dependencies = """\ - # FIXME: Add additional dependencies if required. - depends_on('scons', type='build')""" + base_class_name = 'SConsPackage' body = """\ - def install(self, spec, prefix): - # FIXME: Add logic to build and install here. - scons('prefix={0}'.format(prefix)) - scons('install')""" + def build_args(self, spec, prefix): + # FIXME: Add arguments to pass to build. + # FIXME: If not needed delete this function + args = [] + return args""" class WafPackageTemplate(PackageTemplate): -- cgit v1.2.3-70-g09d2