Unit tests: make unit tests work for aarch64 machines (#33625)

Currently, many tests hardcode to older versions of gcc for comparisons of
concretization among compiler versions. Those versions are too old to concretize for
`aarch64`-family targets, which leads to failing tests on `aarch64`.

This PR fixes those tests by updating the compiler versions used for testing.

Currently, many tests hardcode the expected architecture result in concretization to the
`x86_64` family of architectures.

This PR generalizes the tests that can be generalized, to cover multiple architecture
families. For those that test specific relationships among `x86_64`-family targets, it
ensures that concretization uses the `x86_64`-family targets in those cases.

Currently, many tests rely on the fact that `AutotoolsPackage` imposes no dependencies
on the inheriting package. That is not true on `aarch64`-family architectures.

This PR ensures that the fact `AutotoolsPackage` on `aarch64` pulls in a dependency on
`gnuconfig` is ignored when testing for the appropriate relationships among dependencies

Additionally, 5 tests currently prompt the user for input when `gpg` is available in the
user's path. This PR fixes that issue. And 7 tests fail currently when the user has a
yubikey available. This PR fixes the incorrect gpg argument causing those issues.
This commit is contained in:
Greg Becker 2022-11-01 15:25:55 -07:00 committed by GitHub
parent e0265745bc
commit f696f02a46
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
27 changed files with 347 additions and 91 deletions

View file

@ -346,6 +346,10 @@ def compilers_for_arch(arch_spec, scope=None):
return list(get_compilers(config, arch_spec=arch_spec)) return list(get_compilers(config, arch_spec=arch_spec))
def compiler_specs_for_arch(arch_spec, scope=None):
return [c.spec for c in compilers_for_arch(arch_spec, scope)]
class CacheReference(object): class CacheReference(object):
"""This acts as a hashable reference to any object (regardless of whether """This acts as a hashable reference to any object (regardless of whether
the object itself is hashable) and also prevents the object from being the object itself is hashable) and also prevents the object from being

View file

@ -734,7 +734,7 @@ def concretize_specs_together(*abstract_specs, **kwargs):
Returns: Returns:
List of concretized specs List of concretized specs
""" """
if spack.config.get("config:concretizer") == "original": if spack.config.get("config:concretizer", "clingo") == "original":
return _concretize_specs_together_original(*abstract_specs, **kwargs) return _concretize_specs_together_original(*abstract_specs, **kwargs)
return _concretize_specs_together_new(*abstract_specs, **kwargs) return _concretize_specs_together_new(*abstract_specs, **kwargs)

View file

@ -1376,7 +1376,7 @@ def _concretize_separately(self, tests=False):
arguments.append((uspec_constraints, tests)) arguments.append((uspec_constraints, tests))
# Ensure we don't try to bootstrap clingo in parallel # Ensure we don't try to bootstrap clingo in parallel
if spack.config.get("config:concretizer") == "clingo": if spack.config.get("config:concretizer", "clingo") == "clingo":
with spack.bootstrap.ensure_bootstrap_configuration(): with spack.bootstrap.ensure_bootstrap_configuration():
spack.bootstrap.ensure_clingo_importable_or_raise() spack.bootstrap.ensure_clingo_importable_or_raise()

View file

@ -205,7 +205,9 @@ def install_sbang():
fs.set_install_permissions(sbang_bin_dir) fs.set_install_permissions(sbang_bin_dir)
# set group on sbang_bin_dir if not already set (only if set in configuration) # set group on sbang_bin_dir if not already set (only if set in configuration)
if group_name and grp.getgrgid(os.stat(sbang_bin_dir).st_gid).gr_name != group_name: # TODO: after we drop python2 support, use shutil.chown to avoid gid lookups that
# can fail for remote groups
if group_name and os.stat(sbang_bin_dir).st_gid != grp.getgrnam(group_name).gr_gid:
os.chown(sbang_bin_dir, os.stat(sbang_bin_dir).st_uid, grp.getgrnam(group_name).gr_gid) os.chown(sbang_bin_dir, os.stat(sbang_bin_dir).st_uid, grp.getgrnam(group_name).gr_gid)
# copy over the fresh copy of `sbang` # copy over the fresh copy of `sbang`

View file

@ -16,9 +16,14 @@ class Test(Platform):
if platform.system().lower() == "darwin": if platform.system().lower() == "darwin":
binary_formats = ["macho"] binary_formats = ["macho"]
front_end = "x86_64" if platform.machine() == "arm64":
back_end = "core2" front_end = "aarch64"
default = "core2" back_end = "m1"
default = "m1"
else:
front_end = "x86_64"
back_end = "core2"
default = "core2"
front_os = "redhat6" front_os = "redhat6"
back_os = "debian6" back_os = "debian6"

View file

@ -2945,7 +2945,7 @@ def concretize(self, tests=False):
if a list of names activate them for the packages in the list, if a list of names activate them for the packages in the list,
if True activate 'test' dependencies for all packages. if True activate 'test' dependencies for all packages.
""" """
if spack.config.get("config:concretizer") == "clingo": if spack.config.get("config:concretizer", "clingo") == "clingo":
self._new_concretize(tests) self._new_concretize(tests)
else: else:
self._old_concretize(tests) self._old_concretize(tests)

View file

@ -140,7 +140,7 @@ def test_optimization_flags(compiler_spec, target_name, expected_flags, config):
(spack.spec.CompilerSpec("gcc@9.2.0"), None, "haswell", "-march=haswell -mtune=haswell"), (spack.spec.CompilerSpec("gcc@9.2.0"), None, "haswell", "-march=haswell -mtune=haswell"),
# Check that custom string versions are accepted # Check that custom string versions are accepted
( (
spack.spec.CompilerSpec("gcc@foo"), spack.spec.CompilerSpec("gcc@10foo"),
"9.2.0", "9.2.0",
"icelake", "icelake",
"-march=icelake-client -mtune=icelake-client", "-march=icelake-client -mtune=icelake-client",
@ -196,7 +196,10 @@ def test_satisfy_strict_constraint_when_not_concrete(architecture_tuple, constra
], ],
) )
@pytest.mark.usefixtures("mock_packages", "config") @pytest.mark.usefixtures("mock_packages", "config")
def test_concretize_target_ranges(root_target_range, dep_target_range, result): def test_concretize_target_ranges(root_target_range, dep_target_range, result, monkeypatch):
# Monkeypatch so that all concretization is done as if the machine is core2
monkeypatch.setattr(spack.platforms.test.Test, "default", "core2")
# use foobar=bar to make the problem simpler for the old concretizer # use foobar=bar to make the problem simpler for the old concretizer
# the new concretizer should not need that help # the new concretizer should not need that help
if spack.config.get("config:concretizer") == "original": if spack.config.get("config:concretizer") == "original":

View file

@ -204,11 +204,12 @@ def test_autotools_gnuconfig_replacement_disabled(self, mutable_database):
assert "gnuconfig version of config.guess" not in f.read() assert "gnuconfig version of config.guess" not in f.read()
@pytest.mark.disable_clean_stage_check @pytest.mark.disable_clean_stage_check
def test_autotools_gnuconfig_replacement_no_gnuconfig(self, mutable_database): def test_autotools_gnuconfig_replacement_no_gnuconfig(self, mutable_database, monkeypatch):
""" """
Tests whether a useful error message is shown when patch_config_files is Tests whether a useful error message is shown when patch_config_files is
enabled, but gnuconfig is not listed as a direct build dependency. enabled, but gnuconfig is not listed as a direct build dependency.
""" """
monkeypatch.setattr(spack.platforms.test.Test, "default", "x86_64")
s = Spec("autotools-config-replacement +patch_config_files ~gnuconfig") s = Spec("autotools-config-replacement +patch_config_files ~gnuconfig")
s.concretize() s.concretize()

View file

@ -190,6 +190,12 @@ def test_ci_generate_with_env(
tags: tags:
- donotcare - donotcare
image: donotcare image: donotcare
- match:
- arch=test-debian6-m1
runner-attributes:
tags:
- donotcare
image: donotcare
service-job-attributes: service-job-attributes:
image: donotcare image: donotcare
tags: [donotcare] tags: [donotcare]
@ -270,10 +276,10 @@ def test_ci_generate_bootstrap_gcc(
spack: spack:
definitions: definitions:
- bootstrap: - bootstrap:
- gcc@3.0 - gcc@9.5
- gcc@2.0 - gcc@9.0
specs: specs:
- dyninst%gcc@3.0 - dyninst%gcc@9.5
mirrors: mirrors:
some-mirror: https://my.fake.mirror some-mirror: https://my.fake.mirror
gitlab-ci: gitlab-ci:
@ -286,6 +292,11 @@ def test_ci_generate_bootstrap_gcc(
runner-attributes: runner-attributes:
tags: tags:
- donotcare - donotcare
- match:
- arch=test-debian6-aarch64
runner-attributes:
tags:
- donotcare
""" """
) )
@ -338,9 +349,9 @@ def test_ci_generate_bootstrap_artifacts_buildcache(
spack: spack:
definitions: definitions:
- bootstrap: - bootstrap:
- gcc@3.0 - gcc@9.5
specs: specs:
- dyninst%gcc@3.0 - dyninst%gcc@9.5
mirrors: mirrors:
some-mirror: https://my.fake.mirror some-mirror: https://my.fake.mirror
gitlab-ci: gitlab-ci:
@ -353,6 +364,11 @@ def test_ci_generate_bootstrap_artifacts_buildcache(
runner-attributes: runner-attributes:
tags: tags:
- donotcare - donotcare
- match:
- arch=test-debian6-aarch64
runner-attributes:
tags:
- donotcare
enable-artifacts-buildcache: True enable-artifacts-buildcache: True
""" """
) )
@ -1524,12 +1540,12 @@ def test_ci_generate_with_workarounds(
"""\ """\
spack: spack:
specs: specs:
- callpath%gcc@3.0 - callpath%gcc@9.5
mirrors: mirrors:
some-mirror: https://my.fake.mirror some-mirror: https://my.fake.mirror
gitlab-ci: gitlab-ci:
mappings: mappings:
- match: ['%gcc@3.0'] - match: ['%gcc@9.5']
runner-attributes: runner-attributes:
tags: tags:
- donotcare - donotcare
@ -1639,28 +1655,28 @@ def test_ci_generate_bootstrap_prune_dag(
mirror_url = "file://{0}".format(mirror_dir.strpath) mirror_url = "file://{0}".format(mirror_dir.strpath)
# Install a compiler, because we want to put it in a buildcache # Install a compiler, because we want to put it in a buildcache
install_cmd("gcc@10.1.0%gcc@4.5.0") install_cmd("gcc@12.2.0%gcc@10.2.1")
# Put installed compiler in the buildcache # Put installed compiler in the buildcache
buildcache_cmd("create", "-u", "-a", "-f", "-d", mirror_dir.strpath, "gcc@10.1.0%gcc@4.5.0") buildcache_cmd("create", "-u", "-a", "-f", "-d", mirror_dir.strpath, "gcc@12.2.0%gcc@10.2.1")
# Now uninstall the compiler # Now uninstall the compiler
uninstall_cmd("-y", "gcc@10.1.0%gcc@4.5.0") uninstall_cmd("-y", "gcc@12.2.0%gcc@10.2.1")
monkeypatch.setattr(spack.concretize.Concretizer, "check_for_compiler_existence", False) monkeypatch.setattr(spack.concretize.Concretizer, "check_for_compiler_existence", False)
spack.config.set("config:install_missing_compilers", True) spack.config.set("config:install_missing_compilers", True)
assert CompilerSpec("gcc@10.1.0") not in compilers.all_compiler_specs() assert CompilerSpec("gcc@12.2.0") not in compilers.all_compiler_specs()
# Configure the mirror where we put that buildcache w/ the compiler # Configure the mirror where we put that buildcache w/ the compiler
mirror_cmd("add", "test-mirror", mirror_url) mirror_cmd("add", "test-mirror", mirror_url)
install_cmd("--no-check-signature", "a%gcc@10.1.0") install_cmd("--no-check-signature", "b%gcc@12.2.0")
# Put spec built with installed compiler in the buildcache # Put spec built with installed compiler in the buildcache
buildcache_cmd("create", "-u", "-a", "-f", "-d", mirror_dir.strpath, "a%gcc@10.1.0") buildcache_cmd("create", "-u", "-a", "-f", "-d", mirror_dir.strpath, "b%gcc@12.2.0")
# Now uninstall the spec # Now uninstall the spec
uninstall_cmd("-y", "a%gcc@10.1.0") uninstall_cmd("-y", "b%gcc@12.2.0")
filename = str(tmpdir.join("spack.yaml")) filename = str(tmpdir.join("spack.yaml"))
with open(filename, "w") as f: with open(filename, "w") as f:
@ -1669,9 +1685,9 @@ def test_ci_generate_bootstrap_prune_dag(
spack: spack:
definitions: definitions:
- bootstrap: - bootstrap:
- gcc@10.1.0%gcc@4.5.0 - gcc@12.2.0%gcc@10.2.1
specs: specs:
- a%gcc@10.1.0 - b%gcc@12.2.0
mirrors: mirrors:
atestm: {0} atestm: {0}
gitlab-ci: gitlab-ci:
@ -1689,6 +1705,16 @@ def test_ci_generate_bootstrap_prune_dag(
runner-attributes: runner-attributes:
tags: tags:
- meh - meh
- match:
- arch=test-debian6-aarch64
runner-attributes:
tags:
- donotcare
- match:
- arch=test-debian6-m1
runner-attributes:
tags:
- meh
""".format( """.format(
mirror_url mirror_url
) )
@ -1746,10 +1772,6 @@ def fake_get_mirrors_for_spec(spec=None, mirrors_to_check=None, index_only=False
"(specs) b": [ "(specs) b": [
"(bootstrap) gcc", "(bootstrap) gcc",
], ],
"(specs) a": [
"(bootstrap) gcc",
"(specs) b",
],
} }
_validate_needs_graph(new_yaml_contents, needs_graph, False) _validate_needs_graph(new_yaml_contents, needs_graph, False)
@ -2152,7 +2174,10 @@ def test_ci_reproduce(
ci_cmd("generate", "--output-file", pipeline_path, "--artifacts-root", artifacts_root) ci_cmd("generate", "--output-file", pipeline_path, "--artifacts-root", artifacts_root)
job_name = ci.get_job_name("specs", False, job_spec, "test-debian6-core2", None) target_name = spack.platforms.test.Test.default
job_name = ci.get_job_name(
"specs", False, job_spec, "test-debian6-%s" % target_name, None
)
repro_file = os.path.join(working_dir.strpath, "repro.json") repro_file = os.path.join(working_dir.strpath, "repro.json")
repro_details = { repro_details = {

View file

@ -634,13 +634,13 @@ def test_config_prefer_upstream(
# Make sure only the non-default variants are set. # Make sure only the non-default variants are set.
assert packages["boost"] == { assert packages["boost"] == {
"compiler": ["gcc@4.5.0"], "compiler": ["gcc@10.2.1"],
"variants": "+debug +graph", "variants": "+debug +graph",
"version": ["1.63.0"], "version": ["1.63.0"],
} }
assert packages["dependency-install"] == {"compiler": ["gcc@4.5.0"], "version": ["2.0"]} assert packages["dependency-install"] == {"compiler": ["gcc@10.2.1"], "version": ["2.0"]}
# Ensure that neither variant gets listed for hdf5, since they conflict # Ensure that neither variant gets listed for hdf5, since they conflict
assert packages["hdf5"] == {"compiler": ["gcc@4.5.0"], "version": ["2.3"]} assert packages["hdf5"] == {"compiler": ["gcc@10.2.1"], "version": ["2.3"]}
# Make sure a message about the conflicting hdf5's was given. # Make sure a message about the conflicting hdf5's was given.
assert "- hdf5" in output assert "- hdf5" in output

View file

@ -322,7 +322,7 @@ def test_find_very_long(database, config):
@pytest.mark.db @pytest.mark.db
def test_find_show_compiler(database, config): def test_find_show_compiler(database, config):
output = find("--no-groups", "--show-full-compiler", "mpileaks") output = find("--no-groups", "--show-full-compiler", "mpileaks")
assert "mpileaks@2.3%gcc@4.5.0" in output assert "mpileaks@2.3%gcc@10.2.1" in output
@pytest.mark.db @pytest.mark.db

View file

@ -935,7 +935,16 @@ def test_cdash_configure_warning(tmpdir, mock_fetch, install_mockery, capfd):
with capfd.disabled(): with capfd.disabled():
with tmpdir.as_cwd(): with tmpdir.as_cwd():
# Test would fail if install raised an error. # Test would fail if install raised an error.
install("--log-file=cdash_reports", "--log-format=cdash", "configure-warning")
# Ensure that even on non-x86_64 architectures, there are no
# dependencies installed
spec = spack.spec.Spec("configure-warning").concretized()
spec.clear_dependencies()
specfile = "./spec.json"
with open(specfile, "w") as f:
f.write(spec.to_json())
install("--log-file=cdash_reports", "--log-format=cdash", specfile)
# Verify Configure.xml exists with expected contents. # Verify Configure.xml exists with expected contents.
report_dir = tmpdir.join("cdash_reports") report_dir = tmpdir.join("cdash_reports")
assert report_dir in tmpdir.listdir() assert report_dir in tmpdir.listdir()
@ -955,10 +964,10 @@ def test_compiler_bootstrap(
): ):
monkeypatch.setattr(spack.concretize.Concretizer, "check_for_compiler_existence", False) monkeypatch.setattr(spack.concretize.Concretizer, "check_for_compiler_existence", False)
spack.config.set("config:install_missing_compilers", True) spack.config.set("config:install_missing_compilers", True)
assert CompilerSpec("gcc@2.0") not in compilers.all_compiler_specs() assert CompilerSpec("gcc@12.0") not in compilers.all_compiler_specs()
# Test succeeds if it does not raise an error # Test succeeds if it does not raise an error
install("a%gcc@2.0") install("a%gcc@12.0")
def test_compiler_bootstrap_from_binary_mirror( def test_compiler_bootstrap_from_binary_mirror(
@ -1013,11 +1022,11 @@ def test_compiler_bootstrap_already_installed(
monkeypatch.setattr(spack.concretize.Concretizer, "check_for_compiler_existence", False) monkeypatch.setattr(spack.concretize.Concretizer, "check_for_compiler_existence", False)
spack.config.set("config:install_missing_compilers", True) spack.config.set("config:install_missing_compilers", True)
assert CompilerSpec("gcc@2.0") not in compilers.all_compiler_specs() assert CompilerSpec("gcc@12.0") not in compilers.all_compiler_specs()
# Test succeeds if it does not raise an error # Test succeeds if it does not raise an error
install("gcc@2.0") install("gcc@12.0")
install("a%gcc@2.0") install("a%gcc@12.0")
def test_install_fails_no_args(tmpdir): def test_install_fails_no_args(tmpdir):

View file

@ -92,14 +92,14 @@ def test_changed_files_from_git_rev_base(tmpdir, capfd):
git("checkout", "-b", "main") git("checkout", "-b", "main")
git("config", "user.name", "test user") git("config", "user.name", "test user")
git("config", "user.email", "test@user.com") git("config", "user.email", "test@user.com")
git("commit", "--allow-empty", "-m", "initial commit") git("commit", "--no-gpg-sign", "--allow-empty", "-m", "initial commit")
tmpdir.ensure("bin/spack") tmpdir.ensure("bin/spack")
assert changed_files(base="HEAD") == ["bin/spack"] assert changed_files(base="HEAD") == ["bin/spack"]
assert changed_files(base="main") == ["bin/spack"] assert changed_files(base="main") == ["bin/spack"]
git("add", "bin/spack") git("add", "bin/spack")
git("commit", "-m", "v1") git("commit", "--no-gpg-sign", "-m", "v1")
assert changed_files(base="HEAD") == [] assert changed_files(base="HEAD") == []
assert changed_files(base="HEAD~") == ["bin/spack"] assert changed_files(base="HEAD~") == ["bin/spack"]
@ -113,7 +113,7 @@ def test_changed_no_base(tmpdir, capfd):
git("config", "user.name", "test user") git("config", "user.name", "test user")
git("config", "user.email", "test@user.com") git("config", "user.email", "test@user.com")
git("add", ".") git("add", ".")
git("commit", "-m", "initial commit") git("commit", "--no-gpg-sign", "-m", "initial commit")
with pytest.raises(SystemExit): with pytest.raises(SystemExit):
changed_files(base="foobar") changed_files(base="foobar")
@ -198,7 +198,7 @@ def external_style_root(flake8_package_with_errors, tmpdir):
git("config", "user.name", "test user") git("config", "user.name", "test user")
git("config", "user.email", "test@user.com") git("config", "user.email", "test@user.com")
git("add", ".") git("add", ".")
git("commit", "-m", "initial commit") git("commit", "--no-gpg-sign", "-m", "initial commit")
git("branch", "-m", "develop") git("branch", "-m", "develop")
git("checkout", "-b", "feature") git("checkout", "-b", "feature")
@ -210,7 +210,7 @@ def external_style_root(flake8_package_with_errors, tmpdir):
# add the buggy file on the feature branch # add the buggy file on the feature branch
with tmpdir.as_cwd(): with tmpdir.as_cwd():
git("add", str(py_file)) git("add", str(py_file))
git("commit", "-m", "add new file") git("commit", "--no-gpg-sign", "-m", "add new file")
yield tmpdir, py_file yield tmpdir, py_file

View file

@ -313,8 +313,8 @@ def test_provides_handles_multiple_providers_of_same_version(self):
def test_different_compilers_get_different_flags(self): def test_different_compilers_get_different_flags(self):
client = Spec( client = Spec(
"cmake-client %gcc@4.7.2 platform=test os=fe target=fe" "cmake-client %gcc@11.1.0 platform=test os=fe target=fe"
+ " ^cmake %clang@3.5 platform=test os=fe target=fe" + " ^cmake %clang@12.2.0 platform=test os=fe target=fe"
) )
client.concretize() client.concretize()
cmake = client["cmake"] cmake = client["cmake"]
@ -328,7 +328,7 @@ def test_architecture_inheritance(self):
UnavailableCompilerVersionError if the architecture is concretized UnavailableCompilerVersionError if the architecture is concretized
incorrectly. incorrectly.
""" """
spec = Spec("cmake-client %gcc@4.7.2 os=fe ^ cmake") spec = Spec("cmake-client %gcc@11.1.0 os=fe ^ cmake")
spec.concretize() spec.concretize()
assert spec["cmake"].architecture == spec.architecture assert spec["cmake"].architecture == spec.architecture
@ -452,7 +452,7 @@ def test_my_dep_depends_on_provider_of_my_virtual_dep(self):
spec.normalize() spec.normalize()
spec.concretize() spec.concretize()
@pytest.mark.parametrize("compiler_str", ["clang", "gcc", "gcc@4.5.0", "clang@:3.3.0"]) @pytest.mark.parametrize("compiler_str", ["clang", "gcc", "gcc@10.2.1", "clang@:12.0.0"])
def test_compiler_inheritance(self, compiler_str): def test_compiler_inheritance(self, compiler_str):
spec_str = "mpileaks %{0}".format(compiler_str) spec_str = "mpileaks %{0}".format(compiler_str)
spec = Spec(spec_str).concretized() spec = Spec(spec_str).concretized()
@ -695,15 +695,15 @@ def test_adjusting_default_target_based_on_compiler(
@pytest.mark.regression("8735,14730") @pytest.mark.regression("8735,14730")
def test_compiler_version_matches_any_entry_in_compilers_yaml(self): def test_compiler_version_matches_any_entry_in_compilers_yaml(self):
# Ensure that a concrete compiler with different compiler version # Ensure that a concrete compiler with different compiler version
# doesn't match (here it's 4.5 vs. 4.5.0) # doesn't match (here it's 10.2 vs. 10.2.1)
with pytest.raises(spack.concretize.UnavailableCompilerVersionError): with pytest.raises(spack.concretize.UnavailableCompilerVersionError):
s = Spec("mpileaks %gcc@4.5") s = Spec("mpileaks %gcc@10.2")
s.concretize() s.concretize()
# An abstract compiler with a version list could resolve to 4.5.0 # An abstract compiler with a version list could resolve to 4.5.0
s = Spec("mpileaks %gcc@4.5:") s = Spec("mpileaks %gcc@10.2:")
s.concretize() s.concretize()
assert str(s.compiler.version) == "4.5.0" assert str(s.compiler.version) == "10.2.1"
def test_concretize_anonymous(self): def test_concretize_anonymous(self):
with pytest.raises(spack.error.SpackError): with pytest.raises(spack.error.SpackError):
@ -720,11 +720,11 @@ def test_concretize_anonymous_dep(self, spec_str):
"spec_str,expected_str", "spec_str,expected_str",
[ [
# Unconstrained versions select default compiler (gcc@4.5.0) # Unconstrained versions select default compiler (gcc@4.5.0)
("bowtie@1.3.0", "%gcc@4.5.0"), ("bowtie@1.4.0", "%gcc@10.2.1"),
# Version with conflicts and no valid gcc select another compiler # Version with conflicts and no valid gcc select another compiler
("bowtie@1.2.2", "%clang@3.3"), ("bowtie@1.3.0", "%clang@12.0.0"),
# If a higher gcc is available still prefer that # If a higher gcc is available still prefer that
("bowtie@1.2.2 os=redhat6", "%gcc@4.7.2"), ("bowtie@1.2.2 os=redhat6", "%gcc@11.1.0"),
], ],
) )
def test_compiler_conflicts_in_package_py(self, spec_str, expected_str): def test_compiler_conflicts_in_package_py(self, spec_str, expected_str):
@ -1047,11 +1047,11 @@ def test_compiler_match_is_preferred_to_newer_version(self):
# that doesn't allow newer versions with gcc@4.4.0. Check # that doesn't allow newer versions with gcc@4.4.0. Check
# that an old version of openblas is selected, rather than # that an old version of openblas is selected, rather than
# a different compiler for just that node. # a different compiler for just that node.
spec_str = "simple-inheritance+openblas %gcc@4.4.0 os=redhat6" spec_str = "simple-inheritance+openblas %gcc@10.1.0 os=redhat6"
s = Spec(spec_str).concretized() s = Spec(spec_str).concretized()
assert "openblas@0.2.13" in s assert "openblas@0.2.15" in s
assert s["openblas"].satisfies("%gcc@4.4.0") assert s["openblas"].satisfies("%gcc@10.1.0")
@pytest.mark.regression("19981") @pytest.mark.regression("19981")
def test_target_ranges_in_conflicts(self): def test_target_ranges_in_conflicts(self):
@ -1080,8 +1080,8 @@ def test_custom_compiler_version(self):
if spack.config.get("config:concretizer") == "original": if spack.config.get("config:concretizer") == "original":
pytest.xfail("Known failure of the original concretizer") pytest.xfail("Known failure of the original concretizer")
s = Spec("a %gcc@foo os=redhat6").concretized() s = Spec("a %gcc@10foo os=redhat6").concretized()
assert "%gcc@foo" in s assert "%gcc@10foo" in s
def test_all_patches_applied(self): def test_all_patches_applied(self):
uuidpatch = ( uuidpatch = (
@ -1273,8 +1273,8 @@ def test_external_with_non_default_variant_as_dependency(self):
("mpileaks", "os=debian6"), ("mpileaks", "os=debian6"),
# To trigger the bug in 22871 we need to have the same compiler # To trigger the bug in 22871 we need to have the same compiler
# spec available on both operating systems # spec available on both operating systems
("mpileaks%gcc@4.5.0 platform=test os=debian6", "os=debian6"), ("mpileaks%gcc@10.2.1 platform=test os=debian6", "os=debian6"),
("mpileaks%gcc@4.5.0 platform=test os=redhat6", "os=redhat6"), ("mpileaks%gcc@10.2.1 platform=test os=redhat6", "os=redhat6"),
], ],
) )
def test_os_selection_when_multiple_choices_are_possible(self, spec_str, expected_os): def test_os_selection_when_multiple_choices_are_possible(self, spec_str, expected_os):
@ -1286,7 +1286,7 @@ def test_os_selection_when_multiple_choices_are_possible(self, spec_str, expecte
@pytest.mark.regression("22718") @pytest.mark.regression("22718")
@pytest.mark.parametrize( @pytest.mark.parametrize(
"spec_str,expected_compiler", "spec_str,expected_compiler",
[("mpileaks", "%gcc@4.5.0"), ("mpileaks ^mpich%clang@3.3", "%clang@3.3")], [("mpileaks", "%gcc@10.2.1"), ("mpileaks ^mpich%clang@12.0.0", "%clang@12.0.0")],
) )
def test_compiler_is_unique(self, spec_str, expected_compiler): def test_compiler_is_unique(self, spec_str, expected_compiler):
s = Spec(spec_str).concretized() s = Spec(spec_str).concretized()
@ -1462,10 +1462,12 @@ def test_target_granularity(self):
# The test architecture uses core2 as the default target. Check that when # The test architecture uses core2 as the default target. Check that when
# we configure Spack for "generic" granularity we concretize for x86_64 # we configure Spack for "generic" granularity we concretize for x86_64
default_target = spack.platforms.test.Test.default
generic_target = archspec.cpu.TARGETS[default_target].generic.name
s = Spec("python") s = Spec("python")
assert s.concretized().satisfies("target=core2") assert s.concretized().satisfies("target=%s" % default_target)
with spack.config.override("concretizer:targets", {"granularity": "generic"}): with spack.config.override("concretizer:targets", {"granularity": "generic"}):
assert s.concretized().satisfies("target=x86_64") assert s.concretized().satisfies("target=%s" % generic_target)
def test_host_compatible_concretization(self): def test_host_compatible_concretization(self):
if spack.config.get("config:concretizer") == "original": if spack.config.get("config:concretizer") == "original":
@ -1692,12 +1694,19 @@ def test_version_weight_and_provenance(self):
# version_declared("b","0.9",1,"package_py"). # version_declared("b","0.9",1,"package_py").
# version_declared("b","1.0",2,"installed"). # version_declared("b","1.0",2,"installed").
# version_declared("b","0.9",3,"installed"). # version_declared("b","0.9",3,"installed").
for criterion in [ #
(1, None, "number of packages to build (vs. reuse)"), # Depending on the target, it may also use gnuconfig
result_spec = result.specs[0]
num_specs = len(list(result_spec.traverse()))
criteria = [
(num_specs - 1, None, "number of packages to build (vs. reuse)"),
(2, 0, "version badness"), (2, 0, "version badness"),
]: ]
for criterion in criteria:
assert criterion in result.criteria assert criterion in result.criteria
assert result.specs[0].satisfies("^b@1.0") assert result_spec.satisfies("^b@1.0")
@pytest.mark.regression("31169") @pytest.mark.regression("31169")
def test_not_reusing_incompatible_os_or_compiler(self): def test_not_reusing_incompatible_os_or_compiler(self):
@ -1717,8 +1726,8 @@ def test_not_reusing_incompatible_os_or_compiler(self):
setup = spack.solver.asp.SpackSolverSetup() setup = spack.solver.asp.SpackSolverSetup()
result, _, _ = solver.driver.solve(setup, [root_spec], reuse=reusable_specs) result, _, _ = solver.driver.solve(setup, [root_spec], reuse=reusable_specs)
concrete_spec = result.specs[0] concrete_spec = result.specs[0]
assert concrete_spec.satisfies("%gcc@4.5.0") assert concrete_spec.satisfies("%{}".format(s.compiler))
assert concrete_spec.satisfies("os=debian6") assert concrete_spec.satisfies("os={}".format(s.architecture.os))
def test_git_hash_assigned_version_is_preferred(self): def test_git_hash_assigned_version_is_preferred(self):
hash = "a" * 40 hash = "a" * 40

View file

@ -8,6 +8,8 @@
import pytest import pytest
import archspec
import spack.config import spack.config
import spack.package_prefs import spack.package_prefs
import spack.repo import spack.repo
@ -109,7 +111,9 @@ def test_preferred_compilers(self):
pytest.skip("Fixing the parser broke this test for the original concretizer.") pytest.skip("Fixing the parser broke this test for the original concretizer.")
# Need to make sure the test uses an available compiler # Need to make sure the test uses an available compiler
compiler_list = spack.compilers.all_compiler_specs() arch = spack.spec.ArchSpec(("test", "redhat6", archspec.cpu.host().name))
compiler_list = spack.compilers.compiler_specs_for_arch(arch)
assert compiler_list assert compiler_list
# Try the first available compiler # Try the first available compiler

View file

@ -128,7 +128,14 @@ def mock_git_version_info(tmpdir, override_git_repos_cache_path):
def commit(message): def commit(message):
global commit_counter global commit_counter
git("commit", "--date", "2020-01-%02d 12:0:00 +0300" % commit_counter, "-am", message) git(
"commit",
"--no-gpg-sign",
"--date",
"2020-01-%02d 12:0:00 +0300" % commit_counter,
"-am",
message,
)
commit_counter += 1 commit_counter += 1
with working_dir(repo_path): with working_dir(repo_path):

View file

@ -130,6 +130,7 @@ compilers:
f77: /path/to/gfortran440 f77: /path/to/gfortran440
fc: /path/to/gfortran440 fc: /path/to/gfortran440
modules: 'None' modules: 'None'
target: x86_64
- compiler: - compiler:
spec: clang@3.5 spec: clang@3.5
operating_system: redhat6 operating_system: redhat6
@ -167,7 +168,7 @@ compilers:
modules: 'None' modules: 'None'
target: x86_64 target: x86_64
- compiler: - compiler:
spec: gcc@foo spec: gcc@10foo
operating_system: redhat6 operating_system: redhat6
paths: paths:
cc: /path/to/gcc cc: /path/to/gcc
@ -186,3 +187,167 @@ compilers:
fc: /path/to/gfortran fc: /path/to/gfortran
modules: 'None' modules: 'None'
target: x86_64 target: x86_64
- compiler:
spec: clang@12.0.0
operating_system: {0.name}{0.version}
paths:
cc: /path/to/clang
cxx: /path/to/clang++
f77: None
fc: None
modules: 'None'
target: aarch64
- compiler:
spec: gcc@10.2.1
operating_system: {0.name}{0.version}
paths:
cc: /path/to/gcc
cxx: /path/to/g++
f77: None
fc: None
modules: 'None'
target: aarch64
- compiler:
spec: clang@12.0.0
operating_system: redhat6
paths:
cc: /path/to/clang
cxx: /path/to/clang++
f77: None
fc: None
modules: 'None'
target: aarch64
- compiler:
spec: gcc@10.2.1
operating_system: redhat6
paths:
cc: /path/to/gcc
cxx: /path/to/g++
f77: None
fc: None
modules: 'None'
target: aarch64
- compiler:
spec: gcc@10.1.0
operating_system: redhat6
paths:
cc: /path/to/gcc
cxx: /path/to/g++
f77: None
fc: None
modules: 'None'
target: aarch64
- compiler:
spec: gcc@11.1.0
operating_system: redhat6
paths:
cc: /path/to/gcc
cxx: /path/to/g++
f77: None
fc: None
flags:
cflags: -O0 -g
cxxflags: -O0 -g
fflags: -O0 -g
modules: 'None'
target: aarch64
- compiler:
spec: clang@12.2.0
operating_system: redhat6
paths:
cc: /path/to/clang35
cxx: /path/to/clang++35
f77: None
fc: None
flags:
cflags: -O3
cxxflags: -O3
modules: 'None'
target: aarch64
- compiler:
spec: gcc@10foo
operating_system: redhat6
paths:
cc: /path/to/gcc
cxx: /path/to/g++
f77: /path/to/gfortran
fc: /path/to/gfortran
modules: 'None'
target: aarch64
- compiler:
spec: clang@12.0.0
operating_system: {0.name}{0.version}
paths:
cc: /path/to/clang
cxx: /path/to/clang++
f77: None
fc: None
modules: 'None'
target: x86_64
- compiler:
spec: gcc@10.2.1
operating_system: {0.name}{0.version}
paths:
cc: /path/to/gcc
cxx: /path/to/g++
f77: None
fc: None
modules: 'None'
target: x86_64
- compiler:
spec: clang@12.0.0
operating_system: redhat6
paths:
cc: /path/to/clang
cxx: /path/to/clang++
f77: None
fc: None
modules: 'None'
target: x86_64
- compiler:
spec: gcc@10.2.1
operating_system: redhat6
paths:
cc: /path/to/gcc
cxx: /path/to/g++
f77: None
fc: None
modules: 'None'
target: x86_64
- compiler:
spec: gcc@10.1.0
operating_system: redhat6
paths:
cc: /path/to/gcc
cxx: /path/to/g++
f77: None
fc: None
modules: 'None'
target: x86_64
- compiler:
spec: gcc@11.1.0
operating_system: redhat6
paths:
cc: /path/to/gcc
cxx: /path/to/g++
f77: None
fc: None
flags:
cflags: -O0 -g
cxxflags: -O0 -g
fflags: -O0 -g
modules: 'None'
target: x86_64
- compiler:
spec: clang@12.2.0
operating_system: redhat6
paths:
cc: /path/to/clang35
cxx: /path/to/clang++35
f77: None
fc: None
flags:
cflags: -O3
cxxflags: -O3
modules: 'None'
target: x86_64

View file

@ -7,18 +7,18 @@ packages:
externaltool: externaltool:
buildable: False buildable: False
externals: externals:
- spec: externaltool@1.0%gcc@4.5.0 - spec: externaltool@1.0%gcc@10.2.1
prefix: /path/to/external_tool prefix: /path/to/external_tool
- spec: externaltool@0.9%gcc@4.5.0 - spec: externaltool@0.9%gcc@10.2.1
prefix: /usr prefix: /usr
- spec: externaltool@0_8%gcc@4.5.0 - spec: externaltool@0_8%gcc@10.2.1
prefix: /usr prefix: /usr
externalvirtual: externalvirtual:
buildable: False buildable: False
externals: externals:
- spec: externalvirtual@2.0%clang@3.3 - spec: externalvirtual@2.0%clang@12.0.0
prefix: /path/to/external_virtual_clang prefix: /path/to/external_virtual_clang
- spec: externalvirtual@1.0%gcc@4.5.0 - spec: externalvirtual@1.0%gcc@10.2.1
prefix: /path/to/external_virtual_gcc prefix: /path/to/external_virtual_gcc
externalmodule: externalmodule:
buildable: False buildable: False
@ -49,4 +49,4 @@ packages:
- spec: external-non-default-variant@3.8.7~foo~bar - spec: external-non-default-variant@3.8.7~foo~bar
prefix: /usr prefix: /usr
version-test-dependency-preferred: version-test-dependency-preferred:
version: ['5.2.5'] version: ['5.2.5']

View file

@ -632,7 +632,10 @@ def test_check_deps_status_external(install_mockery, monkeypatch):
# Mock the known dependent, b, as external so assumed to be installed # Mock the known dependent, b, as external so assumed to be installed
monkeypatch.setattr(spack.spec.Spec, "external", True) monkeypatch.setattr(spack.spec.Spec, "external", True)
installer._check_deps_status(request) installer._check_deps_status(request)
assert list(installer.installed)[0].startswith("b")
# exotic architectures will add dependencies on gnuconfig, which we want to ignore
installed = [x for x in installer.installed if not x.startswith("gnuconfig")]
assert installed[0].startswith("b")
def test_check_deps_status_upstream(install_mockery, monkeypatch): def test_check_deps_status_upstream(install_mockery, monkeypatch):
@ -643,7 +646,10 @@ def test_check_deps_status_upstream(install_mockery, monkeypatch):
# Mock the known dependent, b, as installed upstream # Mock the known dependent, b, as installed upstream
monkeypatch.setattr(spack.spec.Spec, "installed_upstream", True) monkeypatch.setattr(spack.spec.Spec, "installed_upstream", True)
installer._check_deps_status(request) installer._check_deps_status(request)
assert list(installer.installed)[0].startswith("b")
# exotic architectures will add dependencies on gnuconfig, which we want to ignore
installed = [x for x in installer.installed if not x.startswith("gnuconfig")]
assert installed[0].startswith("b")
def test_add_bootstrap_compilers(install_mockery, monkeypatch): def test_add_bootstrap_compilers(install_mockery, monkeypatch):

View file

@ -24,7 +24,7 @@
pytestmark = pytest.mark.skipif(sys.platform == "win32", reason="does not run on windows") pytestmark = pytest.mark.skipif(sys.platform == "win32", reason="does not run on windows")
@pytest.fixture(params=["clang@3.3", "gcc@4.5.0"]) @pytest.fixture(params=["clang@12.0.0", "gcc@10.2.1"])
def compiler(request): def compiler(request):
return request.param return request.param

View file

@ -7,6 +7,7 @@
Test that Spack's shebang filtering works correctly. Test that Spack's shebang filtering works correctly.
""" """
import filecmp import filecmp
import getpass
import os import os
import shutil import shutil
import stat import stat
@ -268,6 +269,10 @@ def test_shebang_handles_non_writable_files(script_dir, sbang_line):
@pytest.fixture(scope="function") @pytest.fixture(scope="function")
def configure_group_perms(): def configure_group_perms():
# On systems with remote groups, the primary user group may be remote
# and grp does not act on remote groups.
# To ensure we find a group we can operate on, we get take the first group
# listed which has the current user as a member.
conf = syaml.load_config( conf = syaml.load_config(
"""\ """\
all: all:
@ -276,7 +281,7 @@ def configure_group_perms():
write: group write: group
group: {0} group: {0}
""".format( """.format(
grp.getgrgid(os.getegid()).gr_name [g.gr_name for g in grp.getgrall() if getpass.getuser() in g.gr_mem][0]
) )
) )
spack.config.set("packages", conf, scope="user") spack.config.set("packages", conf, scope="user")

View file

@ -841,7 +841,7 @@ def test_spec_flags_maintain_order(self):
# Spack was assembling flags in a manner that could result in # Spack was assembling flags in a manner that could result in
# different orderings for repeated concretizations of the same # different orderings for repeated concretizations of the same
# spec and config # spec and config
spec_str = "libelf %gcc@4.7.2 os=redhat6" spec_str = "libelf %gcc@11.1.0 os=redhat6"
for _ in range(25): for _ in range(25):
s = Spec(spec_str).concretized() s = Spec(spec_str).concretized()
assert all( assert all(

View file

@ -277,13 +277,17 @@ def test_canonicalize(self):
"x ^y@1,2:3,4%intel@1,2,3,4+a~b+c~d+e~f", "x ^y~f+e~d+c~b+a@4,2:3,1%intel@4,3,2,1" "x ^y@1,2:3,4%intel@1,2,3,4+a~b+c~d+e~f", "x ^y~f+e~d+c~b+a@4,2:3,1%intel@4,3,2,1"
) )
default_target = spack.platforms.test.Test.default
self.check_parse( self.check_parse(
"x arch=test-redhat6-None" " ^y arch=test-None-core2" " ^z arch=linux-None-None", "x arch=test-redhat6-None"
+ (" ^y arch=test-None-%s" % default_target)
+ " ^z arch=linux-None-None",
"x os=fe " "^y target=be " "^z platform=linux", "x os=fe " "^y target=be " "^z platform=linux",
) )
self.check_parse( self.check_parse(
"x arch=test-debian6-core2" " ^y arch=test-debian6-core2", ("x arch=test-debian6-%s" % default_target)
+ (" ^y arch=test-debian6-%s" % default_target),
"x os=default_os target=default_target" " ^y os=default_os target=default_target", "x os=default_os target=default_target" " ^y os=default_os target=default_target",
) )

View file

@ -239,7 +239,7 @@ def trust(keyfile):
keys = _get_unimported_public_keys(output) keys = _get_unimported_public_keys(output)
# Import them # Import them
GPG("--import", keyfile) GPG("--batch", "--import", keyfile)
# Set trust to ultimate # Set trust to ultimate
key_to_fpr = dict(public_keys_to_fingerprint()) key_to_fpr = dict(public_keys_to_fingerprint())
@ -285,7 +285,7 @@ def sign(key, file, output, clearsign=False):
signature, if False creates a detached signature signature, if False creates a detached signature
""" """
signopt = "--clearsign" if clearsign else "--detach-sign" signopt = "--clearsign" if clearsign else "--detach-sign"
GPG(signopt, "--armor", "--default-key", key, "--output", output, file) GPG(signopt, "--armor", "--local-user", key, "--output", output, file)
@_autoinit @_autoinit

View file

@ -11,8 +11,10 @@ class Bowtie(Package):
homepage = "http://www.example.org" homepage = "http://www.example.org"
url = "http://bowtie-1.2.2.tar.bz2" url = "http://bowtie-1.2.2.tar.bz2"
version("1.4.0", "1c837ecd990bb022d07e7aab32b09847")
version("1.3.0", "1c837ecd990bb022d07e7aab32b09847") version("1.3.0", "1c837ecd990bb022d07e7aab32b09847")
version("1.2.2", "1c837ecd990bb022d07e7aab32b09847") version("1.2.2", "1c837ecd990bb022d07e7aab32b09847")
version("1.2.0", "1c837ecd990bb022d07e7aab32b09847") version("1.2.0", "1c837ecd990bb022d07e7aab32b09847")
conflicts("%gcc@:4.5.0", when="@1.2.2") conflicts("%gcc@:4.5.0", when="@1.2.2")
conflicts("%gcc@:10.2.1", when="@:1.3.0")

View file

@ -16,3 +16,4 @@ class ImpossibleConcretization(Package):
version(1.0, "0123456789abcdef0123456789abcdef") version(1.0, "0123456789abcdef0123456789abcdef")
conflicts("target=x86_64:") conflicts("target=x86_64:")
conflicts("target=aarch64:")

View file

@ -12,6 +12,7 @@ class Openblas(Package):
homepage = "http://www.openblas.net" homepage = "http://www.openblas.net"
url = "http://github.com/xianyi/OpenBLAS/archive/v0.2.15.tar.gz" url = "http://github.com/xianyi/OpenBLAS/archive/v0.2.15.tar.gz"
version("0.2.16", "b1190f3d3471685f17cfd1ec1d252ac9")
version("0.2.15", "b1190f3d3471685f17cfd1ec1d252ac9") version("0.2.15", "b1190f3d3471685f17cfd1ec1d252ac9")
version("0.2.14", "b1190f3d3471685f17cfd1ec1d252ac9") version("0.2.14", "b1190f3d3471685f17cfd1ec1d252ac9")
version("0.2.13", "b1190f3d3471685f17cfd1ec1d252ac9") version("0.2.13", "b1190f3d3471685f17cfd1ec1d252ac9")
@ -19,4 +20,7 @@ class Openblas(Package):
# See #20019 for this conflict # See #20019 for this conflict
conflicts("%gcc@:4.4", when="@0.2.14:") conflicts("%gcc@:4.4", when="@0.2.14:")
# To ensure test works with newer gcc versions
conflicts("%gcc@:10.1", when="@0.2.16:")
provides("blas") provides("blas")