public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Susi Lehtola <jussilehtola@fedoraproject.org>
To: git-commits@fedoraproject.org
Subject: [rpms/psi4] f44: Update to 1.10 prerelease to get Psi4 to build again
Date: Fri, 31 Jul 2026 09:30:25 GMT	[thread overview]
Message-ID: <178549022507.1.2897116915843674905.rpms-psi4-36e25560cd63@fedoraproject.org> (raw)

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

                 reply	other threads:[~2026-07-31  9:30 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=178549022507.1.2897116915843674905.rpms-psi4-36e25560cd63@fedoraproject.org \
    --to=jussilehtola@fedoraproject.org \
    --cc=git-commits@fedoraproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox