public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/psi4] f44: Update to 1.10 prerelease to get Psi4 to build again
@ 2026-07-31 9:30 Susi Lehtola
0 siblings, 0 replies; only message in thread
From: Susi Lehtola @ 2026-07-31 9:30 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/psi4
Branch : f44
Commit : 36e25560cd63e944e06f05cb6f03061eb5cbfb6e
Author : Susi Lehtola <jussilehtola@fedoraproject.org>
Date : 2026-05-18T17:38:02+00:00
Stats : +909/-164 in 10 file(s)
URL : https://src.fedoraproject.org/rpms/psi4/c/36e25560cd63e944e06f05cb6f03061eb5cbfb6e?branch=f44
Log:
Update to 1.10 prerelease to get Psi4 to build again
---
diff --git a/3389.patch b/3389.patch
new file mode 100644
index 0000000..642c60e
--- /dev/null
+++ b/3389.patch
@@ -0,0 +1,842 @@
+From d8c29bf947146f6af8be1131e5ca3d42852e8b47 Mon Sep 17 00:00:00 2001
+From: "Lori A. Burns" <lori.burns7@gmail.com>
+Date: Thu, 7 May 2026 00:03:15 -0400
+Subject: [PATCH] make qcmanybody optional
+
+---
+ CMakeLists.txt | 1 +
+ codedeps.yaml | 4 +-
+ doc/sphinxman/source/build_planning.rst | 4 +-
+ doc/sphinxman/source/external.rst | 1 +
+ doc/sphinxman/source/nbody.rst | 3 +-
+ external/upstream/qcmanybody/CMakeLists.txt | 72 ++++++++++---------
+ psi4/__init__.py | 2 +
+ psi4/driver/driver_nbody.py | 33 ++++++++-
+ psi4/extras.py | 1 +
+ pytest.ini | 4 +-
+ tests/cbs-xtpl-nbody/test_input.py | 4 +-
+ tests/ddd-function-kwargs/test_input.py | 4 +-
+ tests/dfmp2-1/test_input.py | 4 +-
+ tests/dfmp2-ecp/test_input.py | 3 +-
+ tests/dfmp2-fc/test_input.py | 4 +-
+ tests/dft-custom-dhdf/test_input.py | 4 +-
+ tests/dftd3/nbody-cp-gradient/test_input.py | 3 +-
+ tests/mp2-def2/test_input.py | 4 +-
+ tests/nbody-convergence/test_input.py | 4 +-
+ tests/nbody-cp-gradient/test_input.py | 4 +-
+ tests/nbody-freq/test_input.py | 4 +-
+ tests/nbody-he-4b/test_input.py | 4 +-
+ tests/nbody-he-cluster/test_input.py | 4 +-
+ tests/nbody-hessian/test_input.py | 4 +-
+ tests/nbody-intermediates/test_input.py | 4 +-
+ tests/nbody-multi-level-2/test_input.py | 4 +-
+ tests/nbody-multi-level/test_input.py | 4 +-
+ tests/nbody-nocp-gradient/test_input.py | 4 +-
+ tests/nbody-vmfc-gradient/test_input.py | 4 +-
+ tests/nbody-vmfc-hessian/test_input.py | 4 +-
+ tests/pytests/addons.py | 6 +-
+ tests/pytests/test_addons.py | 3 +-
+ tests/pytests/test_addons_qcschema.py | 3 +-
+ tests/pytests/test_compositejk.py | 4 +-
+ tests/pytests/test_dft_benchmarks.py | 4 +-
+ tests/pytests/test_dftd3.py | 3 +-
+ tests/pytests/test_nbody.py | 5 +-
+ .../test_nbody_multi_level_qcschema.py | 5 +-
+ tests/pytests/test_psi4.py | 3 +-
+ tests/pytests/test_psi4_qcschema.py | 3 +-
+ tests/tu6-cp-ne2/test_input.py | 4 +-
+ 41 files changed, 145 insertions(+), 101 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 8ea2f9f0b64..1e04c3e4f14 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -127,6 +127,7 @@ option(ENABLE_gdma "Enables Stone's GDMA multipole code (requires Fortran; can a
+ option(ENABLE_IntegratorXX "Enables use of IntegratorXX density functional grids library" OFF)
+ option(ENABLE_OpenOrbitalOptimizer "Enables the OpenOrbitalOptimizer library (requires Armadillo)" OFF)
+ option(ENABLE_PCMSolver "Enables PCMSolver library (requires Fortran)" OFF)
++option(ENABLE_qcmanybody "Enables qcmanybody for n-body/BSSE workflows (can also be added at runtime)" OFF)
+ option(ENABLE_snsmp2 "Enables SNSMP2 plugin (can also be added at runtime)" OFF)
+ option(ENABLE_v2rdm_casscf "Enables V2RDM_CASSCF plugin (requires Fortran; can also be added at runtime)" OFF)
+ option(ENABLE_psi4fockci "Enables Psi4FockCI plugin (can also be added at runtime)" OFF)
+diff --git a/codedeps.yaml b/codedeps.yaml
+index 124c74c4492..316780b00d3 100644
+--- a/codedeps.yaml
++++ b/codedeps.yaml
+@@ -1490,8 +1490,8 @@ data:
+ - project: qcmanybody
+ use:
+ added: "1.10"
+- required: true
+- required_note: "Allows BSSE treatments and MBE analyses. Prior to v1.10, internal code was used."
++ required: false
++ required_note: "Allows BSSE treatments and MBE analyses. Required for v1.10. Prior to v1.10, internal code was used."
+ buildable: true
+ buildtime: true
+ buildtime_note: "buildtime for cmake checks; otherwise, runtime."
+diff --git a/doc/sphinxman/source/build_planning.rst b/doc/sphinxman/source/build_planning.rst
+index ef913ecc7be..73dd6c3dd9b 100644
+--- a/doc/sphinxman/source/build_planning.rst
++++ b/doc/sphinxman/source/build_planning.rst
+@@ -241,8 +241,6 @@ build system will automatically download and build.
+
+ * optking |w---w| `[what is optking] <https://optking.readthedocs.io/en/latest/>`_ (runtime dependency, required at build-time)
+
+-* QCManyBody |w---w| `[what is QCManyBody?] <https://molssi.github.io/QCManyBody/>`_ (August 2025; added by v1.10; runtime dependency, required at build-time)
+-
+ Additionally, there are runtime-only dependencies:
+
+ * msgpack-python for MessagePack https://msgpack.org/ (transitive dependency of QCElemental; optional for QCElemental but required for |PSIfour|)
+@@ -374,6 +372,8 @@ Additionally, there are runtime-loaded capabilities:
+
+ * :ref:`ddx <sec:ddx>` |w---w| https://github.com/ddsolvation/ddx
+
++* QCManyBody |w---w| `[what is QCManyBody?] <https://molssi.github.io/QCManyBody/>`_ (May 2025; optional by v1.11; * August 2025; added required by v1.10; runtime dependency, optional at build-time)
++
+
+ .. _`faq:condapsi4dev`:
+
+diff --git a/doc/sphinxman/source/external.rst b/doc/sphinxman/source/external.rst
+index 14fd2758e0c..54f8c3a4711 100644
+--- a/doc/sphinxman/source/external.rst
++++ b/doc/sphinxman/source/external.rst
+@@ -723,4 +723,5 @@ These environment variables will influence |PSIfours| behavior.
+ .. envvar:: QCMANYBODY_EMBEDDING_CHARGES
+
+ Set to allow embedding charges with many-body/counterpoise computations.
++ Relevant when QCManyBody addon is present.
+
+diff --git a/doc/sphinxman/source/nbody.rst b/doc/sphinxman/source/nbody.rst
+index cd51c98142b..13778efd450 100644
+--- a/doc/sphinxman/source/nbody.rst
++++ b/doc/sphinxman/source/nbody.rst
+@@ -50,7 +50,8 @@ Basis Set Superposition Corrections
+
+ The nbody function computes counterpoise-corrected (CP), non-CP (noCP), and Valiron-Mayer Function Counterpoise (VMFC) interaction energies for complexes composed of arbitrary numbers of monomers.
+
+-.. caution:: August 2025, v1.10 many-body computations are no longer
++.. caution:: May 2026, v1.11 QCManyBody is no longer required but may need to be
++ separately installed. August 2025, v1.10 many-body computations are no longer
+ using internal driver code but have been offloaded to QCManyBody
+ software.
+
+diff --git a/external/upstream/qcmanybody/CMakeLists.txt b/external/upstream/qcmanybody/CMakeLists.txt
+index cb510f0f67c..ef1aefbb53a 100644
+--- a/external/upstream/qcmanybody/CMakeLists.txt
++++ b/external/upstream/qcmanybody/CMakeLists.txt
+@@ -1,41 +1,45 @@
+-if(NOT (${CMAKE_DISABLE_FIND_PACKAGE_qcmanybody}))
+- include(FindPythonModule)
+- find_python_module(qcmanybody ATLEAST 0.5.1 QUIET)
+-endif()
++if(${ENABLE_qcmanybody})
++ if(NOT (${CMAKE_DISABLE_FIND_PACKAGE_qcmanybody}))
++ include(FindPythonModule)
++ find_python_module(qcmanybody ATLEAST 0.5.1 QUIET)
++ endif()
+
+-if(${qcmanybody_FOUND})
+- message(STATUS "${Cyan}Found qcmanybody${ColourReset}: ${PY_qcmanybody} (found version ${qcmanybody_VERSION})")
+- add_library(qcmanybody_external INTERFACE) # dummy
++ if(${qcmanybody_FOUND})
++ message(STATUS "${Cyan}Found qcmanybody${ColourReset}: ${PY_qcmanybody} (found version ${qcmanybody_VERSION})")
++ add_library(qcmanybody_external INTERFACE) # dummy
+
+- if(${CMAKE_INSIST_FIND_PACKAGE_qcmanybody})
+- message(VERBOSE "Suitable qcmanybody located externally as user insists")
+- endif()
++ if(${CMAKE_INSIST_FIND_PACKAGE_qcmanybody})
++ message(VERBOSE "Suitable qcmanybody located externally as user insists")
++ endif()
+
+-else()
+- if(${CMAKE_INSIST_FIND_PACKAGE_qcmanybody})
+- message(FATAL_ERROR "Suitable qcmanybody could not be externally located as user insists")
+- endif()
++ else()
++ if(${CMAKE_INSIST_FIND_PACKAGE_qcmanybody})
++ message(FATAL_ERROR "Suitable qcmanybody could not be externally located as user insists")
++ endif()
+
+- include(ExternalProject)
+- message(STATUS "Suitable qcmanybody could not be located, ${Magenta}Building qcmanybody${ColourReset} instead.")
++ include(ExternalProject)
++ message(STATUS "Suitable qcmanybody could not be located, ${Magenta}Building qcmanybody${ColourReset} instead.")
+
+- file(TO_NATIVE_PATH "${STAGED_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}${PYMOD_INSTALL_LIBDIR}" _install_lib)
++ file(TO_NATIVE_PATH "${STAGED_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}${PYMOD_INSTALL_LIBDIR}" _install_lib)
+
+- # Must have specialty egg to compute version correctly, so the URL is only grabbing a dummy file. It's
+- # the pip command that's really selecting the source.
+- ExternalProject_Add(qcmanybody_external
+- DEPENDS qcelemental_external
+- qcengine_external
+- BUILD_ALWAYS 1
+- DOWNLOAD_COMMAND ""
+- CONFIGURE_COMMAND ""
+- UPDATE_COMMAND ""
+- BUILD_COMMAND ""
+- BUILD_IN_SOURCE 1
+- # master: INSTALL_COMMAND ${Python_EXECUTABLE} -m pip install git+https://github.com/MolSSI/ QCManyBody.git#egg=proj
+- INSTALL_COMMAND ${Python_EXECUTABLE} -m pip install git+https://github.com/MolSSI/QCManyBody.git@v0.5.1#egg=proj # edit in codedeps
+- --target=${_install_lib}
+- --no-deps
+- #-v
+- )
++ # Must have specialty egg to compute version correctly, so the URL is only grabbing a dummy file. It's
++ # the pip command that's really selecting the source.
++ ExternalProject_Add(qcmanybody_external
++ DEPENDS qcelemental_external
++ qcengine_external
++ BUILD_ALWAYS 1
++ DOWNLOAD_COMMAND ""
++ CONFIGURE_COMMAND ""
++ UPDATE_COMMAND ""
++ BUILD_COMMAND ""
++ BUILD_IN_SOURCE 1
++ # master: INSTALL_COMMAND ${Python_EXECUTABLE} -m pip install git+https://github.com/MolSSI/ QCManyBody.git#egg=proj
++ INSTALL_COMMAND ${Python_EXECUTABLE} -m pip install git+https://github.com/MolSSI/QCManyBody.git@v0.5.1#egg=proj # edit in codedeps
++ --target=${_install_lib}
++ --no-deps
++ #-v
++ )
++ endif()
++else()
++ add_library(qcmanybody_external INTERFACE) # dummy
+ endif()
+diff --git a/psi4/__init__.py b/psi4/__init__.py
+index 22332ee30ec..418a8646d62 100644
+--- a/psi4/__init__.py
++++ b/psi4/__init__.py
+@@ -120,6 +120,8 @@
+ sys.path.insert(1, r"@gdma_PYMOD@")
+ if "@ENABLE_bse@".upper() in ["1", "ON", "YES", "TRUE", "Y"]: # bse
+ sys.path.insert(1, r"@bse_PYMOD@")
++if "@ENABLE_qcmanybody@".upper() in ["1", "ON", "YES", "TRUE", "Y"]: # qcmanybody
++ sys.path.insert(1, r"@qcmanybody_PYMOD@")
+
+ # Create a custom logger
+ import logging
+diff --git a/psi4/driver/driver_nbody.py b/psi4/driver/driver_nbody.py
+index a554b9b4118..02eef5a899b 100644
+--- a/psi4/driver/driver_nbody.py
++++ b/psi4/driver/driver_nbody.py
+@@ -119,9 +119,30 @@
+ from pydantic.v1 import validator
+
+ from qcelemental.models import Molecule
+-from qcmanybody.models.v1 import AtomicSpecification, ManyBodyInput, ManyBodyResult, BsseEnum
+-from qcmanybody import ManyBodyCore, ManyBodyComputer as ManyBodyComputerQCNG
+-from qcmanybody.utils import delabeler, labeler, translate_qcvariables, modelchem_labels
++
++_QCMANYBODY_IMPORT_ERROR = None
++try:
++ from qcmanybody.models.v1 import AtomicSpecification, ManyBodyInput, ManyBodyResult, BsseEnum
++ from qcmanybody import ManyBodyCore, ManyBodyComputer as ManyBodyComputerQCNG
++ from qcmanybody.utils import delabeler, labeler, translate_qcvariables, modelchem_labels
++except ModuleNotFoundError as err:
++ _QCMANYBODY_IMPORT_ERROR = err
++ AtomicSpecification = Any
++ ManyBodyInput = Any
++ ManyBodyResult = Any
++ BsseEnum = Any
++ ManyBodyCore = Any
++ ManyBodyComputerQCNG = object
++
++
++def _ensure_qcmanybody() -> None:
++ if _QCMANYBODY_IMPORT_ERROR is None:
++ return
++
++ raise ModuleNotFoundError(
++ "Python module qcmanybody not found that is required for many-body/counterpoise (`bsse_type`) computations. "
++ "Solve by installing it: `conda install -c conda-forge qcmanybody` or `pip install qcmanybody`"
++ ) from _QCMANYBODY_IMPORT_ERROR
+
+ if TYPE_CHECKING:
+ import qcportal
+@@ -410,6 +431,8 @@ def set_molecule(cls, v: Any) -> Molecule:
+ @classmethod
+ def from_psi4_task_planner(cls, *, molecule, method, basis, driver, keywords, **mbkwargs):
+
++ _ensure_qcmanybody()
++
+ atomic_spec = AtomicSpecification(
+ model={"method": method, "basis": basis},
+ program="psi4",
+@@ -506,6 +529,8 @@ def build_tasks(
+ Number of new tasks planned by this call including any supersystem.
+
+ """
++ _ensure_qcmanybody()
++
+ # TODO method not coming from levels right
+
+ # Get the n-body orders for this level. e.g., [1] or [2, 3] or ["supersystem"]
+@@ -575,6 +600,8 @@ def get_results(
+ All MBE results collected into a QCSchema model.
+
+ """
++ _ensure_qcmanybody()
++
+ component_results = {k: v.get_results(client=client) for k, v in self.task_list.items()}
+ component_properties = {}
+ props = {"energy", "gradient", "hessian"}
+diff --git a/psi4/extras.py b/psi4/extras.py
+index 794c4dae547..c3b5a6011d9 100644
+--- a/psi4/extras.py
++++ b/psi4/extras.py
+@@ -180,6 +180,7 @@ def psi4_which(command, *, return_bool: bool = False, raise_error: bool = False,
+ "gauxc": _CMake_to_Py_boolean("@ENABLE_gauxc@"),
+ "integratorxx": _CMake_to_Py_boolean("@ENABLE_IntegratorXX@"),
+ "ooo": _CMake_to_Py_boolean("@ENABLE_OpenOrbitalOptimizer@"),
++ "qcmanybody": which_import("qcmanybody", return_bool=True),
+ }
+
+
+diff --git a/pytest.ini b/pytest.ini
+index 45057bbb9ad..66f90ad870d 100644
+--- a/pytest.ini
++++ b/pytest.ini
+@@ -93,7 +93,7 @@ markers =
+ mints
+ mom
+ mp2
+- nbody: "tests that use the nbody aka manybody wrapper"
++ nbody: "tests that use the nbody aka manybody wrapper; alias to qcmanybody marker"
+ noc1
+ numint: "tests that use NumIntHelper"
+ numpy
+@@ -180,6 +180,7 @@ markers =
+ qcfractal: "tests using QCFractal software; skip if unavailable"
+ qcfractal_next: "tests using QCFractal software, next branch; skip if unavailable"
+ qcportal: "tests using QCPortal software; skip if unavailable"
++ qcmanybody: "tests using QCManyBody software; skip if unavailable; alias to nbody marker"
+ psi4
+
+
+@@ -187,4 +188,3 @@ markers =
+ # filterwarnings =
+ # error
+ # ignore:unclosed file:ResourceWarning
+-
+diff --git a/tests/cbs-xtpl-nbody/test_input.py b/tests/cbs-xtpl-nbody/test_input.py
+index 27584e7d16f..c34e747f100 100644
+--- a/tests/cbs-xtpl-nbody/test_input.py
++++ b/tests/cbs-xtpl-nbody/test_input.py
+@@ -1,6 +1,6 @@
+ from addons import *
+
+-@ctest_labeler("cbs;nbody")
++@uusing("qcmanybody")
++@ctest_labeler("cbs")
+ def test_cbs_xtpl_nbody():
+ ctest_runner(__file__)
+-
+diff --git a/tests/ddd-function-kwargs/test_input.py b/tests/ddd-function-kwargs/test_input.py
+index d56b322c643..37216a71829 100644
+--- a/tests/ddd-function-kwargs/test_input.py
++++ b/tests/ddd-function-kwargs/test_input.py
+@@ -1,6 +1,6 @@
+ from addons import *
+
+-@ctest_labeler("findif;nbody;gradient")
++@uusing("qcmanybody")
++@ctest_labeler("findif;gradient")
+ def test_ddd_function_kwargs():
+ ctest_runner(__file__)
+-
+diff --git a/tests/dfmp2-1/test_input.py b/tests/dfmp2-1/test_input.py
+index 4f8f3b89542..199f1da3d4f 100644
+--- a/tests/dfmp2-1/test_input.py
++++ b/tests/dfmp2-1/test_input.py
+@@ -1,6 +1,6 @@
+ from addons import *
+
+-@ctest_labeler("quick;smoke;df;dfmp2;cart;nbody")
++@uusing("qcmanybody")
++@ctest_labeler("quick;smoke;df;dfmp2;cart")
+ def test_dfmp2_1():
+ ctest_runner(__file__)
+-
+diff --git a/tests/dfmp2-ecp/test_input.py b/tests/dfmp2-ecp/test_input.py
+index 8a21eda1c89..2441b0fd5e9 100644
+--- a/tests/dfmp2-ecp/test_input.py
++++ b/tests/dfmp2-ecp/test_input.py
+@@ -2,7 +2,8 @@
+ from addons import *
+
+ @uusing("ecpint")
+-@ctest_labeler("quick;df;dfmp2;ecp;nbody")
++@uusing("qcmanybody")
++@ctest_labeler("quick;df;dfmp2;ecp")
+ @pytest.mark.parametrize("oopkg", [
+ pytest.param(False, id="internal"),
+ pytest.param(True, id="openorbitaloptimizer", marks=using("ooo")),
+diff --git a/tests/dfmp2-fc/test_input.py b/tests/dfmp2-fc/test_input.py
+index 5141f0227b2..eda3ee25477 100644
+--- a/tests/dfmp2-fc/test_input.py
++++ b/tests/dfmp2-fc/test_input.py
+@@ -1,6 +1,6 @@
+ from addons import *
+
+-@ctest_labeler("quick;df;dfmp2;nbody")
++@uusing("qcmanybody")
++@ctest_labeler("quick;df;dfmp2")
+ def test_dfmp2_fc():
+ ctest_runner(__file__)
+-
+diff --git a/tests/dft-custom-dhdf/test_input.py b/tests/dft-custom-dhdf/test_input.py
+index 7d649f38da6..eb136c2210b 100644
+--- a/tests/dft-custom-dhdf/test_input.py
++++ b/tests/dft-custom-dhdf/test_input.py
+@@ -1,6 +1,6 @@
+ from addons import *
+
+-@ctest_labeler("dft;scf;nbody")
++@uusing("qcmanybody")
++@ctest_labeler("dft;scf")
+ def test_dft_custom_dhdf():
+ ctest_runner(__file__)
+-
+diff --git a/tests/dftd3/nbody-cp-gradient/test_input.py b/tests/dftd3/nbody-cp-gradient/test_input.py
+index 07746f35f27..1d26cb042b3 100644
+--- a/tests/dftd3/nbody-cp-gradient/test_input.py
++++ b/tests/dftd3/nbody-cp-gradient/test_input.py
+@@ -1,6 +1,7 @@
+ from addons import *
+
+ @uusing("dftd3")
+-@ctest_labeler("cart;nbody;gradient")
++@uusing("qcmanybody")
++@ctest_labeler("cart;gradient")
+ def test_dftd3_nbody_cp_gradient():
+ ctest_runner(__file__)
+diff --git a/tests/mp2-def2/test_input.py b/tests/mp2-def2/test_input.py
+index b3d6ab9a736..c9f7e562bac 100644
+--- a/tests/mp2-def2/test_input.py
++++ b/tests/mp2-def2/test_input.py
+@@ -1,6 +1,6 @@
+ from addons import *
+
+-@ctest_labeler("mp2;cart;nbody")
++@uusing("qcmanybody")
++@ctest_labeler("mp2;cart")
+ def test_mp2_def2():
+ ctest_runner(__file__)
+-
+diff --git a/tests/nbody-convergence/test_input.py b/tests/nbody-convergence/test_input.py
+index ca79137c733..85818e08324 100644
+--- a/tests/nbody-convergence/test_input.py
++++ b/tests/nbody-convergence/test_input.py
+@@ -1,6 +1,6 @@
+ from addons import *
+
+-@ctest_labeler("nbody;gradient")
++@uusing("qcmanybody")
++@ctest_labeler("gradient")
+ def test_nbody_convergence():
+ ctest_runner(__file__)
+-
+diff --git a/tests/nbody-cp-gradient/test_input.py b/tests/nbody-cp-gradient/test_input.py
+index c12444621b6..aa7e6cee22b 100644
+--- a/tests/nbody-cp-gradient/test_input.py
++++ b/tests/nbody-cp-gradient/test_input.py
+@@ -1,12 +1,12 @@
+ import pytest
+ from addons import *
+
++@uusing("qcmanybody")
+ @pytest.mark.parametrize("distributed", [
+ pytest.param(False, id="internal"),
+ pytest.param(True, id="snowflake", marks=using("qcfractal_next")),
+ ])
+-@ctest_labeler("nbody;gradient")
++@ctest_labeler("gradient")
+ def test_nbody_cp_gradient(distributed):
+ setenv = ["_PSI4_USE_QCF"] if distributed else None
+ ctest_runner(__file__, setenv=setenv)
+-
+diff --git a/tests/nbody-freq/test_input.py b/tests/nbody-freq/test_input.py
+index 4179468c85f..a00baa262df 100644
+--- a/tests/nbody-freq/test_input.py
++++ b/tests/nbody-freq/test_input.py
+@@ -1,6 +1,6 @@
+ from addons import *
+
+-@ctest_labeler("nbody;freq;hessian;gradient;opt")
++@uusing("qcmanybody")
++@ctest_labeler("freq;hessian;gradient;opt")
+ def test_nbody_freq():
+ ctest_runner(__file__)
+-
+diff --git a/tests/nbody-he-4b/test_input.py b/tests/nbody-he-4b/test_input.py
+index 02fd908076f..f9bf44c7f85 100644
+--- a/tests/nbody-he-4b/test_input.py
++++ b/tests/nbody-he-4b/test_input.py
+@@ -1,12 +1,12 @@
+ import pytest
+ from addons import *
+
++@uusing("qcmanybody")
+ @pytest.mark.parametrize("distributed", [
+ pytest.param(False, id="internal"),
+ pytest.param(True, id="snowflake", marks=using("qcfractal_next")),
+ ])
+-@ctest_labeler("nbody;cart")
++@ctest_labeler("cart")
+ def test_nbody_he_4b(distributed):
+ setenv = ["_PSI4_USE_QCF"] if distributed else None
+ ctest_runner(__file__, setenv=setenv)
+-
+diff --git a/tests/nbody-he-cluster/test_input.py b/tests/nbody-he-cluster/test_input.py
+index b2df4668d78..ca40affec67 100644
+--- a/tests/nbody-he-cluster/test_input.py
++++ b/tests/nbody-he-cluster/test_input.py
+@@ -1,6 +1,6 @@
+ from addons import *
+
+-@ctest_labeler("nbody;cart")
++@uusing("qcmanybody")
++@ctest_labeler("cart")
+ def test_nbody_he_cluster():
+ ctest_runner(__file__)
+-
+diff --git a/tests/nbody-hessian/test_input.py b/tests/nbody-hessian/test_input.py
+index fb54e2c8fbe..906c029cbe2 100644
+--- a/tests/nbody-hessian/test_input.py
++++ b/tests/nbody-hessian/test_input.py
+@@ -1,6 +1,6 @@
+ from addons import *
+
+-@ctest_labeler("nbody;hessian")
++@uusing("qcmanybody")
++@ctest_labeler("hessian")
+ def test_nbody_hessian():
+ ctest_runner(__file__)
+-
+diff --git a/tests/nbody-intermediates/test_input.py b/tests/nbody-intermediates/test_input.py
+index 3daeb7079fc..625cd8729e8 100644
+--- a/tests/nbody-intermediates/test_input.py
++++ b/tests/nbody-intermediates/test_input.py
+@@ -1,6 +1,6 @@
+ from addons import *
+
+-@ctest_labeler("nbody")
++@uusing("qcmanybody")
++@ctest_labeler("")
+ def test_nbody_intermediates():
+ ctest_runner(__file__)
+-
+diff --git a/tests/nbody-multi-level-2/test_input.py b/tests/nbody-multi-level-2/test_input.py
+index 75aac98456a..6e7da06eb9b 100644
+--- a/tests/nbody-multi-level-2/test_input.py
++++ b/tests/nbody-multi-level-2/test_input.py
+@@ -1,6 +1,6 @@
+ from addons import *
+
+-@ctest_labeler("nbody")
++@uusing("qcmanybody")
++@ctest_labeler("")
+ def test_nbody_multi_level_2():
+ ctest_runner(__file__)
+-
+diff --git a/tests/nbody-multi-level/test_input.py b/tests/nbody-multi-level/test_input.py
+index 99c0c9faca0..0afe1a1bc9e 100644
+--- a/tests/nbody-multi-level/test_input.py
++++ b/tests/nbody-multi-level/test_input.py
+@@ -1,7 +1,8 @@
+ import pytest
+ from addons import *
+
+-@ctest_labeler("nbody;extern")
++@uusing("qcmanybody")
++@ctest_labeler("extern")
+ @pytest.mark.parametrize("distributed", [
+ pytest.param(False, id="internal"),
+ pytest.param(True, id="snowflake", marks=[*using("qcfractal_next"), pytest.mark.medlong]),
+@@ -10,4 +11,3 @@ def test_nbody_multi_level(distributed, monkeypatch):
+ setenv = ["_PSI4_USE_QCF"] if distributed else None
+ monkeypatch.setenv("QCMANYBODY_EMBEDDING_CHARGES", "1")
+ ctest_runner(__file__, setenv=setenv)
+-
+diff --git a/tests/nbody-nocp-gradient/test_input.py b/tests/nbody-nocp-gradient/test_input.py
+index cc75771ad37..55a9bef4dc1 100644
+--- a/tests/nbody-nocp-gradient/test_input.py
++++ b/tests/nbody-nocp-gradient/test_input.py
+@@ -1,6 +1,6 @@
+ from addons import *
+
+-@ctest_labeler("nbody;gradient")
++@uusing("qcmanybody")
++@ctest_labeler("gradient")
+ def test_nbody_nocp_gradient():
+ ctest_runner(__file__)
+-
+diff --git a/tests/nbody-vmfc-gradient/test_input.py b/tests/nbody-vmfc-gradient/test_input.py
+index fa2ec7d45c2..0027999bc7c 100644
+--- a/tests/nbody-vmfc-gradient/test_input.py
++++ b/tests/nbody-vmfc-gradient/test_input.py
+@@ -1,6 +1,6 @@
+ from addons import *
+
+-@ctest_labeler("nbody;gradient")
++@uusing("qcmanybody")
++@ctest_labeler("gradient")
+ def test_nbody_vmfc_gradient():
+ ctest_runner(__file__)
+-
+diff --git a/tests/nbody-vmfc-hessian/test_input.py b/tests/nbody-vmfc-hessian/test_input.py
+index 6b3872fc592..7cc3d08be9a 100644
+--- a/tests/nbody-vmfc-hessian/test_input.py
++++ b/tests/nbody-vmfc-hessian/test_input.py
+@@ -1,7 +1,8 @@
+ import pytest
+ from addons import *
+
+-@ctest_labeler("nbody;hessian;d2ints")
++@uusing("qcmanybody")
++@ctest_labeler("hessian;d2ints")
+
+ @pytest.mark.parametrize("distributed", [
+ pytest.param(False, id="internal"),
+@@ -10,4 +11,3 @@
+ def test_nbody_vmfc_hessian(distributed):
+ setenv = ["_PSI4_USE_QCF"] if distributed else None
+ ctest_runner(__file__, setenv=setenv)
+-
+diff --git a/tests/pytests/addons.py b/tests/pytests/addons.py
+index c6518356819..644f1a42a4e 100644
+--- a/tests/pytests/addons.py
++++ b/tests/pytests/addons.py
+@@ -90,6 +90,7 @@ def is_nvidia_gpu_present():
+ "qcfractal": which_import("qcfractal", return_bool=True),
+ "qcfractal_next": is_qcfractal_new_enough("0.49"),
+ "qcportal": which_import("qcportal", return_bool=True),
++ "qcmanybody": which_import("qcmanybody", return_bool=True),
+ "bse": which_import("basis_set_exchange", return_bool=True),
+ "einsums": psi4.addons("einsums"),
+ "pyeinsums": which_import("einsums", return_bool=True),
+@@ -126,7 +127,10 @@ def _using(program: str) -> None:
+ general = pytest.mark.addon
+ particular = getattr(pytest.mark, program)
+
+- all_marks = (skip, general, particular)
++ if program == "qcmanybody":
++ all_marks = (skip, general, particular, getattr(pytest.mark, "nbody"))
++ else:
++ all_marks = (skip, general, particular)
+ _using_cache[program] = [_compose_decos(all_marks), all_marks]
+
+
+diff --git a/tests/pytests/test_addons.py b/tests/pytests/test_addons.py
+index 60f809eef17..36eaf76f83b 100644
+--- a/tests/pytests/test_addons.py
++++ b/tests/pytests/test_addons.py
+@@ -907,7 +907,7 @@ def test_gpu_dfcc():
+
+
+
+-@pytest.mark.nbody
++@uusing("qcmanybody")
+ @uusing("dftd3")
+ @uusing("gcp")
+ def test_grimme_3c():
+@@ -1617,4 +1617,3 @@ def test_pyeinsums_gemm(a, b, c, dtype, array):
+ for i in range(a):
+ for j in range(c):
+ assert C[i, j] == pytest.approx(C_actual[i, j])
+-
+diff --git a/tests/pytests/test_addons_qcschema.py b/tests/pytests/test_addons_qcschema.py
+index 3daa45977ca..afd2c832785 100644
+--- a/tests/pytests/test_addons_qcschema.py
++++ b/tests/pytests/test_addons_qcschema.py
+@@ -562,7 +562,7 @@ def test_v2rdm_casscf():
+ # assert psi4.compare_values(en_gpu_dfcc, en_dfcc, 8, "CCSD total energy")
+
+
+-@pytest.mark.nbody
++@uusing("qcmanybody")
+ @uusing("dftd3")
+ @uusing("gcp")
+ def test_grimme_3c():
+@@ -829,4 +829,3 @@ def test_ddx_tdscf_gaussian():
+ for i in range(5):
+ e_calc.append(atres.extras["qcvars"][f'TD-HF ROOT 0 -> ROOT {i+1} EXCITATION ENERGY - A TRANSITION'])
+ psi4.compare_values(exc_energies[:5], e_calc, 4, 'PCM EXCITATION ENERGY ')
+-
+diff --git a/tests/pytests/test_compositejk.py b/tests/pytests/test_compositejk.py
+index b0030c87f7e..dc2bc36428a 100644
+--- a/tests/pytests/test_compositejk.py
++++ b/tests/pytests/test_compositejk.py
+@@ -111,7 +111,7 @@ def test_composite_call(j_algo, k_algo, mols, request):
+ "molecule" : "h2o_nap1",
+ "bsse_type" : "CP",
+ },
+- marks=pytest.mark.nbody,
++ marks=using("qcmanybody"),
+ id="h2o/na+ (rhf ie)"),
+ ],
+ )
+@@ -216,7 +216,7 @@ def test_seminum(inp, scf, mols, request):
+ "molecule" : "h2o_nap1",
+ "bsse_type" : "CP",
+ },
+- marks=pytest.mark.nbody,
++ marks=using("qcmanybody"),
+ id="h2o/na+ (rhf ie)"),
+ ],
+ )
+diff --git a/tests/pytests/test_dft_benchmarks.py b/tests/pytests/test_dft_benchmarks.py
+index 975e3cc39b0..106ac5d48d3 100644
+--- a/tests/pytests/test_dft_benchmarks.py
++++ b/tests/pytests/test_dft_benchmarks.py
+@@ -2,7 +2,7 @@
+
+ import pytest
+ from utils import *
+-from addons import using
++from addons import using, uusing
+
+ import psi4
+
+@@ -178,7 +178,7 @@ def test_dft_bench_ionization(func, expected, basis, dft_bench_systems, request)
+
+
+
+-@pytest.mark.nbody
++@uusing("qcmanybody")
+ @pytest.mark.scf
+ @pytest.mark.dft
+ @pytest.mark.long
+diff --git a/tests/pytests/test_dftd3.py b/tests/pytests/test_dftd3.py
+index 552a167cb4e..7e0461ed2bf 100644
+--- a/tests/pytests/test_dftd3.py
++++ b/tests/pytests/test_dftd3.py
+@@ -113,7 +113,7 @@ def test_dftd3_dft_grad_lr3():
+ s16_r2scan50_psi4 = np.array([-155.6575747, -78.4586347, -77.1962996])
+
+
+-@pytest.mark.nbody
++@uusing("qcmanybody")
+ @pytest.mark.parametrize("mode", [
+ pytest.param("abs", marks=pytest.mark.long),
+ pytest.param("ie", marks=pytest.mark.quick),
+@@ -191,4 +191,3 @@ def test_grimme_3c(mtdbas, ref, mode):
+
+ ene = psi4.energy(mtdbas, bsse_type='nocp')
+ assert psi4.compare_values(kcal * (ref[0] - ref[1] - ref[2]), kcal * ene, 1.1e-3, mtdbas)
+-
+diff --git a/tests/pytests/test_nbody.py b/tests/pytests/test_nbody.py
+index 5741f5046b4..24b9dacaf97 100644
+--- a/tests/pytests/test_nbody.py
++++ b/tests/pytests/test_nbody.py
+@@ -2,9 +2,10 @@
+ import pytest
+ import numpy as np
+ from qcelemental.testing import compare, compare_values
++from addons import uusing
+ import psi4
+
+-pytestmark = [pytest.mark.psi, pytest.mark.api, pytest.mark.nbody]
++pytestmark = [pytest.mark.psi, pytest.mark.api]
+
+ _tot_cp_ene = -155.40761029
+ _ie_cp_ene = -0.00172611
+@@ -121,6 +122,7 @@
+ ("gradient", ["nocp", "cp"], None , 5, _tot_uncp_grad, "uncpcp"), # return tot G 5
+ ("gradient", ["nocp", "ssfc"], None , 5, _tot_uncp_grad, "uncpcp"), # return tot G 5
+ ])
++@uusing("qcmanybody")
+ def test_nbody_number(driver, bsse_type, return_total_data, nbody_number, return_result, stdoutkey):
+
+ eneyne = psi4.geometry("""
+@@ -160,4 +162,3 @@ def test_nbody_number(driver, bsse_type, return_total_data, nbody_number, return
+ assert compare_values(return_result, ret.return_result, atol=1.e-6, label="manybody")
+ assert compare(nbody_number, ret.extras["qcvars"]["NBODY NUMBER"], label="nbody number")
+ assert re.search(_stdouts[stdoutkey], ret.stdout, re.MULTILINE), f"N-Body pattern not found: {_stdouts[stdoutkey]}"
+-
+diff --git a/tests/pytests/test_nbody_multi_level_qcschema.py b/tests/pytests/test_nbody_multi_level_qcschema.py
+index be576046cf6..7b79e3d6c0c 100644
+--- a/tests/pytests/test_nbody_multi_level_qcschema.py
++++ b/tests/pytests/test_nbody_multi_level_qcschema.py
+@@ -3,10 +3,11 @@
+ import pprint
+
+ import pytest
++from addons import uusing
+
+ import psi4
+
+-pytestmark = [pytest.mark.psi, pytest.mark.api, pytest.mark.nbody]
++pytestmark = [pytest.mark.psi, pytest.mark.api]
+
+ @pytest.fixture
+ def base_schema():
+@@ -65,6 +66,7 @@ def base_schema():
+ 'VMFC-CORRECTED TOTAL ENERGY THROUGH 2-BODY': -224.943882712817},
+ id='nbody-embedded', marks=pytest.mark.extern),
+ ])
++@uusing("qcmanybody")
+ def test_nbody_levels(inp, expected, base_schema, monkeypatch):
+ monkeypatch.setenv("QCMANYBODY_EMBEDDING_CHARGES", "1")
+ # reference for nbody-multilevel generated with this larger fitting basis for sto-3g. fails otherwise by 3.e-5
+@@ -85,4 +87,3 @@ def test_nbody_levels(inp, expected, base_schema, monkeypatch):
+
+ for b, v in expected.items():
+ assert psi4.compare_values(v, otp.extras["qcvars"][b], 6, b)
+-
+diff --git a/tests/pytests/test_psi4.py b/tests/pytests/test_psi4.py
+index d7df6249f2e..8eacacc12b7 100644
+--- a/tests/pytests/test_psi4.py
++++ b/tests/pytests/test_psi4.py
+@@ -1,5 +1,6 @@
+ import numpy as np
+ import pytest
++from addons import uusing
+
+ import psi4
+
+@@ -85,7 +86,7 @@ def test_psi4_cas():
+ assert psi4.compare_values(-76.073865006902, casscf_energy, 6, 'CASSCF Energy')
+
+
+-@pytest.mark.nbody
++@uusing("qcmanybody")
+ @pytest.mark.smoke
+ def test_psi4_dfmp2():
+ """dfmp2-1"""
+diff --git a/tests/pytests/test_psi4_qcschema.py b/tests/pytests/test_psi4_qcschema.py
+index 295d44f572d..0576d989b02 100644
+--- a/tests/pytests/test_psi4_qcschema.py
++++ b/tests/pytests/test_psi4_qcschema.py
+@@ -4,6 +4,7 @@
+ import pprint
+ import os
+ from shutil import copytree
++from addons import uusing
+
+ import psi4
+
+@@ -95,7 +96,7 @@ def test_psi4_cas(datadir):
+ assert psi4.compare_values(-76.073865006902, atres.return_result, 6, 'CASSCF Energy')
+
+
+-@pytest.mark.nbody
++@uusing("qcmanybody")
+ def test_psi4_dfmp2(datadir):
+ """dfmp2-1"""
+ #! Density fitted MP2 cc-PVDZ/cc-pVDZ-RI computation of formic acid dimer binding energy
+diff --git a/tests/tu6-cp-ne2/test_input.py b/tests/tu6-cp-ne2/test_input.py
+index d4086c15ee3..138e8e005ca 100644
+--- a/tests/tu6-cp-ne2/test_input.py
++++ b/tests/tu6-cp-ne2/test_input.py
+@@ -1,6 +1,6 @@
+ from addons import *
+
+-@ctest_labeler("tutorial;nbody")
++@uusing("qcmanybody")
++@ctest_labeler("tutorial")
+ def test_tu6_cp_ne2():
+ ctest_runner(__file__)
+-
diff --git a/3400.patch b/3400.patch
new file mode 100644
index 0000000..795a244
--- /dev/null
+++ b/3400.patch
@@ -0,0 +1,52 @@
+From 18f43c3713c8e791e80e797fa0bd3e1feb98a709 Mon Sep 17 00:00:00 2001
+From: Susi Lehtola <susi.lehtola@gmail.com>
+Date: Mon, 18 May 2026 19:25:31 +0300
+Subject: [PATCH] cmake: forward per-config flag variants to psi4-core subbuild
+
+The outer superbuild's ExternalProject_Add(psi4-core ...) was forwarding
+CMAKE_<LANG>_FLAGS but none of the per-configuration variants
+(CMAKE_<LANG>_FLAGS_{DEBUG,RELEASE,RELWITHDEBINFO,MINSIZEREL}). A user
+override like -DCMAKE_CXX_FLAGS_RELEASE="-DNDEBUG" on the outer cmake
+landed in the outer cache but never reached the inner psi4-core build,
+which silently fell back to CMake's auto-populated defaults.
+
+Forward all four configuration variants for C, C++, and Fortran.
+
+Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
+---
+ CMakeLists.txt | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 26eeb21e6a..0ba53433c9 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -276,9 +276,17 @@ ExternalProject_Add(psi4-core
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
+ -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
++ -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}
++ -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}
++ -DCMAKE_CXX_FLAGS_RELWITHDEBINFO=${CMAKE_CXX_FLAGS_RELWITHDEBINFO}
++ -DCMAKE_CXX_FLAGS_MINSIZEREL=${CMAKE_CXX_FLAGS_MINSIZEREL}
+ -DCMAKE_SHARED_LINKER_FLAGS=${CMAKE_SHARED_LINKER_FLAGS}
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
++ -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}
++ -DCMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE}
++ -DCMAKE_C_FLAGS_RELWITHDEBINFO=${CMAKE_C_FLAGS_RELWITHDEBINFO}
++ -DCMAKE_C_FLAGS_MINSIZEREL=${CMAKE_C_FLAGS_MINSIZEREL}
+ -DCMAKE_CXX_STANDARD=${psi4_CXX_STANDARD}
+ -DCMAKE_CXX_STANDARD_REQUIRED=ON
+ -DCMAKE_CXX_EXTENSIONS=OFF
+@@ -287,6 +295,10 @@ ExternalProject_Add(psi4-core
+ -DCMAKE_VERBOSE_MAKEFILE=${CMAKE_VERBOSE_MAKEFILE}
+ -DCMAKE_Fortran_COMPILER=${CMAKE_Fortran_COMPILER}
+ -DCMAKE_Fortran_FLAGS=${CMAKE_Fortran_FLAGS}
++ -DCMAKE_Fortran_FLAGS_DEBUG=${CMAKE_Fortran_FLAGS_DEBUG}
++ -DCMAKE_Fortran_FLAGS_RELEASE=${CMAKE_Fortran_FLAGS_RELEASE}
++ -DCMAKE_Fortran_FLAGS_RELWITHDEBINFO=${CMAKE_Fortran_FLAGS_RELWITHDEBINFO}
++ -DCMAKE_Fortran_FLAGS_MINSIZEREL=${CMAKE_Fortran_FLAGS_MINSIZEREL}
+ -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR}
+ -DCMAKE_INSTALL_BINDIR=${CMAKE_INSTALL_BINDIR}
+ -DCMAKE_INSTALL_DATADIR=${CMAKE_INSTALL_DATADIR}
diff --git a/psi4-1.9.1-libint2.patch b/psi4-1.9.1-libint2.patch
deleted file mode 100644
index 42127c9..0000000
--- a/psi4-1.9.1-libint2.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-diff -up psi4-1.9.1/psi4/src/psi4/libmints/basisset.cc.libint2 psi4-1.9.1/psi4/src/psi4/libmints/basisset.cc
---- psi4-1.9.1/psi4/src/psi4/libmints/basisset.cc.libint2 2024-02-08 23:08:35.000000000 +0200
-+++ psi4-1.9.1/psi4/src/psi4/libmints/basisset.cc 2024-09-03 16:01:09.006045406 +0300
-@@ -875,8 +875,12 @@ void BasisSet::update_l2_shells(bool emb
-
- auto offset = shell_first_exponent_[ishell];
- auto nprim = n_prim_per_shell_[ishell];
-- auto l2c = libint2::svector<double>(&uoriginal_coefficients_[offset], &uoriginal_coefficients_[offset + nprim]);
-- auto l2e = libint2::svector<double>(&uexponents_[offset], &uexponents_[offset + nprim]);
-+ std::vector<double>::iterator c_first = uoriginal_coefficients_.begin() + offset;
-+ std::vector<double>::iterator c_last = c_first + nprim;
-+ auto l2c = libint2::svector<double>(c_first, c_last);
-+ std::vector<double>::iterator e_first = uexponents_.begin() + offset;
-+ std::vector<double>::iterator e_last = e_first + nprim;
-+ auto l2e = libint2::svector<double>(e_first, e_last);
- l2_shells_[ishell] = libint2::Shell{l2e, {{am, puream_, l2c}}, {{xyz[0], xyz[1], xyz[2]}}, embed_normalization};
- }
- }
diff --git a/psi4-1.9.1-libxc7.patch b/psi4-1.9.1-libxc7.patch
deleted file mode 100644
index 760fa27..0000000
--- a/psi4-1.9.1-libxc7.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-diff -up psi4-1.9.1/external/upstream/libxc/CMakeLists.txt.libxc7 psi4-1.9.1/external/upstream/libxc/CMakeLists.txt
---- psi4-1.9.1/external/upstream/libxc/CMakeLists.txt.libxc7 2024-10-12 18:09:47.710962946 +0000
-+++ psi4-1.9.1/external/upstream/libxc/CMakeLists.txt 2024-10-12 18:06:20.704708286 +0000
-@@ -1,4 +1,8 @@
--find_package(Libxc 6.1.0 CONFIG QUIET COMPONENTS C)
-+find_package(Libxc 7.0.0 CONFIG QUIET COMPONENTS C)
-+if(NOT ${Libxc_FOUND})
-+ # LibxcConfig.cmake encodes searching only within major version, so need two calls to allow v6 or v7
-+ find_package(Libxc 6.1.0 CONFIG QUIET COMPONENTS C)
-+endif()
-
- if(${Libxc_FOUND})
- get_property(_loc TARGET Libxc::xc PROPERTY LOCATION)
-diff -up psi4-1.9.1/psi4/CMakeLists.txt.libxc7 psi4-1.9.1/psi4/CMakeLists.txt
---- psi4-1.9.1/psi4/CMakeLists.txt.libxc7 2024-02-08 21:08:35.000000000 +0000
-+++ psi4-1.9.1/psi4/CMakeLists.txt 2024-10-12 18:08:15.510631119 +0000
-@@ -223,7 +223,10 @@ else()
- message(STATUS "Disabled BrianQC ${BrianQC_DIR}")
- endif()
-
--find_package(Libxc 6.1.0 CONFIG REQUIRED COMPONENTS C)
-+find_package(Libxc 7.0.0 CONFIG QUIET COMPONENTS C)
-+if(NOT ${Libxc_FOUND})
-+ find_package(Libxc 6.1.0 CONFIG REQUIRED COMPONENTS C)
-+endif()
- get_property(_loc TARGET Libxc::xc PROPERTY LOCATION)
- list(APPEND _addons ${_loc})
- message(STATUS "${Cyan}Using Libxc${ColourReset}: ${_loc} (version ${Libxc_VERSION})")
diff --git a/psi4-1.9.1-noecpgrad.patch b/psi4-1.9.1-noecpgrad.patch
deleted file mode 100644
index 338f746..0000000
--- a/psi4-1.9.1-noecpgrad.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -up psi4-1.9.1/tests/scf-ecp/input.dat.noecpgrad psi4-1.9.1/tests/scf-ecp/input.dat
---- psi4-1.9.1/tests/scf-ecp/input.dat.noecpgrad 2024-02-08 21:08:35.000000000 +0000
-+++ psi4-1.9.1/tests/scf-ecp/input.dat 2024-09-03 18:05:45.842596421 +0000
-@@ -20,8 +20,3 @@ set = {
- e = energy('scf')
- compare_values(nucenergy, arwater.nuclear_repulsion_energy(), 9, "Nuclear repulsion energy") #TEST
- compare_values(refenergy, e, 9, "SCF energy with ECP") #TEST
--
--agrad = gradient('scf')
--set points 5
--ngrad = gradient('scf', dertype=0)
--compare_matrices(agrad, ngrad, 8, "SCF ECP finite-diff (5-pt) vs. analytic gradient to 10^-8") #TEST
diff --git a/psi4-1.9.1-noqcetest.patch b/psi4-1.9.1-noqcetest.patch
deleted file mode 100644
index 0734190..0000000
--- a/psi4-1.9.1-noqcetest.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-diff -up psi4-1.9.1/tests/ddd-deriv/CMakeLists.txt.noqcetest psi4-1.9.1/tests/ddd-deriv/CMakeLists.txt
---- psi4-1.9.1/tests/ddd-deriv/CMakeLists.txt.noqcetest 2024-02-08 21:08:35.000000000 +0000
-+++ psi4-1.9.1/tests/ddd-deriv/CMakeLists.txt 2024-09-03 18:08:08.777068571 +0000
-@@ -1,3 +1,3 @@
- include(TestingMacros)
-
--add_regression_test(ddd-deriv "psi;quicktests;smoketests;findif")
-+add_regression_test(ddd-deriv "psi;quicktests;findif")
-diff -up psi4-1.9.1/tests/ddd-deriv/input.dat.noqcetest psi4-1.9.1/tests/ddd-deriv/input.dat
-diff -up psi4-1.9.1/tests/dfmp2-1/CMakeLists.txt.noqcetest psi4-1.9.1/tests/dfmp2-1/CMakeLists.txt
---- psi4-1.9.1/tests/dfmp2-1/CMakeLists.txt.noqcetest 2024-02-08 21:08:35.000000000 +0000
-+++ psi4-1.9.1/tests/dfmp2-1/CMakeLists.txt 2024-09-03 17:06:37.494295915 +0000
-@@ -1,3 +1,3 @@
- include(TestingMacros)
-
--add_regression_test(dfmp2-1 "psi;quicktests;smoketests;df;dfmp2;cart;nbody")
-+add_regression_test(dfmp2-1 "psi;quicktests;df;dfmp2;cart;nbody")
diff --git a/psi4-1.9.1-nostrip.patch b/psi4-1.9.1-nostrip.patch
deleted file mode 100644
index 732d695..0000000
--- a/psi4-1.9.1-nostrip.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-diff -up psi4-1.9.1/psi4/src/CMakeLists.txt.nostrip psi4-1.9.1/psi4/src/CMakeLists.txt
---- psi4-1.9.1/psi4/src/CMakeLists.txt.nostrip 2024-02-08 21:08:35.000000000 +0000
-+++ psi4-1.9.1/psi4/src/CMakeLists.txt 2024-09-03 19:05:21.153525742 +0000
-@@ -16,10 +16,6 @@ target_link_libraries(core
- pybind11::windows_extras
- )
- pybind11_extension(core)
--if(NOT MSVC AND NOT ${CMAKE_BUILD_TYPE} MATCHES Debug|RelWithDebInfo)
-- # Strip unnecessary sections of the binary on Linux/macOS
-- pybind11_strip(core)
--endif()
- set_target_properties(core PROPERTIES CXX_VISIBILITY_PRESET "hidden" VISIBILITY_INLINES_HIDDEN 1)
-
- ### >> Go into psi4 subdirectory to compile libraries and modules <<
-diff -up psi4-1.9.1/psi4/src/psi4/CMakeLists.txt.nostrip psi4-1.9.1/psi4/src/psi4/CMakeLists.txt
diff --git a/psi4-1.9.1-overflow.patch b/psi4-1.9.1-overflow.patch
deleted file mode 100644
index eb76b2f..0000000
--- a/psi4-1.9.1-overflow.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-diff -up psi4-1.9.1/psi4/src/psi4/libmints/eribase.cc.overflow psi4-1.9.1/psi4/src/psi4/libmints/eribase.cc
---- psi4-1.9.1/psi4/src/psi4/libmints/eribase.cc.overflow 2024-02-08 21:08:35.000000000 +0000
-+++ psi4-1.9.1/psi4/src/psi4/libmints/eribase.cc 2024-09-03 17:41:08.448741131 +0000
-@@ -3242,7 +3242,11 @@ size_t Libint2TwoElectronInt::compute_sh
- }
- } else {
- for (int i = 0; i < 12; ++i) {
-+ if(i<engines_[1].results().size()) {
- buffers_[i] = engines_[1].results()[i];
-+ } else {
-+ buffers_[i] = zero_vec_.data();
-+ }
- }
- ntot = 12 * sh1.size() * sh2.size() * sh3.size() * sh4.size();
- }
-@@ -3272,10 +3276,14 @@ size_t Libint2TwoElectronInt::compute_sh
- buffers_[i] = zero_vec_.data();
- }
- } else {
-- for (int i = 0; i < 78; ++i) {
-- buffers_[i] = engines_[2].results()[i];
-- }
-- ntot = 78 * sh1.size() * sh2.size() * sh3.size() * sh4.size();
-+ for (int i = 0; i < 78; ++i) {
-+ if(i<engines_[2].results().size()) {
-+ buffers_[i] = engines_[2].results()[i];
-+ } else {
-+ buffers_[i] = zero_vec_.data();
-+ }
-+ }
-+ ntot = 78 * sh1.size() * sh2.size() * sh3.size() * sh4.size();
- }
-
- #ifdef MINTS_TIMER
diff --git a/psi4-1.9.1-uint64.patch b/psi4-1.9.1-uint64.patch
deleted file mode 100644
index 82de99c..0000000
--- a/psi4-1.9.1-uint64.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-diff -up psi4-1.9.1/psi4/src/psi4/libqt/qt.h.uint64 psi4-1.9.1/psi4/src/psi4/libqt/qt.h
---- psi4-1.9.1/psi4/src/psi4/libqt/qt.h.uint64 2024-02-08 21:08:35.000000000 +0000
-+++ psi4-1.9.1/psi4/src/psi4/libqt/qt.h 2025-01-31 12:08:01.214159193 +0000
-@@ -38,6 +38,7 @@
-
- #pragma once
-
-+#include <cstdint>
- #include <string>
-
- #include "psi4/pragma.h"
diff --git a/psi4.spec b/psi4.spec
index 60efb8c..fc89d34 100644
--- a/psi4.spec
+++ b/psi4.spec
@@ -14,30 +14,19 @@ ExcludeArch: %{ix86}
Name: psi4
Epoch: 1
-Version: 1.9.1
-Release: 9%{?dist}
+Version: 1.10.0
+Release: 0.1.alpha%{?dist}
Summary: An ab initio quantum chemistry package
# Automatically converted from old format: LGPLv3 and MIT - review is highly recommended.
License: LGPL-3.0-only AND LicenseRef-Callaway-MIT
URL: http://www.psicode.org/
-Source0: https://github.com/psi4/psi4/archive/v%{version}/psi4-%{version}.tar.gz
-
-# Fix memory error, patch extracted from https://github.com/psi4/psi4/pull/3194
-Patch0: psi4-1.9.1-libint2.patch
-# Tests should call python3 not python
-Patch1: psi4-1.3.2-python3.patch
-# Fix memory overflow issue
-Patch2: psi4-1.9.1-overflow.patch
-# Disable test that uses qcengine, since psi4 backend of python-qcengine is broken (BZ#2309462)
-Patch3: psi4-1.9.1-noqcetest.patch
-# Disable test that uses qcengine, since psi4 backend of python-qcengine is broken (BZ#2309462)
-Patch4: psi4-1.9.1-noecpgrad.patch
-# Don't strip the library
-Patch5: psi4-1.9.1-nostrip.patch
-# Patch build system so that libxc 7.0.0 is accepted
-Patch6: psi4-1.9.1-libxc7.patch
-# Add an include to fix the build error "uint64_t does not name a type"
-Patch7: psi4-1.9.1-uint64.patch
+#Source0: https://github.com/psi4/psi4/archive/v%{version}/psi4-%{version}.tar.gz
+Source0: https://github.com/psi4/psi4/archive/refs/heads/master.zip
+
+# Make qcmanybody optional
+Patch0: https://github.com/psi4/psi4/pull/3389.patch
+# Fix the propagation of cmake flags to the deeper build
+Patch1: https://github.com/psi4/psi4/pull/3400.patch
BuildRequires: cmake
BuildRequires: bison-devel
@@ -127,15 +116,12 @@ This package contains necessary data files for PSI4, e.g., basis sets
and the quadrature grids.
%prep
-%setup -q
-%patch -P0 -p1 -b .libint2
-%patch -P1 -p1 -b .python3
-%patch -P2 -p1 -b .overflow
-%patch -P3 -p1 -b .noqcetest
-%patch -P4 -p1 -b .noecpgrad
-%patch -P5 -p1 -b .nostrip
-%patch -P6 -p1 -b .libxc7
-%patch -P7 -p1 -b .uint64
+#setup -q
+%setup -q -n psi4-master
+%patch -P 0 -p 1 -b .noqcmb
+%patch -P 1 -p 1 -b .cmakeflags
+# Prevent versioner from seeing any top-level git directories
+sed -i 's/if is_git_repo(cwd=cwd, extraneous_toplevel_patterns=.*):/if False:/' psi4/versioner.py
%build
export F77=gfortran
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-07-31 9:30 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-07-31 9:30 [rpms/psi4] f44: Update to 1.10 prerelease to get Psi4 to build again Susi Lehtola
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox