diff --git a/assets/logo/GridFireSocialPreview.png b/assets/logo/GridFireSocialPreview.png new file mode 100644 index 00000000..f6cfec9a Binary files /dev/null and b/assets/logo/GridFireSocialPreview.png differ diff --git a/assets/logo/GridFireSocialPreview.svg b/assets/logo/GridFireSocialPreview.svg new file mode 100644 index 00000000..2f57da78 --- /dev/null +++ b/assets/logo/GridFireSocialPreview.svg @@ -0,0 +1,108 @@ + + + +FIREGridFire is a part of 4D-STAR anda SERiF project diff --git a/utils/wheels/build-wheels-linux_aarch64.sh b/utils/wheels/build-wheels-linux_aarch64.sh new file mode 100755 index 00000000..74235635 --- /dev/null +++ b/utils/wheels/build-wheels-linux_aarch64.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +set -euo pipefail + +if [[ $# -ne 1 ]]; then + echo "Usage: $0 " + exit 1 +fi + +REPO_URL="$1" +WORK_DIR="$(pwd)" +WHEEL_DIR="${WORK_DIR}/wheels_linux_aarch64" + +echo "➤ Creating wheel output directory at ${WHEEL_DIR}" +mkdir -p "${WHEEL_DIR}" + +TMPDIR="$(mktemp -d)" +echo "➤ Cloning ${REPO_URL} → ${TMPDIR}/project" +git clone "${REPO_URL}" "${TMPDIR}/project" + +for IMAGE in \ + tboudreaux/manylinux_2_28_aarch64_boost_1_88_0:latest +do + docker run --rm \ + -v "${WHEEL_DIR}":/io/wheels \ + -v "${TMPDIR}/project":/io/project \ + "${IMAGE}" \ + /bin/bash -eux -c ' + cd /io/project + for PY in /opt/python/*/bin/python; do + "$PY" -m pip install --upgrade pip setuptools wheel meson meson-python + CC=clang CXX=clang++ "$PY" -m pip wheel . --config-settings=setup-args=-Dunity=on -w /io/wheels -vv + auditwheel repair /io/wheels/*.whl -w /io/wheels + done + + echo "✅ Linux wheels ready in /io/wheels" + ' +done \ No newline at end of file diff --git a/utils/wheels/build-wheels-linux_x86_64.sh b/utils/wheels/build-wheels-linux_x86_64.sh new file mode 100755 index 00000000..6dc3d8b0 --- /dev/null +++ b/utils/wheels/build-wheels-linux_x86_64.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +set -euo pipefail + +if [[ $# -ne 1 ]]; then + echo "Usage: $0 " + exit 1 +fi + +REPO_URL="$1" +WORK_DIR="$(pwd)" +WHEEL_DIR="${WORK_DIR}/wheels_linux_x86_64" + +echo "➤ Creating wheel output directory at ${WHEEL_DIR}" +mkdir -p "${WHEEL_DIR}" + +TMPDIR="$(mktemp -d)" +echo "➤ Cloning ${REPO_URL} → ${TMPDIR}/project" +git clone "${REPO_URL}" "${TMPDIR}/project" + +for IMAGE in \ + tboudreaux/manylinux_2_28_x86_64_boost_1_88_0:latest +do + docker run --rm \ + -v "${WHEEL_DIR}":/io/wheels \ + -v "${TMPDIR}/project":/io/project \ + "${IMAGE}" \ + /bin/bash -eux -c ' + cd /io/project + for PY in /opt/python/*/bin/python; do + "$PY" -m pip install --upgrade pip setuptools wheel meson meson-python + CC=clang CXX=clang++ "$PY" -m pip wheel . --config-settings=setup-args=-Dunity=on -w /io/wheels -vv + auditwheel repair /io/wheels/*.whl -w /io/wheels + done + + echo "✅ Linux wheels ready in /io/wheels" + ' +done \ No newline at end of file diff --git a/utils/wheels/build-wheels-macos_aarch64.sh b/utils/wheels/build-wheels-macos_aarch64.sh new file mode 100755 index 00000000..df1a7323 --- /dev/null +++ b/utils/wheels/build-wheels-macos_aarch64.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +set -euo pipefail + +if [[ $(uname -m) != "arm64" ]]; then + echo "Error: This script is intended to run on an Apple Silicon (arm64) Mac." + exit 1 +fi + +if [[ $# -ne 1 ]]; then + echo "Usage: $0 " + exit 1 +fi + +# --- Initial Setup --- +REPO_URL="$1" +WORK_DIR="$(pwd)" +WHEEL_DIR="${WORK_DIR}/wheels_macos_aarch64_tmp" +FINAL_WHEEL_DIR="${WORK_DIR}/wheels_macos_aarch64" + +echo "➤ Creating wheel output directories" +mkdir -p "${WHEEL_DIR}" +mkdir -p "${FINAL_WHEEL_DIR}" + +TMPDIR="$(mktemp -d)" +echo "➤ Cloning ${REPO_URL} → ${TMPDIR}/project" +git clone --depth 1 "${REPO_URL}" "${TMPDIR}/project" +cd "${TMPDIR}/project" + +# --- macOS Build Configuration --- +export MACOSX_DEPLOYMENT_TARGET=12.0 + +PYTHON_VERSIONS=("3.8.20" "3.9.23" "3.10.18" "3.11.13" "3.12.11" "3.13.5" "3.13.5t" "3.14.0rc1" "3.14.0rc1t" 'pypy3.10-7.3.19' "pypy3.11-7.3.20") + +if ! command -v pyenv &> /dev/null; then + echo "Error: pyenv not found. Please install it to manage Python versions." + exit 1 +fi +eval "$(pyenv init -)" + +for PY_VERSION in "${PYTHON_VERSIONS[@]}"; do + ( + set -e + + if ! pyenv versions --bare --filter="${PY_VERSION}." &>/dev/null; then + echo "⚠️ Python version matching '${PY_VERSION}.*' not found by pyenv. Skipping." + continue + fi + + pyenv shell "${PY_VERSION}" + + PY="$(pyenv which python)" + echo "➤ Building for $($PY --version) on macOS arm64 (target: ${MACOSX_DEPLOYMENT_TARGET})" + + "$PY" -m pip install --upgrade pip setuptools wheel meson meson-python delocate + + CC=clang CXX=clang++ "$PY" -m pip wheel . \ + --config-settings=setup-args=-Dunity=on \ + -w "${WHEEL_DIR}" -vv + + echo "➤ Repairing wheel(s) with delocate" + delocate-wheel -w "${FINAL_WHEEL_DIR}" "${WHEEL_DIR}"/*.whl + + rm "${WHEEL_DIR}"/*.whl + + ) +done + +rm -rf "${TMPDIR}" +rm -rf "${WHEEL_DIR}" + diff --git a/utils/wheels/installPyEnvVersions.sh b/utils/wheels/installPyEnvVersions.sh new file mode 100755 index 00000000..bdbe5ae4 --- /dev/null +++ b/utils/wheels/installPyEnvVersions.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +pyenv install 3.8.20 +pyenv install 3.9.23 +pyenv install 3.10.18 +pyenv install 3.11.13 +pyenv install 3.12.11 +pyenv install 3.13.5 +pyenv install 3.13.5t +pyenv install 3.14.0rc1 +pyenv install 3.14.0rc1t +pyenv install pypy3.10-7.3.19 +pyenv install pypy3.11-7.3.20 + diff --git a/utils/wheels/readme.md b/utils/wheels/readme.md new file mode 100644 index 00000000..b0c3d112 --- /dev/null +++ b/utils/wheels/readme.md @@ -0,0 +1,28 @@ +# Wheel Generation +This directory contains scripts to generate precompiled python wheels for GridFire + +# Notes +- MacOS wheels can only be generated on macos +- aarch64 wheels can only be generated on aarch64 machines +- x86_64 wheels can only be generated on x86_64 machines +- linux wheels can be generated on any linux machine, but the target architecture must match the machine architecture +- Running each script will take **a very long time** (could be upwards of half of a day depending on your system) and will require roughly 2GB of disk space +- When generating MacOS wheels, you must have all the correct versions of python installed with `pyenv`. Run the script `utils/wheels/installPyEnvVersions.sh` to install the correct versions of python. + +# Usage +Once you know you are on the correct machine, run the script for your desired architecture and operating system. For example, to generate a macos x86_64 wheel, run: + +```bash +./build-wheels-macos-aarch64.sh https://github.com/4D-STAR/GridFire +``` + +Once you have all the wheels generated (which will likely require multiple systems), copy all the wheels into a single +directory (lets assume its called `wheels` and in the root of the directory) and then run (from the root of the repository): + +```bash +python -m pip install --upgrade build +python -m build --sdist --outdir wheels +twine upload wheels/* +``` + +Thie will also take a while (it needs to upload all the wheels to PyPI) but will result in all the wheels being uploaded to PyPI. \ No newline at end of file