diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py index 50dbaa8eb8d..0fa4d608a02 100644 --- a/lib/spack/spack/test/concretize.py +++ b/lib/spack/spack/test/concretize.py @@ -4,7 +4,6 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) import copy import os -import pathlib import sys import jinja2 @@ -2809,60 +2808,47 @@ def mock_runtime_dependencies(*args, **kwargs): """ mock function moved outside local definition to allow multiprocessing pickling to work + ----------------- Captured stderr call ------------- + AttributeError: + Can't pickle local object 'test_reuse_prefers_standard_over_git_versions..' """ return True @pytest.mark.only_clingo("clingo only re-use feature being tested") @pytest.mark.regression("38484") -def test_git_ref_version_can_be_reused( - monkeypatch, mock_packages, install_mockery_mutable_config, mock_git_version_info -): - repo_path, filename, commits = mock_git_version_info - monkeypatch.setattr( - spack.package_base.PackageBase, "git", pathlib.Path(repo_path).as_uri(), raising=False - ) +def test_git_ref_version_can_be_reused(monkeypatch, mock_packages, install_mockery_mutable_config): # override gcc-runtime dep and make all installs reusable monkeypatch.setattr(spack.solver.asp, "_has_runtime_dependencies", mock_runtime_dependencies) - first_spec = spack.spec.Spec( - "git-test-commit@git.v1.0=1.0+generic_install+feature" - ).concretized() + first_spec = spack.spec.Spec("zlib-ng@git.2.1.5=2.1.5").concretized() first_spec.package.do_install(fake=True, explicit=True) with spack.config.override("concretizer:reuse", True): - second_spec = spack.spec.Spec( - "git-test-commit@git.v1.0=1.0+generic_install~feature" - ).concretized() + second_spec = spack.spec.Spec("zlib-ng@git.2.1.5=2.1.5~opt").concretized() # is_installed(first_spec) assert second_spec.dag_hash() != first_spec.dag_hash() @pytest.mark.only_clingo("clingo only re-use feature being tested") def test_reuse_prefers_standard_over_git_versions( - monkeypatch, mock_packages, install_mockery_mutable_config, mock_git_version_info + monkeypatch, mock_packages, install_mockery_mutable_config ): """ order matters in this test. typically re-use would pick the last installed match but we want to prefer the standard version over git ref based versions so install git ref last and ensure it is not picked up by re-use """ - repo_path, filename, commits = mock_git_version_info - monkeypatch.setattr( - spack.package_base.PackageBase, "git", pathlib.Path(repo_path).as_uri(), raising=False - ) # override gcc-runtime dep and make all installs reusable monkeypatch.setattr(spack.solver.asp, "_has_runtime_dependencies", mock_runtime_dependencies) - standard_spec = spack.spec.Spec("git-test-commit@1.0+generic_install+feature").concretized() + standard_spec = spack.spec.Spec("zlib-ng@2.1.5").concretized() standard_spec.package.do_install(fake=True, explicit=True) - git_spec = spack.spec.Spec( - "git-test-commit@git.v1.0=1.0+generic_install+feature" - ).concretized() + git_spec = spack.spec.Spec("zlib-ng@git.2.1.5=2.1.5").concretized() git_spec.package.do_install(fake=True, explicit=True) with spack.config.override("concretizer:reuse", True): - test_spec = spack.spec.Spec("git-test-commit@1.0+generic_install").concretized() + test_spec = spack.spec.Spec("zlib-ng@2").concretized() assert git_spec.dag_hash() != test_spec.dag_hash() assert standard_spec.dag_hash() == test_spec.dag_hash() diff --git a/var/spack/repos/builtin.mock/packages/git-test-commit/package.py b/var/spack/repos/builtin.mock/packages/git-test-commit/package.py index 75648798b06..66eb64e5436 100644 --- a/var/spack/repos/builtin.mock/packages/git-test-commit/package.py +++ b/var/spack/repos/builtin.mock/packages/git-test-commit/package.py @@ -17,18 +17,10 @@ class GitTestCommit(Package): version("1.2", tag="1.2") # not a typo version("2.0", tag="v2.0") - variant( - "generic_install", - default=False, - description="Override install feature for original implementations tests", - ) - variant("feature", default=False, description="A very cool feature") - def install(self, spec, prefix): # It is assumed for the test which installs this package, that it will # be using the earliest commit, which is contained in the range @:0 - if not spec.variants["generic_install"].value: - assert spec.satisfies("@:0") + assert spec.satisfies("@:0") mkdir(prefix.bin) # This will only exist for some second commit diff --git a/var/spack/repos/builtin.mock/packages/zlib-ng/package.py b/var/spack/repos/builtin.mock/packages/zlib-ng/package.py new file mode 100644 index 00000000000..903e451347f --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/zlib-ng/package.py @@ -0,0 +1,97 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.build_systems import autotools, cmake +from spack.package import * + + +class ZlibNg(AutotoolsPackage, CMakePackage): + """ + zlib replacement with optimizations for next generation systems. + -- added to mock repo and deleted patches for re-use and git ref testing + """ + + homepage = "https://github.com/zlib-ng/zlib-ng" + url = "https://github.com/zlib-ng/zlib-ng/archive/2.0.0.tar.gz" + git = "https://github.com/zlib-ng/zlib-ng.git" + + maintainers("haampie") + + license("Zlib") + + version("2.1.6", sha256="a5d504c0d52e2e2721e7e7d86988dec2e290d723ced2307145dedd06aeb6fef2") + version("2.1.5", sha256="3f6576971397b379d4205ae5451ff5a68edf6c103b2f03c4188ed7075fbb5f04") + version("2.1.4", sha256="a0293475e6a44a3f6c045229fe50f69dc0eebc62a42405a51f19d46a5541e77a") + version( + "2.1.3", + sha256="d20e55f89d71991c59f1c5ad1ef944815e5850526c0d9cd8e504eaed5b24491a", + deprecated=True, + ) + version( + "2.1.2", + sha256="383560d6b00697c04e8878e26c0187b480971a8bce90ffd26a5a7b0f7ecf1a33", + deprecated=True, + ) + version("2.0.7", sha256="6c0853bb27738b811f2b4d4af095323c3d5ce36ceed6b50e5f773204fb8f7200") + version("2.0.0", sha256="86993903527d9b12fc543335c19c1d33a93797b3d4d37648b5addae83679ecd8") + + variant("compat", default=True, description="Enable compatibility API") + variant("opt", default=True, description="Enable optimizations") + variant("shared", default=True, description="Build shared library") + variant("pic", default=True, description="Enable position-independent code (PIC)") + + conflicts("+shared~pic") + + variant("new_strategies", default=True, description="Enable new deflate strategies") + + provides("zlib-api", when="+compat") + + # Default to autotools, since cmake would result in circular dependencies if it's not + # reused. + build_system("autotools", "cmake", default="autotools") + + def libs(self): + name = "libz" if self.spec.satisfies("+compat") else "libz-ng" + return find_libraries( + name, root=self.prefix, recursive=True, shared=self.spec.satisfies("+shared") + ) + + def flag_handler(self, name, flags): + if name == "cflags" and self.spec.satisfies("+pic build_system=autotools"): + flags.append(self.compiler.cc_pic_flag) + return (flags, None, None) + + +class AutotoolsBuilder(autotools.AutotoolsBuilder): + @run_before("configure") + def pretend_gcc(self): + # All nice things (PIC flags, symbol versioning) that happen to the compilers that are + # recognized as gcc (%gcc, %clang, %intel, %oneapi) we want for some other compilers too: + if self.spec.compiler.name in ["nvhpc"]: + filter_file(r"^gcc=0$", "gcc=1", join_path(self.configure_directory, "configure")) + + def configure_args(self): + args = [] + if self.spec.satisfies("+compat"): + args.append("--zlib-compat") + if self.spec.satisfies("~opt"): + args.append("--without-optimizations") + if self.spec.satisfies("~shared"): + args.append("--static") + if self.spec.satisfies("~new_strategies"): + args.append("--without-new-strategies") + return args + + +class CMakeBuilder(cmake.CMakeBuilder): + def cmake_args(self): + return [ + self.define_from_variant("ZLIB_COMPAT", "compat"), + self.define_from_variant("WITH_OPTIM", "opt"), + self.define("BUILD_SHARED_LIBS", self.spec.satisfies("+shared")), + self.define_from_variant("CMAKE_POSITION_INDEPENDENT_CODE", "pic"), + self.define_from_variant("WITH_NEW_STRATEGIES", "new_strategies"), + self.define("ZLIB_ENABLE_TESTS", self.pkg.run_tests), + ]