From 9dd56913a39799c4aec05584382db353d52a8d65 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Mon, 20 Feb 2017 20:09:03 -0600 Subject: [PATCH] Fix setuptools bootstrapping now that dependencies are no longer vendored (#3198) * Fix setuptools bootstrapping now that dependencies are no longer vendored * Reorder patch and comments * Use exact same patch as https://github.com/ActiveState/appdirs/pull/84 * Use exact same patch as https://sourceforge.net/p/pyparsing/patches/10/ --- .../builtin/packages/py-appdirs/package.py | 44 ++++++++++++++++++ .../py-appdirs/setuptools-import.patch | 17 +++++++ .../builtin/packages/py-packaging/package.py | 45 +++++++++++++++++++ .../builtin/packages/py-pyparsing/package.py | 14 +++++- .../py-pyparsing/setuptools-import.patch | 20 +++++++++ .../builtin/packages/py-setuptools/package.py | 9 ++++ .../repos/builtin/packages/py-six/package.py | 9 +++- 7 files changed, 154 insertions(+), 4 deletions(-) create mode 100644 var/spack/repos/builtin/packages/py-appdirs/package.py create mode 100644 var/spack/repos/builtin/packages/py-appdirs/setuptools-import.patch create mode 100644 var/spack/repos/builtin/packages/py-packaging/package.py create mode 100644 var/spack/repos/builtin/packages/py-pyparsing/setuptools-import.patch diff --git a/var/spack/repos/builtin/packages/py-appdirs/package.py b/var/spack/repos/builtin/packages/py-appdirs/package.py new file mode 100644 index 00000000000000..360f56d98737af --- /dev/null +++ b/var/spack/repos/builtin/packages/py-appdirs/package.py @@ -0,0 +1,44 @@ +############################################################################## +# 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 PyAppdirs(PythonPackage): + """A small Python module for determining appropriate platform-specific + dirs, e.g. a "user data dir".""" + + homepage = "https://github.com/ActiveState/appdirs" + url = "https://pypi.io/packages/source/a/appdirs/appdirs-1.4.0.tar.gz" + + version('1.4.0', '1d17b4c9694ab84794e228f28dc3275b') + + patch('setuptools-import.patch', when='@:1.4.0') + + # Newer versions of setuptools require appdirs. Although setuptools is an + # optional dependency of appdirs, if it is not found, setup.py will + # fallback on distutils.core instead. Don't add a setuptools dependency + # or we won't be able to bootstrap setuptools. + + # depends_on('py-setuptools', type='build') diff --git a/var/spack/repos/builtin/packages/py-appdirs/setuptools-import.patch b/var/spack/repos/builtin/packages/py-appdirs/setuptools-import.patch new file mode 100644 index 00000000000000..0b0eb4b84abcbd --- /dev/null +++ b/var/spack/repos/builtin/packages/py-appdirs/setuptools-import.patch @@ -0,0 +1,17 @@ +diff --git a/setup.py b/setup.py +index ccd1e72..5d907aa 100644 +--- a/setup.py ++++ b/setup.py +@@ -2,7 +2,12 @@ + import sys + import os + import os.path +-from setuptools import setup ++# appdirs is a dependency of setuptools, so allow installing without it. ++try: ++ from setuptools import setup ++except ImportError: ++ from distutils.core import setup + import appdirs + + tests_require = [] diff --git a/var/spack/repos/builtin/packages/py-packaging/package.py b/var/spack/repos/builtin/packages/py-packaging/package.py new file mode 100644 index 00000000000000..506bb6f976e84e --- /dev/null +++ b/var/spack/repos/builtin/packages/py-packaging/package.py @@ -0,0 +1,45 @@ +############################################################################## +# 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 PyPackaging(PythonPackage): + """Core utilities for Python packages.""" + + homepage = "https://github.com/pypa/packaging" + url = "https://pypi.io/packages/source/p/packaging/packaging-16.8.tar.gz" + + version('16.8', '53895cdca04ecff80b54128e475b5d3b') + + # Not needed for the installation, but used at runtime + depends_on('py-six', type='run') + depends_on('py-pyparsing', type='run') + + # Newer versions of setuptools require packaging. Although setuptools is an + # optional dependency of packaging, if it is not found, setup.py will + # fallback on distutils.core instead. Don't add a setuptools dependency + # or we won't be able to bootstrap setuptools. + + # depends_on('py-setuptools', type='build') diff --git a/var/spack/repos/builtin/packages/py-pyparsing/package.py b/var/spack/repos/builtin/packages/py-pyparsing/package.py index cb158a76d69a1c..936295a132c097 100644 --- a/var/spack/repos/builtin/packages/py-pyparsing/package.py +++ b/var/spack/repos/builtin/packages/py-pyparsing/package.py @@ -28,6 +28,16 @@ class PyPyparsing(PythonPackage): """A Python Parsing Module.""" homepage = "https://pypi.python.org/pypi/pyparsing" - url = "https://pypi.python.org/packages/source/p/pyparsing/pyparsing-2.0.3.tar.gz" + url = "https://pypi.io/packages/source/p/pyparsing/pyparsing-2.0.3.tar.gz" - version('2.0.3', '0fe479be09fc2cf005f753d3acc35939') + version('2.1.10', '065908b92904e0d3634eb156f44cc80e') + version('2.0.3', '0fe479be09fc2cf005f753d3acc35939') + + patch('setuptools-import.patch', when='@:2.1.10') + + # Newer versions of setuptools require pyparsing. Although setuptools is an + # optional dependency of pyparsing, if it is not found, setup.py will + # fallback on distutils.core instead. Don't add a setuptools dependency + # or we won't be able to bootstrap setuptools. + + # depends_on('py-setuptools', type='build') diff --git a/var/spack/repos/builtin/packages/py-pyparsing/setuptools-import.patch b/var/spack/repos/builtin/packages/py-pyparsing/setuptools-import.patch new file mode 100644 index 00000000000000..a4ba828c23f4b2 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-pyparsing/setuptools-import.patch @@ -0,0 +1,20 @@ +diff --git a/setup.py b/setup.py +index 82061c6..ff342af 100644 +--- a/setup.py ++++ b/setup.py +@@ -1,7 +1,13 @@ + #!/usr/bin/env python + + """Setup script for the pyparsing module distribution.""" +-from setuptools import setup ++ ++# Setuptools depends on pyparsing (via packaging) as of version 34, so allow ++# installing without it to avoid bootstrap problems. ++try: ++ from setuptools import setup ++except ImportError: ++ from distutils.core import setup + + import sys + import os + diff --git a/var/spack/repos/builtin/packages/py-setuptools/package.py b/var/spack/repos/builtin/packages/py-setuptools/package.py index 38b316861e2c3b..c4f0ce9802a8a2 100644 --- a/var/spack/repos/builtin/packages/py-setuptools/package.py +++ b/var/spack/repos/builtin/packages/py-setuptools/package.py @@ -42,3 +42,12 @@ class PySetuptools(PythonPackage): version('18.1', 'f72e87f34fbf07f299f6cb46256a0b06') version('16.0', '0ace0b96233516fc5f7c857d086aa3ad') version('11.3.1', '01f69212e019a2420c1693fb43593930') + + depends_on('python@2.6:2.7,3.3:') + + # Previously, setuptools vendored all of its dependencies to allow + # easy bootstrapping. As of version 34.0.0, this is no longer done + # and the dependencies need to be installed externally. + depends_on('py-packaging@16.8:', when='@34.0.0:', type=('build', 'run')) + depends_on('py-six@1.6.0:', when='@34.0.0:', type=('build', 'run')) + depends_on('py-appdirs@1.4.0:', when='@34.0.0:', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/py-six/package.py b/var/spack/repos/builtin/packages/py-six/package.py index 7d653fd102c432..b2faad3819cb31 100644 --- a/var/spack/repos/builtin/packages/py-six/package.py +++ b/var/spack/repos/builtin/packages/py-six/package.py @@ -29,11 +29,16 @@ class PySix(PythonPackage): """Python 2 and 3 compatibility utilities.""" homepage = "https://pypi.python.org/pypi/six" - url = "https://pypi.python.org/packages/source/s/six/six-1.9.0.tar.gz" + url = "https://pypi.io/packages/source/s/six/six-1.9.0.tar.gz" version('1.10.0', '34eed507548117b2ab523ab14b2f8b55') version('1.9.0', '476881ef4012262dfc8adc645ee786c4') extends('python', ignore=r'bin/pytest') - depends_on('py-setuptools', type='build') + # Newer versions of setuptools require six. Although setuptools is an + # optional dependency of six, if it is not found, setup.py will fallback + # on distutils.core instead. Don't add a setuptools dependency or we + # won't be able to bootstrap setuptools. + + # depends_on('py-setuptools', type='build')