From 56b8df90f4877ca962f459b7b1e271c89c4b1aca Mon Sep 17 00:00:00 2001 From: Alan Morris Date: Sat, 18 Apr 2026 11:03:44 -0600 Subject: [PATCH 1/5] Setting release string to 6.7.0 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6044483fbe..0a8247c154 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ cmake_minimum_required(VERSION 3.20) SET(SHAPEWORKS_MAJOR_VERSION 6 CACHE INTERNAL "Major version number" FORCE) SET(SHAPEWORKS_MINOR_VERSION 7 CACHE INTERNAL "Minor version number" FORCE) SET(SHAPEWORKS_PATCH_VERSION 0 CACHE INTERNAL "Patch version number" FORCE) -SET(SHAPEWORKS_VERSION_STRING "6.7.0-dev") +SET(SHAPEWORKS_VERSION_STRING "6.7.0") SET(SHAPEWORKS_VERSION "${SHAPEWORKS_MAJOR_VERSION}.${SHAPEWORKS_MINOR_VERSION}.${SHAPEWORKS_PATCH_VERSION}") # First, check that files were checked out properly using git-lfs From 91a39fc215d0832699f933b62532c34e739d3db8 Mon Sep 17 00:00:00 2001 From: Alan Morris Date: Tue, 21 Apr 2026 11:06:42 -0600 Subject: [PATCH 2/5] Fix Mac install path and pin macOS deployment target to 12.0 Two unrelated Mac install/build fixes bundled: - Replace bare `pip` with `python -m pip` in install_shapeworks.sh and Installation/install_python_module.sh. On Intel Macs with Homebrew, `/usr/local/bin/pip` can shadow the conda env pip even when python resolves correctly, causing package installs (numpy<2, open3d, shapeworks Python packages) to land in the wrong interpreter and install_python_module.sh to fail with a bad shebang before it could substitute the shapeworks_py path. - Add MACOSX_DEPLOYMENT_TARGET=12.0 to both Mac workflows and the cmake invocation, and fold the target into the deps cache key to force a rebuild of cached deps. Without a pin, binaries built on macos-15 runners required macOS 15+ at dlopen (missing newer libc++ symbols like std::exception_ptr::__from_native_exception_pointer), breaking ShapeWorks on anything older than Sequoia. --- .github/workflows/build-mac-arm64.yml | 7 ++++--- .github/workflows/build-mac.yml | 7 ++++--- Installation/install_python_module.sh | 2 +- install_shapeworks.sh | 14 +++++++------- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build-mac-arm64.yml b/.github/workflows/build-mac-arm64.yml index 80cf0bf628..f67fab5c27 100644 --- a/.github/workflows/build-mac-arm64.yml +++ b/.github/workflows/build-mac-arm64.yml @@ -12,6 +12,7 @@ on: env: # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) BUILD_TYPE: Release + MACOSX_DEPLOYMENT_TARGET: "12.0" SW_CLOUD_LOGIN: ${{ secrets.CLOUD_LOGIN }} CACHE_HOST: ${{ secrets.SSH_HOST }} GA_MEASUREMENT_ID: ${{ secrets.GA_MEASUREMENT_ID }} @@ -55,7 +56,7 @@ jobs: uses: actions/cache/restore@v3 with: path: /Users/runner/install - key: ${{ runner.os }}-arm64-deps-${{ hashFiles('.github/workflows/gha_deps.sh', 'install_shapeworks.sh', 'python_requirements.txt', 'build_dependencies.sh') }} + key: ${{ runner.os }}-arm64-deps-osx${{ env.MACOSX_DEPLOYMENT_TARGET }}-${{ hashFiles('.github/workflows/gha_deps.sh', 'install_shapeworks.sh', 'python_requirements.txt', 'build_dependencies.sh') }} - name: Build Dependencies if: steps.cache-deps-restore.outputs.cache-hit != 'true' @@ -67,11 +68,11 @@ jobs: uses: actions/cache/save@v3 with: path: /Users/runner/install - key: ${{ runner.os }}-arm64-deps-${{ hashFiles('.github/workflows/gha_deps.sh', 'install_shapeworks.sh', 'python_requirements.txt', 'build_dependencies.sh') }} + key: ${{ runner.os }}-arm64-deps-osx${{ env.MACOSX_DEPLOYMENT_TARGET }}-${{ hashFiles('.github/workflows/gha_deps.sh', 'install_shapeworks.sh', 'python_requirements.txt', 'build_dependencies.sh') }} - name: cmake shell: bash -l {0} - run: conda activate shapeworks && mkdir build && cd build && cmake -DCMAKE_LIBTOOL=/usr/bin/libtool -DCMAKE_CXX_FLAGS="-g -Wno-enum-constexpr-conversion" -DCMAKE_PREFIX_PATH=$HOME/install -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DPython3_ROOT_DIR:FILEPATH=${CONDA_PREFIX} -DUSE_OPENMP=OFF -DBuild_Studio=ON -DCMAKE_INSTALL_PREFIX=${GITHUB_WORKSPACE}/shapeworks-install -DBUILD_DOCUMENTATION=ON -DGA_MEASUREMENT_ID=$GA_MEASUREMENT_ID -DGA_API_SECRET=$GA_API_SECRET .. + run: conda activate shapeworks && mkdir build && cd build && cmake -DCMAKE_LIBTOOL=/usr/bin/libtool -DCMAKE_CXX_FLAGS="-g -Wno-enum-constexpr-conversion" -DCMAKE_OSX_DEPLOYMENT_TARGET=$MACOSX_DEPLOYMENT_TARGET -DCMAKE_PREFIX_PATH=$HOME/install -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DPython3_ROOT_DIR:FILEPATH=${CONDA_PREFIX} -DUSE_OPENMP=OFF -DBuild_Studio=ON -DCMAKE_INSTALL_PREFIX=${GITHUB_WORKSPACE}/shapeworks-install -DBUILD_DOCUMENTATION=ON -DGA_MEASUREMENT_ID=$GA_MEASUREMENT_ID -DGA_API_SECRET=$GA_API_SECRET .. - name: make shell: bash -l {0} diff --git a/.github/workflows/build-mac.yml b/.github/workflows/build-mac.yml index c54c1629ce..3b1f83f873 100644 --- a/.github/workflows/build-mac.yml +++ b/.github/workflows/build-mac.yml @@ -12,6 +12,7 @@ on: env: # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) BUILD_TYPE: Release + MACOSX_DEPLOYMENT_TARGET: "12.0" SW_CLOUD_LOGIN: ${{ secrets.CLOUD_LOGIN }} CACHE_HOST: ${{ secrets.SSH_HOST }} GA_MEASUREMENT_ID: ${{ secrets.GA_MEASUREMENT_ID }} @@ -56,7 +57,7 @@ jobs: uses: actions/cache/restore@v3 with: path: /Users/runner/install - key: ${{ runner.os }}-intel-deps-${{ hashFiles('.github/workflows/gha_deps.sh', 'install_shapeworks.sh', 'python_requirements.txt', 'build_dependencies.sh') }} + key: ${{ runner.os }}-intel-deps-osx${{ env.MACOSX_DEPLOYMENT_TARGET }}-${{ hashFiles('.github/workflows/gha_deps.sh', 'install_shapeworks.sh', 'python_requirements.txt', 'build_dependencies.sh') }} - name: Build Dependencies shell: bash -l {0} @@ -67,11 +68,11 @@ jobs: uses: actions/cache/save@v3 with: path: /Users/runner/install - key: ${{ runner.os }}-intel-deps-${{ hashFiles('.github/workflows/gha_deps.sh', 'install_shapeworks.sh', 'python_requirements.txt', 'build_dependencies.sh') }} + key: ${{ runner.os }}-intel-deps-osx${{ env.MACOSX_DEPLOYMENT_TARGET }}-${{ hashFiles('.github/workflows/gha_deps.sh', 'install_shapeworks.sh', 'python_requirements.txt', 'build_dependencies.sh') }} - name: cmake shell: bash -l {0} - run: conda activate shapeworks && mkdir build && cd build && cmake -DCMAKE_LIBTOOL=/usr/bin/libtool -DCMAKE_CXX_FLAGS=-g -DCMAKE_PREFIX_PATH=$HOME/install -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DPython3_ROOT_DIR:FILEPATH=${CONDA_PREFIX} -DUSE_OPENMP=OFF -DBuild_Studio=ON -DCMAKE_INSTALL_PREFIX=${GITHUB_WORKSPACE}/shapeworks-install -DBUILD_DOCUMENTATION=OFF -DGA_MEASUREMENT_ID=$GA_MEASUREMENT_ID -DGA_API_SECRET=$GA_API_SECRET .. + run: conda activate shapeworks && mkdir build && cd build && cmake -DCMAKE_LIBTOOL=/usr/bin/libtool -DCMAKE_CXX_FLAGS=-g -DCMAKE_OSX_DEPLOYMENT_TARGET=$MACOSX_DEPLOYMENT_TARGET -DCMAKE_PREFIX_PATH=$HOME/install -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DPython3_ROOT_DIR:FILEPATH=${CONDA_PREFIX} -DUSE_OPENMP=OFF -DBuild_Studio=ON -DCMAKE_INSTALL_PREFIX=${GITHUB_WORKSPACE}/shapeworks-install -DBUILD_DOCUMENTATION=OFF -DGA_MEASUREMENT_ID=$GA_MEASUREMENT_ID -DGA_API_SECRET=$GA_API_SECRET .. - name: make shell: bash -l {0} diff --git a/Installation/install_python_module.sh b/Installation/install_python_module.sh index d78cedb7d2..3aa03c7ffa 100755 --- a/Installation/install_python_module.sh +++ b/Installation/install_python_module.sh @@ -4,7 +4,7 @@ # Ensures conda Python module is able to locate correct shapeworks_py binary module. -CONDA_INSTALL_DIR=`pip show shapeworks | grep Location | awk '{print $2}'`/shapeworks +CONDA_INSTALL_DIR=`python -m pip show shapeworks | grep Location | awk '{print $2}'`/shapeworks # check if $CONDA_INSTALL_DIR is under $CONDA_PREFIX if [[ "$CONDA_INSTALL_DIR" != "$CONDA_PREFIX"* ]]; then diff --git a/install_shapeworks.sh b/install_shapeworks.sh index eaf5c410c1..3da2cb2a01 100644 --- a/install_shapeworks.sh +++ b/install_shapeworks.sh @@ -173,7 +173,7 @@ function install_conda() { if [[ $(uname -s) == "Darwin" ]] && [[ $(uname -m) == "x86_64" ]]; then # Intel Mac - use older versions with NumPy 1.x if ! python -m light_the_torch install torch==2.2.2 torchaudio==2.2.2 torchvision==0.17.2; then return 1; fi - pip install "numpy<2" + python -m pip install "numpy<2" else # Apple Silicon, Linux, Windows - use latest with NumPy 2.x support if ! python -m light_the_torch install torch==2.8.0 torchaudio==2.8.0 torchvision==0.23.0; then return 1; fi @@ -183,13 +183,13 @@ function install_conda() { # open3d needs to be installed differently on each platform so it's not part of python_requirements.txt OPEN3D_INSTALLED=NO if [[ "$(uname)" == "Linux" ]]; then - if pip install open3d-cpu==0.19.0; then + if python -m pip install open3d-cpu==0.19.0; then OPEN3D_INSTALLED=YES else echo "WARNING: open3d-cpu could not be installed. Network analysis features will not be available." fi elif [[ "$(uname)" == "Darwin" ]]; then - if pip install open3d==0.19.0; then + if python -m pip install open3d==0.19.0; then OPEN3D_INSTALLED=YES if [[ "$(uname -m)" == "arm64" ]]; then pushd $CONDA_PREFIX/lib/python3.12/site-packages/open3d/cpu @@ -202,7 +202,7 @@ function install_conda() { echo "WARNING: open3d could not be installed. Network analysis features will not be available." fi else - if pip install open3d==0.19.0; then + if python -m pip install open3d==0.19.0; then OPEN3D_INSTALLED=YES else echo "WARNING: open3d could not be installed. Network analysis features will not be available." @@ -211,9 +211,9 @@ function install_conda() { for package in DataAugmentationUtilsPackage DatasetUtilsPackage MONAILabelPackage DeepSSMUtilsPackage DocumentationUtilsPackage ShapeCohortGenPackage shapeworks ; do if [[ -e Python/${package}.tar.gz ]] ; then - if ! pip install Python/${package}.tar.gz; then return 1; fi + if ! python -m pip install Python/${package}.tar.gz; then return 1; fi else - if ! pip install Python/${package}; then return 1; fi + if ! python -m pip install Python/${package}; then return 1; fi fi done @@ -270,7 +270,7 @@ if install_conda; then conda list echo "Pip installed packages:" - pip list + python -m pip list conda clean -t -y From b87418ea4b682d00a97a2902bbca592d598a4e0c Mon Sep 17 00:00:00 2001 From: Alan Morris Date: Fri, 24 Apr 2026 09:07:21 -0600 Subject: [PATCH 3/5] Update version to 6.8.0-dev --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a8247c154..8926575d6d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,9 +4,9 @@ cmake_minimum_required(VERSION 3.20) # SHAPEWORKS VERSION ########################################### SET(SHAPEWORKS_MAJOR_VERSION 6 CACHE INTERNAL "Major version number" FORCE) -SET(SHAPEWORKS_MINOR_VERSION 7 CACHE INTERNAL "Minor version number" FORCE) +SET(SHAPEWORKS_MINOR_VERSION 8 CACHE INTERNAL "Minor version number" FORCE) SET(SHAPEWORKS_PATCH_VERSION 0 CACHE INTERNAL "Patch version number" FORCE) -SET(SHAPEWORKS_VERSION_STRING "6.7.0") +SET(SHAPEWORKS_VERSION_STRING "6.8.0-dev") SET(SHAPEWORKS_VERSION "${SHAPEWORKS_MAJOR_VERSION}.${SHAPEWORKS_MINOR_VERSION}.${SHAPEWORKS_PATCH_VERSION}") # First, check that files were checked out properly using git-lfs From 97716f72eed58f486af341093d6f42bd7d038e43 Mon Sep 17 00:00:00 2001 From: Alan Morris Date: Fri, 24 Apr 2026 09:12:47 -0600 Subject: [PATCH 4/5] Bump API version to 6.8 and fix PythonWorker.h path in release docs --- Libs/Application/Job/PythonWorker.h | 2 +- Python/shapeworks/shapeworks/utils.py | 2 +- docs/dev/release-process.md | 2 +- install_shapeworks.bat | 6 +++--- install_shapeworks.sh | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Libs/Application/Job/PythonWorker.h b/Libs/Application/Job/PythonWorker.h index 2179c983cb..3e10391411 100644 --- a/Libs/Application/Job/PythonWorker.h +++ b/Libs/Application/Job/PythonWorker.h @@ -18,7 +18,7 @@ class PythonWorker : public QObject { Q_OBJECT public: - constexpr static const char* python_api_version = "6.7"; + constexpr static const char* python_api_version = "6.8"; PythonWorker(); ~PythonWorker(); diff --git a/Python/shapeworks/shapeworks/utils.py b/Python/shapeworks/shapeworks/utils.py index c8599c4c4f..a954006605 100644 --- a/Python/shapeworks/shapeworks/utils.py +++ b/Python/shapeworks/shapeworks/utils.py @@ -172,7 +172,7 @@ def compute_line_indices(n, is_closed=True): def get_api_version(): - return "6.7" + return "6.8" def set_sw_logger(log_object): diff --git a/docs/dev/release-process.md b/docs/dev/release-process.md index 94ab7e3852..ffb8ebeaa8 100644 --- a/docs/dev/release-process.md +++ b/docs/dev/release-process.md @@ -19,7 +19,7 @@ SET(SHAPEWORKS_VERSION "${SHAPEWORKS_MAJOR_VERSION}.${SHAPEWORKS_MINOR_VERSION}. TODO - This should be automated from a single place -- `Studio/Python/PythonWorker.h` +- `Libs/Application/Job/PythonWorker.h` ``` constexpr static const char* python_api_version = "6.5"; diff --git a/install_shapeworks.bat b/install_shapeworks.bat index 7006b1d1fb..239e6ced75 100644 --- a/install_shapeworks.bat +++ b/install_shapeworks.bat @@ -85,9 +85,9 @@ call .\Installation\install_python_module.bat || goto :error call .\Installation\conda_env_setup.bat || goto :error md "%USERPROFILE%\.shapeworks" -python -c "import sys; print('\n'.join(sys.path))" > "%USERPROFILE%\.shapeworks\python_path_6.7.txt" -python -c "import sys; print(sys.prefix)" > "%USERPROFILE%\.shapeworks\python_home_6.7.txt" -echo %PATH% > "%USERPROFILE%\.shapeworks\path_6.7.txt" +python -c "import sys; print('\n'.join(sys.path))" > "%USERPROFILE%\.shapeworks\python_path_6.8.txt" +python -c "import sys; print(sys.prefix)" > "%USERPROFILE%\.shapeworks\python_home_6.8.txt" +echo %PATH% > "%USERPROFILE%\.shapeworks\path_6.8.txt" call conda info REM === Validating installation === diff --git a/install_shapeworks.sh b/install_shapeworks.sh index 3da2cb2a01..4187bb0f7c 100644 --- a/install_shapeworks.sh +++ b/install_shapeworks.sh @@ -2,7 +2,7 @@ # Installs conda environment for building ShapeWorks # -SW_MAJOR_VERSION=6.7 +SW_MAJOR_VERSION=6.8 # Set up logging INSTALL_LOG="install_shapeworks_$(date +%Y%m%d_%H%M%S).log" From 136b92683723c4038002ac93662e2e3bd4902d9c Mon Sep 17 00:00:00 2001 From: Alan Morris Date: Fri, 24 Apr 2026 13:41:11 -0600 Subject: [PATCH 5/5] Bump devenv.sh SW_MAJOR_VERSION to 6.8 and add it to release checklist --- devenv.sh | 2 +- docs/dev/release-process.md | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/devenv.sh b/devenv.sh index 30b4a9dc96..c57c30c383 100644 --- a/devenv.sh +++ b/devenv.sh @@ -11,7 +11,7 @@ # compiled portion of the Python bindings). # -SW_MAJOR_VERSION=6.7 +SW_MAJOR_VERSION=6.8 (return 0 2>/dev/null) && sourced=1 || sourced=0 diff --git a/docs/dev/release-process.md b/docs/dev/release-process.md index ffb8ebeaa8..3a98306f15 100644 --- a/docs/dev/release-process.md +++ b/docs/dev/release-process.md @@ -46,6 +46,12 @@ python -c "import sys; print(sys.prefix)" > "%USERPROFILE%\.shapeworks\python_ho echo %PATH% > "%USERPROFILE%\.shapeworks\path_6.5.txt" ``` +- `devenv.sh` + +``` +SW_MAJOR_VERSION=6.5 +``` + * Update Release Notes - Update `docs/about/release_notes.md` with the new release notes