summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew LeGendre <legendre1@llnl.gov>2015-10-05 11:30:48 -0700
committerMatthew LeGendre <legendre1@llnl.gov>2015-10-05 11:37:36 -0700
commit18f0b24a7f21ec7b46510f45867386b7600bbc55 (patch)
tree989fa787e465ad2c72945acfa33e12d4c00a5ea8
parente4d2ba30b57618da388a1a990381d149b33d7aba (diff)
downloadspack-18f0b24a7f21ec7b46510f45867386b7600bbc55.tar.gz
spack-18f0b24a7f21ec7b46510f45867386b7600bbc55.tar.bz2
spack-18f0b24a7f21ec7b46510f45867386b7600bbc55.tar.xz
spack-18f0b24a7f21ec7b46510f45867386b7600bbc55.zip
Add tests for spack external dependencies, plus fixes for issues found by those tests.
-rw-r--r--lib/spack/spack/concretize.py9
-rw-r--r--lib/spack/spack/spec.py2
-rw-r--r--lib/spack/spack/test/concretize.py28
-rw-r--r--var/spack/mock_configs/site_spackconfig/packages.yaml13
-rw-r--r--var/spack/mock_packages/externalprereq/package.py34
-rw-r--r--var/spack/mock_packages/externaltest/package.py37
-rw-r--r--var/spack/mock_packages/externaltool/package.py36
-rw-r--r--var/spack/mock_packages/externalvirtual/package.py37
8 files changed, 191 insertions, 5 deletions
diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py
index 01ff163493..c27a023136 100644
--- a/lib/spack/spack/concretize.py
+++ b/lib/spack/spack/concretize.py
@@ -85,8 +85,8 @@ class DefaultConcretizer(object):
provider_cmp = partial(spack.pkgsort.provider_compare, spec_w_preferred_providers.name, spec.name)
packages = sorted(providers, cmp=provider_cmp)
else:
- if not spec_externals(spec) or spec.external:
- return None
+ if spec.external:
+ return False
packages = [spec]
# For each candidate package, if it has externals add those to the candidates
@@ -129,7 +129,7 @@ class DefaultConcretizer(object):
#Try a looser ABI matching
candidate = next((c for c in candidates if spack.abi.compatible(c[0], other_spec, loose=True)), None)
if not candidate:
- #Pick the first choice
+ #No ABI matches. Pick the top choice based on the orignal preferences.
candidate = candidates[0]
external = candidate[1]
candidate_spec = candidate[0]
@@ -144,10 +144,11 @@ class DefaultConcretizer(object):
if not spec.external and external:
spec.external = external
changed = True
+
#If we're external then trim the dependencies
if external and spec.dependencies:
changed = True
- spec.depencencies = DependencyMap()
+ spec.dependencies = DependencyMap()
return changed
diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py
index 6984b4a174..49b67cd361 100644
--- a/lib/spack/spack/spec.py
+++ b/lib/spack/spack/spec.py
@@ -1022,7 +1022,7 @@ class Spec(object):
# if we descend into a virtual spec, there's nothing more
# to normalize. Concretize will finish resolving it later.
- if self.virtual:
+ if self.virtual or self.external:
return False
# Combine constraints from package deps with constraints from
diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py
index b3a77d076a..f81a2f5af8 100644
--- a/lib/spack/spack/test/concretize.py
+++ b/lib/spack/spack/test/concretize.py
@@ -192,3 +192,31 @@ class ConcretizeTest(MockPackagesTest):
# TODO: not exactly the syntax I would like.
self.assertTrue(spec['libdwarf'].compiler.satisfies('clang'))
self.assertTrue(spec['libelf'].compiler.satisfies('clang'))
+
+
+ def test_external_package(self):
+ spec = Spec('externaltool')
+ spec.concretize()
+
+ self.assertEqual(spec['externaltool'].external, '/path/to/external_tool')
+ self.assertFalse('externalprereq' in spec)
+ self.assertTrue(spec['externaltool'].compiler.satisfies('gcc'))
+
+
+ def test_nobuild_package(self):
+ got_error = False
+ spec = Spec('externaltool%clang')
+ try:
+ spec.concretize()
+ except spack.concretize.NoBuildError:
+ got_error = True
+ self.assertTrue(got_error)
+
+
+ def test_external_and_virtual(self):
+ spec = Spec('externaltest')
+ spec.concretize()
+ self.assertTrue(spec['externaltool'].external, '/path/to/external_tool')
+ self.assertTrue(spec['stuff'].external, '/path/to/external_virtual_gcc')
+ self.assertTrue(spec['externaltool'].compiler.satisfies('gcc'))
+ self.assertTrue(spec['stuff'].compiler.satisfies('gcc'))
diff --git a/var/spack/mock_configs/site_spackconfig/packages.yaml b/var/spack/mock_configs/site_spackconfig/packages.yaml
new file mode 100644
index 0000000000..eb52c6cf11
--- /dev/null
+++ b/var/spack/mock_configs/site_spackconfig/packages.yaml
@@ -0,0 +1,13 @@
+packages:
+ - externaltool:
+ nobuild: True
+ - externaltool@1.0%gcc@4.5.0:
+ path: /path/to/external_tool
+ - externalvirtual@2.0%clang@3.3:
+ path: /path/to/external_virtual_clang
+ nobuild: True
+ - externalvirtual@1.0%gcc@4.5.0:
+ path: /path/to/external_virtual_gcc
+ nobuild: True
+
+
diff --git a/var/spack/mock_packages/externalprereq/package.py b/var/spack/mock_packages/externalprereq/package.py
new file mode 100644
index 0000000000..7d63925693
--- /dev/null
+++ b/var/spack/mock_packages/externalprereq/package.py
@@ -0,0 +1,34 @@
+##############################################################################
+# Copyright (c) 2013, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Written by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://scalability-llnl.github.io/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 General Public License (as published by
+# the Free Software Foundation) version 2.1 dated 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 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 Externalprereq(Package):
+ homepage = "http://somewhere.com"
+ url = "http://somewhere.com/prereq-1.0.tar.gz"
+
+ version('1.4', 'f1234567890abcdef1234567890abcde')
+
+ def install(self, spec, prefix):
+ pass
diff --git a/var/spack/mock_packages/externaltest/package.py b/var/spack/mock_packages/externaltest/package.py
new file mode 100644
index 0000000000..c546922f87
--- /dev/null
+++ b/var/spack/mock_packages/externaltest/package.py
@@ -0,0 +1,37 @@
+##############################################################################
+# Copyright (c) 2013, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Written by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://scalability-llnl.github.io/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 General Public License (as published by
+# the Free Software Foundation) version 2.1 dated 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 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 Externaltest(Package):
+ homepage = "http://somewhere.com"
+ url = "http://somewhere.com/test-1.0.tar.gz"
+
+ version('1.0', '1234567890abcdef1234567890abcdef')
+
+ depends_on('stuff')
+ depends_on('externaltool')
+
+ def install(self, spec, prefix):
+ pass
diff --git a/var/spack/mock_packages/externaltool/package.py b/var/spack/mock_packages/externaltool/package.py
new file mode 100644
index 0000000000..af902bd70e
--- /dev/null
+++ b/var/spack/mock_packages/externaltool/package.py
@@ -0,0 +1,36 @@
+##############################################################################
+# Copyright (c) 2013, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Written by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://scalability-llnl.github.io/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 General Public License (as published by
+# the Free Software Foundation) version 2.1 dated 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 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 Externaltool(Package):
+ homepage = "http://somewhere.com"
+ url = "http://somewhere.com/tool-1.0.tar.gz"
+
+ version('1.0', '1234567890abcdef1234567890abcdef')
+
+ depends_on('externalprereq')
+
+ def install(self, spec, prefix):
+ pass
diff --git a/var/spack/mock_packages/externalvirtual/package.py b/var/spack/mock_packages/externalvirtual/package.py
new file mode 100644
index 0000000000..722c1e1c53
--- /dev/null
+++ b/var/spack/mock_packages/externalvirtual/package.py
@@ -0,0 +1,37 @@
+##############################################################################
+# Copyright (c) 2013, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Written by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://scalability-llnl.github.io/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 General Public License (as published by
+# the Free Software Foundation) version 2.1 dated 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 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 Externalvirtual(Package):
+ homepage = "http://somewhere.com"
+ url = "http://somewhere.com/stuff-1.0.tar.gz"
+
+ version('1.0', '1234567890abcdef1234567890abcdef')
+ version('2.0', '234567890abcdef1234567890abcdef1')
+
+ provides('stuff')
+
+ def install(self, spec, prefix):
+ pass