diff --git a/.github/workflows/build-mdtraj.yml b/.github/workflows/build-mdtraj.yml new file mode 100644 index 00000000000..fcdd82f1ac1 --- /dev/null +++ b/.github/workflows/build-mdtraj.yml @@ -0,0 +1,185 @@ +# SPDX-FileCopyrightText: 2026 The RISE Project +# SPDX-License-Identifier: MIT +--- +# This workflow is based on: https://github.com/mdtraj/mdtraj/blob/1.11.1.post2/.github/workflows/build.yaml +# and the test job of: https://github.com/mdtraj/mdtraj/blob/1.11.1.post2/.github/workflows/main.yaml +name: Build mdtraj wheels (riscv64) + +on: + workflow_dispatch: + inputs: + version: + description: 'Version glob to (re)build; empty builds every version of docs/packages/mdtraj.yaml not released yet' + required: false + default: '' + pull_request: + branches: [main] + paths: + - '.github/workflows/build-mdtraj.yml' + - 'docs/packages/mdtraj.yaml' + - 'patches/mdtraj/**' + push: + branches: [main] + paths: + - '.github/workflows/build-mdtraj.yml' + - 'docs/packages/mdtraj.yaml' + - 'patches/mdtraj/**' + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read # to fetch code (actions/checkout) + +env: + MANYLINUX_RISCV64_IMAGE: quay.io/pypa/manylinux_2_39_riscv64 + +jobs: + setup: + uses: $/.github/workflows/_setup.yml + with: + package: mdtraj + version: ${{ inputs.version }} + + build_wheels: + needs: [setup] + if: needs.setup.outputs.versions != '[]' + name: Build mdtraj ${{ matrix.version }} ${{ matrix.python }}-manylinux_riscv64 + runs-on: ubuntu-24.04-riscv + timeout-minutes: 180 + strategy: + fail-fast: false + matrix: + version: ${{ fromJSON(needs.setup.outputs.versions) }} + python: ["cp312", "cp313", "cp314"] + + env: + MDTRAJ_VERSION: ${{ matrix.version }} + + steps: + - name: Checkout mdtraj ${{ env.MDTRAJ_VERSION }} + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + repository: mdtraj/mdtraj + ref: ${{ env.MDTRAJ_VERSION }} + fetch-depth: 0 # versioneer derives the version from `git describe` + persist-credentials: false + + - name: Checkout python-wheels + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + path: python-wheels + persist-credentials: false + + - name: Apply patches + run: git apply python-wheels/patches/mdtraj/${{ env.MDTRAJ_VERSION }}/*.patch + + - name: Build wheels + uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0 + with: + output-dir: wheelhouse/ + only: ${{ matrix.python }}-manylinux_riscv64 + env: + CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }} + CIBW_ENVIRONMENT: >- + PIP_EXTRA_INDEX_URL=https://pypi.riseproject.dev/simple/ + PIP_ONLY_BINARY=numpy,scipy,pandas,tables,blosc2,numexpr,ndindex,msgpack,pydantic-core,netcdf4,cftime + # Upstream's wheel job only smoke-tests; also run its CI suite against the wheel, + # with its conda test env minus openmm (no riscv64 build; those tests skip). + CIBW_TEST_EXTRAS: all + # pyparsing 3.3.3 rewrote infix_notation as a shunting-yard parser that takes the + # first operator in op_list order without backtracking. mdtraj sorts its operators + # alphabetically, so '>' wins over '>=' and test_binary_selection_operator fails on + # 'name >= 1' on every arch (x86_64 too, with upstream's PyPI wheel); 3.3.2 passes + # (gotchas 355, 583). Upstream leaves pyparsing unpinned. + CIBW_TEST_REQUIRES: 'gsd>=2.8 pyparsing<3.3.3' + CIBW_TEST_SOURCES: tests pyproject.toml + # Deselected for riscv64 rounding at a histogram bin edge (gotcha 304), not a wrong + # result: test_compare_rdf_t_master compares to a reference file that matches the + # x86 SSE distance kernel bit for bit. riscv64 builds the scalar vectorize_generic.h + # kernel, and GCC contracts its float32 multiply-adds to fmadd.s, so a few pair + # distances land across a 0.005 nm bin edge: 18/20000 elements off, as 9 adjacent-bin + # pairs (e.g. [20,32]/[20,33]). On x86_64, + # building with -D__NO_INTRINSICS -mfma -ffp-contract=fast gives the same 18 + # elements with the same values; without -mfma it passes; and mdtraj's own numpy + # path (opt=False) misses this reference file at 10 elements. + CIBW_TEST_COMMAND: >- + python -c "import mdtraj; print(mdtraj.__version__)" && + mdconvert -h && + mdinspect -h && + pytest -n logical --durations=10 tests/ -r fE --color=yes + --deselect tests/test_rdf.py::test_compare_rdf_t_master + + - name: Check the wheel ships the licences and the compiled extensions + run: | + python3 - wheelhouse/*.whl <<'EOF' + import sys, zipfile + + names = zipfile.ZipFile(sys.argv[1]).namelist() + exts = {n.split("/")[-1].split(".")[0] for n in names if n.endswith(".so") and ".libs/" not in n} + assert exts == {"xtc", "trr", "dcd", "dtr", "_rmsd", "_lprmsd", "_geometry", "drid", "neighbors", "neighborlist"}, exts + assert "mdtraj/core/lib/libtheobald.a" in names, names + licences = {n.rsplit("/", 1)[-1] for n in names if ".dist-info/licenses/" in n} - {""} + expected = {"LICENSE", "LICENSE.dtrplugin", "LICENSE.munkres", "LICENSE.openmm", "LICENSE.vmd-plugins", "LICENSE.xdrfile"} + assert licences == expected, licences + # -fopenmp makes auditwheel vendor the image's libgomp, hence the gpl_sources job. + assert any(n.startswith("mdtraj.libs/libgomp") for n in names), [n for n in names if ".libs/" in n] + EOF + + - name: Store wheels + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: mdtraj-${{ env.MDTRAJ_VERSION }}-${{ matrix.python }}-manylinux_riscv64 + path: ./wheelhouse/*.whl + if-no-files-found: error + + gpl_sources: + needs: [setup] + if: needs.setup.outputs.versions != '[]' + strategy: + fail-fast: false + matrix: + version: ${{ fromJSON(needs.setup.outputs.versions) }} + name: Collect GPL sources + runs-on: ubuntu-24.04-riscv + + env: + MDTRAJ_VERSION: ${{ matrix.version }} + + steps: + - name: Checkout python-wheels + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - uses: ./actions/collect-gpl-sources + with: + image: ${{ env.MANYLINUX_RISCV64_IMAGE }} + packages: gcc + output: gpl-sources.tar + + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: mdtraj-${{ env.MDTRAJ_VERSION }}-gpl-sources + path: gpl-sources.tar + if-no-files-found: error + + publish: + name: Publish mdtraj ${{ matrix.version }} + needs: [setup, build_wheels, gpl_sources] + if: needs.setup.outputs.versions != '[]' + strategy: + fail-fast: false + matrix: + version: ${{ fromJSON(needs.setup.outputs.versions) }} + permissions: + contents: write + pull-requests: write + uses: $/.github/workflows/_publish-wheel.yml + secrets: + app-private-key: ${{ secrets.RISEPROJECT_APP_PRIVATE_KEY }} + with: + artifact-pattern: mdtraj-${{ matrix.version }}-*-manylinux_riscv64 + gpl-sources-artifact: mdtraj-${{ matrix.version }}-gpl-sources + gpl-sources-description: gcc diff --git a/docs/packages/mdtraj.yaml b/docs/packages/mdtraj.yaml new file mode 100644 index 00000000000..dd074198d79 --- /dev/null +++ b/docs/packages/mdtraj.yaml @@ -0,0 +1,6 @@ +package-name: mdtraj +source-code: https://github.com/mdtraj/mdtraj +license: LGPL-2.1-or-later +versions: +- version: 1.11.1.post2 + patched: true diff --git a/patches/mdtraj/1.11.1.post2/0001-Ship-the-licences-of-the-third-party-code-compiled-in.patch b/patches/mdtraj/1.11.1.post2/0001-Ship-the-licences-of-the-third-party-code-compiled-in.patch new file mode 100644 index 00000000000..fe65e6e729b --- /dev/null +++ b/patches/mdtraj/1.11.1.post2/0001-Ship-the-licences-of-the-third-party-code-compiled-in.patch @@ -0,0 +1,216 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Ludovic Henry +Date: Fri, 2 Oct 2026 12:00:00 +0200 +Subject: [PATCH] Ship the licences of the third-party code compiled into the + extensions + +The wheel's extensions compile in code from five other projects under +their own permissive licences, each of which requires its notice to +travel with binary redistributions: the VMD molfile plugin library +(University of Illinois Open Source License; mdtraj.formats.dcd and the +plugin headers of mdtraj.formats.dtr), D. E. Shaw Research's dtrplugin +(BSD-3-Clause; mdtraj.formats.dtr), the xdrfile library (BSD-2-Clause; +mdtraj.formats.xtc and .trr), Jacob Frelinger's Munkres implementation +(BSD; mdtraj._lprmsd) and OpenMM's vectorization headers (MIT; the +mdtraj.geometry extensions). The notices only live in the source file +headers, so every published wheel carries mdtraj's own LGPL LICENSE alone. + +Add one LICENSE. file per component at the project root, +reproducing the notice its sources carry (the VMD sources only carry the +copyright line, so the UIUC Open Source License text is taken from the +VMD plugin library's licence page). setuptools' default license_files +glob already matches LICENSE.* at the root, so no setup.py change is +needed and the files land in dist-info/licenses/. + +Upstream-Status: To upstream [not submitted from this automated port run; needs a pull request against mdtraj/mdtraj] +--- + LICENSE.dtrplugin | 32 ++++++++++++++++++++++++++++++++ + LICENSE.munkres | 13 +++++++++++++ + LICENSE.openmm | 32 ++++++++++++++++++++++++++++++++ + LICENSE.vmd-plugins | 45 +++++++++++++++++++++++++++++++++++++++++++++ + LICENSE.xdrfile | 26 ++++++++++++++++++++++++++ + 5 files changed, 148 insertions(+) + create mode 100644 LICENSE.dtrplugin + create mode 100644 LICENSE.munkres + create mode 100644 LICENSE.openmm + create mode 100644 LICENSE.vmd-plugins + create mode 100644 LICENSE.xdrfile + +diff --git a/LICENSE.dtrplugin b/LICENSE.dtrplugin +new file mode 100644 +index 0000000..b097e44 +--- /dev/null ++++ b/LICENSE.dtrplugin +@@ -0,0 +1,32 @@ ++The D. E. Shaw Research dtrplugin compiled into mdtraj.formats.dtr ++(mdtraj/formats/dtr/src/dtrplugin.cxx) carries the following notice: ++ ++Copyright 2009, D. E. Shaw Research, LLC ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are ++met: ++ ++* Redistributions of source code must retain the above copyright ++ notice, this list of conditions, and the following disclaimer. ++ ++* Redistributions in binary form must reproduce the above copyright ++ notice, this list of conditions, and the following disclaimer in the ++ documentation and/or other materials provided with the distribution. ++ ++* Neither the name of D. E. Shaw Research, LLC nor the names of its ++ contributors may be used to endorse or promote products derived from ++ this software without specific prior written permission. ++ ++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +diff --git a/LICENSE.munkres b/LICENSE.munkres +new file mode 100644 +index 0000000..338c6b7 +--- /dev/null ++++ b/LICENSE.munkres +@@ -0,0 +1,13 @@ ++The Munkres (Hungarian algorithm) implementation compiled into mdtraj._lprmsd ++(mdtraj/rmsd/src/Munkres.cpp, from https://github.com/jfrelinger/cython-munkres-wrapper) ++carries the following notice, reproduced as it appears in the source: ++ ++Copyright (c) 2012, Jacob Frelinger ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ++ ++Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ++Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. ++ ++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +diff --git a/LICENSE.openmm b/LICENSE.openmm +new file mode 100644 +index 0000000..7604496 +--- /dev/null ++++ b/LICENSE.openmm +@@ -0,0 +1,32 @@ ++The vectorization headers compiled into the mdtraj.geometry extensions ++(mdtraj/geometry/include/vectorize*.h) are taken from OpenMM and carry the ++following notice: ++ ++OpenMM ++-------------------------------------------------------------------------- ++This is part of the OpenMM molecular simulation toolkit originating from ++Simbios, the NIH National Center for Physics-Based Simulation of ++Biological Structures at Stanford, funded under the NIH Roadmap for ++Medical Research, grant U54 GM072970. See https://simtk.org. ++ ++Portions copyright (c) 2014-2018 Stanford University and the Authors. ++Authors: Peter Eastman ++Contributors: ++ ++Permission is hereby granted, free of charge, to any person obtaining a ++copy of this software and associated documentation files (the "Software"), ++to deal in the Software without restriction, including without limitation ++the rights to use, copy, modify, merge, publish, distribute, sublicense, ++and/or sell copies of the Software, and to permit persons to whom the ++Software is furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in ++all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, ++DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ++OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE ++USE OR OTHER DEALINGS IN THE SOFTWARE. +diff --git a/LICENSE.vmd-plugins b/LICENSE.vmd-plugins +new file mode 100644 +index 0000000..c669ca3 +--- /dev/null ++++ b/LICENSE.vmd-plugins +@@ -0,0 +1,45 @@ ++The DCD reader/writer (mdtraj/formats/dcd) and the molfile plugin headers ++used by mdtraj/formats/dcd and mdtraj/formats/dtr are taken from the VMD ++plugin library and carry the following notice: ++ ++(C) Copyright 1995-2016 The Board of Trustees of the ++ University of Illinois ++ All Rights Reserved ++ ++The VMD plugin library is distributed under the University of Illinois ++Open Source License (https://www.ks.uiuc.edu/Research/vmd/plugins/pluginlicense.html): ++ ++University of Illinois Open Source License ++Copyright 2006 Theoretical and Computational Biophysics Group, ++All rights reserved. ++ ++Developed by: Theoretical and Computational Biophysics Group ++ University of Illinois at Urbana-Champaign ++ http://www.ks.uiuc.edu/ ++ ++Permission is hereby granted, free of charge, to any person obtaining a copy of ++this software and associated documentation files (the Software), to deal with ++the Software without restriction, including without limitation the rights to ++use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies ++of the Software, and to permit persons to whom the Software is furnished to ++do so, subject to the following conditions: ++ ++Redistributions of source code must retain the above copyright notice, ++this list of conditions and the following disclaimers. ++ ++Redistributions in binary form must reproduce the above copyright notice, ++this list of conditions and the following disclaimers in the documentation ++and/or other materials provided with the distribution. ++ ++Neither the names of Theoretical and Computational Biophysics Group, ++University of Illinois at Urbana-Champaign, nor the names of its contributors ++may be used to endorse or promote products derived from this Software without ++specific prior written permission. ++ ++THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++OTHER DEALINGS WITH THE SOFTWARE. +diff --git a/LICENSE.xdrfile b/LICENSE.xdrfile +new file mode 100644 +index 0000000..0d0c4a9 +--- /dev/null ++++ b/LICENSE.xdrfile +@@ -0,0 +1,26 @@ ++The xdrfile library compiled into mdtraj.formats.xtc and mdtraj.formats.trr ++(mdtraj/formats/xtc/src/xdrfile*.c) carries the following notice: ++ ++Copyright (c) 2009-2014, Erik Lindahl & David van der Spoel ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are met: ++ ++1. Redistributions of source code must retain the above copyright notice, this ++list of conditions and the following disclaimer. ++ ++2. Redistributions in binary form must reproduce the above copyright notice, ++this list of conditions and the following disclaimer in the documentation ++and/or other materials provided with the distribution. ++ ++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ++AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE ++FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ++SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ++CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.