diff --git a/.distro/.fmf/version b/.distro/.fmf/version new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/.distro/.fmf/version @@ -0,0 +1 @@ +1 diff --git a/.distro/plans/full.fmf b/.distro/plans/full.fmf new file mode 100644 index 000000000..4d9e04ba3 --- /dev/null +++ b/.distro/plans/full.fmf @@ -0,0 +1,6 @@ +summary: Test the bundled ctests +discover+: + how: fmf + path: test-suite +execute: + how: tmt diff --git a/.distro/plans/main.fmf b/.distro/plans/main.fmf new file mode 100644 index 000000000..4a331d718 --- /dev/null +++ b/.distro/plans/main.fmf @@ -0,0 +1,9 @@ +discover: + how: fmf + +adjust+: + # Cannot use initiator: fedora-ci reliably yet + when: initiator is not defined or initiator != packit + discover+: + dist-git-source: true + dist-git-extract: wannier90-*/ diff --git a/.distro/wannier90.rpmlintrc b/.distro/wannier90.rpmlintrc new file mode 100644 index 000000000..e69de29bb diff --git a/.distro/wannier90.spec b/.distro/wannier90.spec new file mode 100644 index 000000000..f50247651 --- /dev/null +++ b/.distro/wannier90.spec @@ -0,0 +1,159 @@ +Name: wannier90 +Summary: Maximally-Localised Generalised Wannier Functions Code +Version: 0.0.0 +Release: %autorelease +License: GPL-2.0-only +URL: https://www.wannier.org/ + +Source: https://github.com/wannier-developers/wannier90/archive/refs/tags/v%{version}.tar.gz + +BuildRequires: ninja-build +BuildRequires: cmake +BuildRequires: gcc-fortran +BuildRequires: flexiblas-devel +# Required for testing +BuildRequires: gcc-c++ +BuildRequires: python3 + +%global _description %{expand: +Maximally-Localised Generalised Wannier Functions Code.} + +%description +%{_description} + +%package devel +Summary: Development files for wannier90 +Requires: wannier90%{?_isa} = %{version}-%{release} + +%description devel +This package contains the development files for the wannier90 library. + +%package openmpi +Summary: Maximally-Localised Generalised Wannier Functions Code - OpenMPI version +BuildRequires: openmpi-devel + +%description openmpi +%{_description} + +This package contains the OpenMPI parallel version. + +%package openmpi-devel +Summary: Development files for wannier90 - OpenMPI version +Requires: wannier90-openmpi%{?_isa} = %{version}-%{release} + +%description openmpi-devel +This package contains the development files for the wannier90 (OpenMPI) library. + +%package mpich +Summary: Maximally-Localised Generalised Wannier Functions Code - MPICH version +BuildRequires: mpich-devel + +%description mpich +%{_description} + +This package contains the MPICH parallel version. + +%package mpich-devel +Summary: Development files for wannier90 - MPICH version +Requires: wannier90-mpich%{?_isa} = %{version}-%{release} + +%description mpich-devel +This package contains the development files for the wannier90 (MPICH) library. + + +%prep +%autosetup -n wannier90-%{version} + +# $MPI_SUFFIX will be evaluated in the loops below, set by mpi modules +%global _vpath_builddir %{_vendor}-%{_target_os}-build${MPI_SUFFIX:-_serial} +# We are running the module load/unload manually until there is a macro-like way to expand this +. /etc/profile.d/modules.sh + + +%build +cmake_common_args=( + "-G Ninja" + "-DWANNIER90_SHARED_LIBS=ON" + "-DWANNIER90_TEST=ON" +) +for mpi in '' mpich openmpi ; do + if [ -n "$mpi" ]; then + module load mpi/${mpi}-%{_arch} + cmake_mpi_args=( + "-DCMAKE_INSTALL_PREFIX=${MPI_HOME}" + "-DWANNIER90_MPI=ON" + "-DCMAKE_INSTALL_MODULEDIR=${MPI_FORTRAN_MOD_DIR}" + "-DCMAKE_INSTALL_LIBDIR=lib" + ) + else + cmake_mpi_args=( + "-DWANNIER90_MPI=OFF" + "-DCMAKE_INSTALL_MODULEDIR=%{_fmoddir}" + ) + fi + + %cmake \ + ${cmake_common_args[@]} \ + ${cmake_mpi_args[@]} + %cmake_build + + [ -n "$mpi" ] && module unload mpi/${mpi}-%{_arch} +done + + +%install +for mpi in '' mpich openmpi ; do + [ -n "$mpi" ] && module load mpi/${mpi}-%{_arch} + %cmake_install + [ -n "$mpi" ] && module unload mpi/${mpi}-%{_arch} +done + + +%check +for mpi in '' mpich %{?with_openmpi:openmpi} ; do + [ -n "$mpi" ] && module load mpi/${mpi}-%{_arch} + %ctest + [ -n "$mpi" ] && module unload mpi/${mpi}-%{_arch} +done + + +%files +%doc README.rst +%license LICENSE +%{_libdir}/libwannier90.so.* +%{_bindir}/wannier90.x +%{_bindir}/postw90.x + +%files devel +%{_includedir}/wannier90.hh +%{_libdir}/libwannier90.so +%{_fmoddir}/Wannier90/ +%{_libdir}/cmake/Wannier90 +%{_libdir}/pkgconfig/wannier90.pc + +%files openmpi +%{_libdir}/openmpi/bin/wannier90.x +%{_libdir}/openmpi/bin/postw90.x +%{_libdir}/openmpi/lib/libwannier90.so.* + +%files openmpi-devel +%{_libdir}/openmpi/include/wannier90.hh +%{_libdir}/openmpi/lib/libwannier90.so +%{_fmoddir}/openmpi/Wannier90/ +%{_libdir}/openmpi/lib/cmake/Wannier90 +%{_libdir}/openmpi/lib/pkgconfig/wannier90.pc + +%files mpich +%{_libdir}/mpich/bin/wannier90.x +%{_libdir}/mpich/bin/postw90.x +%{_libdir}/mpich/lib/libwannier90.so.* + +%files mpich-devel +%{_libdir}/mpich/include/wannier90.hh +%{_libdir}/mpich/lib/libwannier90.so +%{_fmoddir}/mpich/Wannier90/ +%{_libdir}/mpich/lib/cmake/Wannier90 +%{_libdir}/mpich/lib/pkgconfig/wannier90.pc + +%changelog +%autochangelog diff --git a/.packit.yaml b/.packit.yaml new file mode 100644 index 000000000..d58c4f815 --- /dev/null +++ b/.packit.yaml @@ -0,0 +1,66 @@ +specfile_path: .distro/wannier90.spec +files_to_sync: + - src: .distro/ + dest: ./ + delete: true + filters: + - "protect .git*" + - "protect sources" + - "protect changelog" + - "protect gating.yaml" + # Temporary workaround until + # https://github.com/packit/packit/pull/2573 + - "- wannier90.spec" + - .packit.yaml + +upstream_package_name: wannier90 +downstream_package_name: wannier90 +upstream_tag_template: v{version} + +targets: + - fedora-all-x86_64 + - fedora-all-aarch64 + +_: + # Job templates + - &build-in-packit + job: copr_build + - &build-in-lecris + <<: *build-in-packit + owner: lecris + - &tests-downstream + job: tests + fmf_path: .distro + identifier: downstream + +jobs: + # Upstream jobs + - <<: *build-in-lecris + trigger: release + project: release + - <<: *tests-downstream + trigger: release + - <<: *build-in-lecris + trigger: commit + branch: main + project: nightly + - <<: *tests-downstream + trigger: commit + branch: main + - <<: *build-in-packit + trigger: pull_request + - <<: *tests-downstream + trigger: pull_request + # Downstream jobs + - job: propose_downstream + trigger: release + dist_git_branches: + - fedora-rawhide + - job: koji_build + trigger: commit + dist_git_branches: + - fedora-all + - job: bodhi_update + trigger: commit + dist_git_branches: + - fedora-branched diff --git a/test-suite/.fmf/version b/test-suite/.fmf/version new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/test-suite/.fmf/version @@ -0,0 +1 @@ +1 diff --git a/test-suite/ctest.fmf b/test-suite/ctest.fmf new file mode 100644 index 000000000..6db9ace24 --- /dev/null +++ b/test-suite/ctest.fmf @@ -0,0 +1,26 @@ +tag: [ cmake ] +require: + - cmake + - rsync + - gcc + - gcc-c++ + - gcc-fortran + - pkgconf + - git + # For test-suite + - bzip2 + # For testing FetchContent + - flexiblas-devel +framework: beakerlib +path: / +test: ./ctest.sh + +/serial: + environment: + MPI_VARIANT: serial +/OpenMPI: + environment: + MPI_VARIANT: openmpi +/MPICH: + environment: + MPI_VARIANT: mpich diff --git a/test-suite/ctest.sh b/test-suite/ctest.sh new file mode 100755 index 000000000..66f2a9741 --- /dev/null +++ b/test-suite/ctest.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# shellcheck disable=all +source /usr/share/beakerlib/beakerlib.sh || exit 1 + +rlJournalStart + rlPhaseStartSetup + rlRun "tmp=\$(mktemp -d)" 0 "Create tmp directory" + rlRun "rsync -rL ./ $tmp" 0 "Copy test-suite project" + rlRun "pushd $tmp" + rlRun "set -o pipefail" + [[ -z "${MPI_VARIANT}" ]] && rlDie "MPI_VARIANT was not provided" + rlPhaseEnd + + rlPhaseStartTest + [[ "${MPI_VARIANT}" != "serial" ]] && rlRun "module load mpi/${MPI_VARIANT}" 0 "Load MPI" + rlRun "cmake -B ./build" 0 "CMake configure" + rlRun "cmake --build ./build" 0 "CMake build" + rlRun "ctest --test-dir ./build --output-on-failure" 0 "Run CTest" + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "popd" + rlRun "rm -r $tmp" 0 "Remove tmp directory" + rlPhaseEnd +rlJournalEnd