From f686a90779354f1a670c7774a3335473043a5e36 Mon Sep 17 00:00:00 2001 From: Sebastian Ehlert <28669218+awvwgk@users.noreply.github.com> Date: Thu, 26 Jan 2023 10:00:34 +0100 Subject: Add package for serenity and its scine wrapper (#35072) --- .../builtin/packages/scine-serenity/package.py | 72 +++++++++++ .../builtin/packages/serenity-libint/package.py | 25 ++++ .../repos/builtin/packages/serenity/package.py | 141 +++++++++++++++++++++ 3 files changed, 238 insertions(+) create mode 100644 var/spack/repos/builtin/packages/scine-serenity/package.py create mode 100644 var/spack/repos/builtin/packages/serenity-libint/package.py create mode 100644 var/spack/repos/builtin/packages/serenity/package.py (limited to 'var') diff --git a/var/spack/repos/builtin/packages/scine-serenity/package.py b/var/spack/repos/builtin/packages/scine-serenity/package.py new file mode 100644 index 0000000000..17b2d43e12 --- /dev/null +++ b/var/spack/repos/builtin/packages/scine-serenity/package.py @@ -0,0 +1,72 @@ +# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +import os + +from spack.package import * + + +class ScineSerenity(CMakePackage): + """Wrapper around Serenity to make it compatible with Scine""" + + homepage = "https://scine.ethz.ch" + url = "https://github.com/qcscine/serenity_wrapper/archive/refs/tags/1.0.1.tar.gz" + git = "https://github.com/qcscine/serenity_wrapper" + + version("master", branch="master") + version("1.0.1", "e2e5cc265a68ccab05f1bc934b957ca07c4f1c6004e662684023da451da69299") + + resource( + name="dev", + url="https://github.com/qcscine/development-utils/archive/refs/tags/5.0.1.tar.gz", + sha256="089ca500fc191e04a968ea166d2fe80178b227bc2e6d3926523fa2eee5f6492d", + placement="_dev", + ) + + variant("python", default=False, description="Build Python extension module") + + depends_on("boost+system+filesystem+program_options cxxstd=17 @1.65.0:") + depends_on("python@3.6:", when="+python", type=("build", "run")) + depends_on("py-pip", when="+python", type="build") + depends_on("scine-core") + depends_on("scine-utilities") + depends_on("scine-utilities+python", when="+python", type=("build", "run")) + depends_on("serenity") + + extends("python", when="+python") + + def patch(self): + os.rmdir("dev") + os.rename("_dev", "dev") + + filter_file( + # Serenity does not install any config or targets file... + "find_package(serenity QUIET)", + "find_library(SERENITY_LIBRARY serenity REQUIRED)\n" + "add_library(serenity INTERFACE IMPORTED)\n" + "target_link_libraries(serenity INTERFACE ${SERENITY_LIBRARY})\n" + "target_include_directories(serenity INTERFACE ${SERENITY_INCLUDE_DIR})\n" + "find_package(OpenMP REQUIRED)\n" + "target_compile_options(serenity INTERFACE ${OpenMP_CXX_FLAGS})\n", + "CMakeLists.txt", + string=True, + ) + + def cmake_args(self): + args = [ + self.define("SCINE_BUILD_TESTS", self.run_tests), + self.define_from_variant("SCINE_BUILD_PYTHON_BINDINGS", "python"), + self.define("SCINE_MARCH", ""), + self.define("serenity_DIR", self.spec["serenity"].prefix.lib.cmake.serenity), + self.define("SERENITY_INCLUDE_DIR", self.spec["serenity"].prefix.include.serenity), + self.define("BOOST_ROOT", self.spec["boost"].prefix), + self.define("BOOST_LIBRARY_DIR", self.spec["boost"].libs.directories[0]), + self.define("BOOST_INCLUDE_DIR", self.spec["boost"].headers.directories[0]), + self.define("BOOST_NO_SYSTEM_PATHS", True), + self.define("Boost_NO_BOOST_CMAKE", True), + ] + if "+python" in self.spec: + args.append(self.define("PYTHON_EXECUTABLE", self.spec["python"].command.path)) + return args diff --git a/var/spack/repos/builtin/packages/serenity-libint/package.py b/var/spack/repos/builtin/packages/serenity-libint/package.py new file mode 100644 index 0000000000..6c7d7ed677 --- /dev/null +++ b/var/spack/repos/builtin/packages/serenity-libint/package.py @@ -0,0 +1,25 @@ +# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class SerenityLibint(CMakePackage): + """Serenity fork of libint, which is difficult to reproduce from libint itself""" + + homepage = "https://thclab.uni-muenster.de/serenity/libint" + url = "https://thclab.uni-muenster.de/serenity/libint/-/raw/e3eb756c/libint-2.7.0-beta.6.tgz" + + version("2.7.0-beta.6", "53af60c7be74374b2a2d893b3d2d37fa6a3078a72d98067bf71ba4ede4e807df") + + depends_on("boost") + depends_on("eigen@3:") # Probably overdepending? + depends_on("gmp+cxx") + + def cmake_args(self): + args = [ + self.define("BUILD_SHARED_LIBS", True), + ] + return args diff --git a/var/spack/repos/builtin/packages/serenity/package.py b/var/spack/repos/builtin/packages/serenity/package.py new file mode 100644 index 0000000000..3327770b92 --- /dev/null +++ b/var/spack/repos/builtin/packages/serenity/package.py @@ -0,0 +1,141 @@ +# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Serenity(CMakePackage): + """Subsystem focused quantum chemistry code Serenity""" + + homepage = "https://www.uni-muenster.de/Chemie.oc/neugebauer/softwareAKN.html" + url = "https://github.com/qcserenity/serenity/archive/refs/tags/1.4.0.tar.gz" + git = "https://github.com/qcserenity/serenity.git" + + version("master", branch="master") + version("1.4.0", "c7a87fc8e6f8ca21685a27e08d09d49824d9a1e9947fc6abb40d20fbba0cc6e8") + + variant("blas", default=True, description="Use BLAS library with Eigen") + variant("lapack", default=True, description="Use Lapack library with Eigen") + variant("python", default=False, description="Build Python bindings") + + depends_on("blas", when="+blas") + depends_on("cmake@3.12:", type="build") + depends_on("boost") + depends_on("eigen@3:") + depends_on("googletest@1.8.1:", type="test") + depends_on("hdf5@1.10.1:") + depends_on("lapack", when="+lapack") + depends_on("libecpint") + depends_on("libxc@5.0.0") + depends_on("pkgconfig", type="build") + depends_on("python@3.6:", when="+python", type=("build", "run")) + depends_on("py-pip", when="+python", type="build") + depends_on("py-pybind11", when="+python", type="build") + depends_on("serenity-libint") + depends_on("xcfun") + + extends("python", when="+python") + + def patch(self): + + filter_file( + "include(CMakeParseArguments)", + 'message(FATAL_ERROR "Tried to download a dependency")', + "cmake/DownloadProject.cmake", + string=True, + ) + + if self.run_tests: + filter_file( + "find_package(GTest 1.8.1 QUIET)", + "find_package(GTest REQUIRED)", + "cmake/ImportGTest.cmake", + string=True, + ) + + filter_file( + "find_package(GMock 1.8.1 QUIET)", + "return()", + "cmake/ImportGTest.cmake", + string=True, + ) + + filter_file( + "function(import_libecpint)", + "function(import_libecpint)\n" + "find_package(ecpint CONFIG REQUIRED)\n" + "add_library(ecpint INTERFACE IMPORTED)\n" + "target_link_libraries(ecpint INTERFACE ECPINT::ecpint)\n", + "cmake/ImportLibecpint.cmake", + string=True, + ) + + filter_file( + "function(import_libint)", + "function(import_libint)\n" + "find_package(Libint2 CONFIG REQUIRED)\n" + "add_library(libint2-static INTERFACE IMPORTED)\n" + "target_link_libraries(libint2-static INTERFACE Libint2::libint2)\n", + "cmake/ImportLibint.cmake", + string=True, + ) + + filter_file( + "function(import_libxc)", + "function(import_libxc)\n" + "find_package(PkgConfig QUIET)\n" + "pkg_check_modules(pc_libxc libxc)\n" + "if(pc_libxc_FOUND)\n" + "add_library(xc INTERFACE IMPORTED)\n" + "target_link_libraries(xc INTERFACE ${pc_libxc_LINK_LIBRARIES})\n" + "target_include_directories(xc INTERFACE ${pc_libxc_INCLUDE_DIRS})\n" + "endif()", + "cmake/ImportLibxc.cmake", + string=True, + ) + + filter_file( + "function(import_pybind11)", + "function(import_pybind11)\nfind_package(pybind11 REQUIRED)", + "cmake/ImportPybind11.cmake", + string=True, + ) + + filter_file( + "function(import_xcfun)", + "function(import_xcfun)\n" + "find_package(XCFun CONFIG REQUIRED)\n" + "add_library(xcfun INTERFACE IMPORTED)\n" + "target_link_libraries(xcfun INTERFACE XCFun::xcfun)\n", + "cmake/ImportXCFun.cmake", + string=True, + ) + + def cmake_args(self): + args = [ + self.define("SERENITY_BUILD_TESTS", self.run_tests), + self.define_from_variant("SERENITY_BUILD_PYTHON_BINDINGS", "python"), + self.define("SERENITY_MARCH", ""), + self.define("SERENITY_PREFER_XCFUN", False), + self.define("SERENITY_USE_XCFUN", True), + self.define("SERENITY_USE_LIBXC", True), + self.define( + "SERENITY_USE_INTEL_MKL", self.spec["lapack"].libs.names[0].startswith("mkl") + ), + self.define_from_variant("SERENITY_USE_LAPACK", "lapack"), + self.define_from_variant("SERENITY_USE_BLAS", "blas"), + self.define("SERENITY_USAGE_FROM_SOURCE", False), + self.define("Libint2_DIR", self.spec["serenity-libint"].prefix.lib.cmake.libint2), + self.define("XCFun_DIR", self.spec["xcfun"].prefix.share.XCFun), + self.define("BUILD_SHARED_LIBS", True), + self.define("BOOST_ROOT", self.spec["boost"].prefix), + self.define("BOOST_LIBRARY_DIR", self.spec["boost"].libs.directories[0]), + self.define("BOOST_INCLUDE_DIR", self.spec["boost"].headers.directories[0]), + self.define("BOOST_NO_SYSTEM_PATHS", True), + self.define("Boost_NO_BOOST_CMAKE", True), + ] + if "+python" in self.spec: + args.append(self.define("PYTHON_EXECUTABLE", self.spec["python"].command.path)) + return args -- cgit v1.2.3-70-g09d2