Skip to content
Open
Show file tree
Hide file tree
Changes from 11 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 25 additions & 39 deletions .github/workflows/deploy-on-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -275,29 +275,28 @@ jobs:
wheels:
needs: setup-jobs
if: needs.setup-jobs.outputs.allowed-jobs == 'Wheels' || needs.setup-jobs.outputs.allowed-jobs == 'All'
name: ${{ matrix.name }} ${{ matrix.py }} wheel
name: ${{ matrix.name }} Stable ABI wheel
Comment thread
agarny marked this conversation as resolved.
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [macos-15, ubuntu-24.04, ubuntu-24.04-arm, windows-2025-vs2026, windows-11-arm]
py: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
os: [macos-15, macos-15-intel, ubuntu-24.04, ubuntu-24.04-arm, windows-2025-vs2026, windows-11-arm]
py: ['3.14']
Comment thread
agarny marked this conversation as resolved.
Comment thread
hsorby marked this conversation as resolved.
include:
- name: 'Windows'
os: windows-2025-vs2026
- name: 'Windows ARM'
os: windows-11-arm
- name: 'Linux'
- name: 'LinuxARM'
os: ubuntu-24.04-arm
- name: 'Linux ARM'
- name: 'LinuxIntel'
os: ubuntu-24.04
- name: 'macOS'
- name: 'macOSARM'
os: macos-15
exclude:
- os: ubuntu-24.04
py: '3.9'
- os: ubuntu-24.04-arm
py: '3.9'
- name: 'macOSIntel'
os: macos-15-intel
- name: 'WindowsARM'
os: windows-11-arm
arch: arm64
- name: 'WindowsIntel'
os: windows-2025-vs2026
arch: amd64

steps:
- name: Check out libCellML
Expand All @@ -309,57 +308,44 @@ jobs:
id: setup
shell: bash
run: |
VERSION="${GITHUB_REF_NAME_TMP#refs/tags/v}"
if [[ "$OSTYPE" == "darwin*" ]]; then
VERSION="${GITHUB_REF#refs/tags/v}"
echo "Setting version as: VERSION=${VERSION}"
if [[ "$OSTYPE" == darwin* ]]; then
sed -i '' "s/__VERSION__/${VERSION}/" src/bindings/python/pyproject.toml
else
sed -i "s/__VERSION__/${VERSION}/" src/bindings/python/pyproject.toml
fi
grep '^version' src/bindings/python/pyproject.toml

v=${{ matrix.py }}
echo "Setting tag as: tag=${GITHUB_REF#refs/tags/}"
echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
echo "Setting build as: build=cp${v/./}-*"
echo "build=cp${v/./}-*" >> $GITHUB_OUTPUT
if [[ "macOS" == "${{ matrix.name }}" ]]; then
echo "Setting macos_archs as: macos_archs='x86_64 arm64'"
echo "macos_archs=x86_64 arm64" >> $GITHUB_OUTPUT
echo "macos_deployment_target=14.0" >> $GITHUB_OUTPUT
elif [[ "Windows" == "${{ matrix.name }}" ]]; then
echo "Setting win_arch as: win_arch=amd64"
echo "win_arch=amd64" >> $GITHUB_OUTPUT
elif [[ "Windows ARM" == "${{ matrix.name }}" ]]; then
echo "Setting win_arch as: win_arch=arm64"
echo "win_arch=arm64" >> $GITHUB_OUTPUT
fi

- name: Configure MSVC (Windows)
if: runner.os == 'Windows'
uses: TheMrMilchmann/setup-msvc-dev@v4
with:
arch: ${{ steps.setup.outputs.win_arch }}
arch: ${{ matrix.arch }}

- name: Install SWIG (macOS)
if: runner.os == 'macOS'
run: brew install swig

- name: Build wheels
uses: pypa/cibuildwheel@v3.4
uses: pypa/cibuildwheel@v4.2
env:
#CIBW_BUILD_VERBOSITY: 1
CIBW_ARCHS: auto64
CIBW_ARCHS_MACOS: ${{ steps.setup.outputs.macos_archs }}
CIBW_BUILD: ${{ steps.setup.outputs.build }}
CIBW_TEST_SKIP: "*_arm64"
CIBW_BEFORE_ALL_LINUX: yum install -y libxml2-devel || (apk add libxml2-dev && rm /usr/lib/cmake/libxml2/libxml2-config.cmake)
CIBW_ENVIRONMENT: >
LIBCELLML_VERSION_TAG=${{ steps.setup.outputs.tag }}
MACOSX_DEPLOYMENT_TARGET=${{ steps.setup.outputs.macos_deployment_target }}
CIBW_REPAIR_WHEEL_COMMAND_MACOS: ""
LIBCELLML_VERSION_TAG=${{ github.event.release.tag_name }}
MACOSX_DEPLOYMENT_TARGET=14.0
CIBW_BEFORE_BUILD_LINUX: pip install renamewheel
CIBW_BEFORE_BUILD_WINDOWS: cd src/bindings/python && cmake -S wheel_dependencies -B build-wheel_dependencies -G Ninja && cd build-wheel_dependencies && ninja
CIBW_REPAIR_WHEEL_COMMAND_LINUX: renamewheel -w {dest_dir} {wheel}
CIBW_REPAIR_WHEEL_COMMAND_MACOS: ""
CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: ""
Comment thread
hsorby marked this conversation as resolved.
with:
output-dir: wheelhouse
package-dir: src/bindings/python/
Expand All @@ -368,13 +354,13 @@ jobs:
uses: actions/upload-artifact@v7
with:
path: ./wheelhouse/*.whl
name: ${{ matrix.name }}-${{ matrix.py }}-wheel
name: ${{ matrix.name }}-wheel
retention-days: ${{ env.ARTIFACT_RETENTION_DAYS }}

publish-wheels:
if: needs.setup-jobs.outputs.binaries-destination == 'Publish'
needs: wheels
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
timeout-minutes: 5 # Docker+network are slow sometimes.
permissions:
id-token: write
Expand Down
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.

cmake_minimum_required(VERSION 3.18.0)
cmake_minimum_required(VERSION 3.26.0)
Comment thread
hsorby marked this conversation as resolved.

if(APPLE)
set(CMAKE_OSX_DEPLOYMENT_TARGET 14.0 CACHE STRING "Minimum OS X deployment version.")
Expand Down
13 changes: 11 additions & 2 deletions cmake/environmentchecks.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,16 @@ else ()

test_undefined_symbols_allowed()

find_package(Python ${PREFERRED_PYTHON_VERSION} COMPONENTS Interpreter ${_FIND_PYTHON_DEVELOPMENT_TYPE})
find_package(Python ${PREFERRED_PYTHON_VERSION} COMPONENTS Interpreter Development.SABIModule Development.Module)

if (TARGET Python::SABIModule)
set(_PYTHON_LINK_TARGET Python::SABIModule)
elseif (TARGET Python::Module)
message(STATUS "Using backup Python::Module target for linking.")
set(_PYTHON_LINK_TARGET Python::Module)
Comment thread
hsorby marked this conversation as resolved.
else()
message(STATUS "Could not find Python::SABIModule or Python::Module target.")
endif()

find_program(BUILDCACHE_EXE buildcache)
if(NOT BUILDCACHE_EXE)
Expand Down Expand Up @@ -152,7 +161,7 @@ if(SWIG_EXECUTABLE)
set(BINDINGS_AVAILABLE TRUE CACHE INTERNAL "Executable required to generate bindings is available.")
endif()

if(BINDINGS_AVAILABLE AND (Python_Development.Module_FOUND OR Python_Development_FOUND))
if(BINDINGS_AVAILABLE AND (Python_Development.SABIModule_FOUND OR Python_Development.Module_FOUND))
set(PYTHON_BINDINGS_AVAILABLE TRUE CACHE INTERNAL "Requirements for creating Python bindings are available.")
endif()

Expand Down
2 changes: 1 addition & 1 deletion docs/configure_and_build.rst
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Configure with CMake

The first step is to use :cmake:`CMake<>` to configure and generate build files for the libCellML library.
Linux and MacOS use a command line interface, and under Windows there is an optional GUI.
Note that CMake version 3.2 or later is required to configure libCellML.
Note that CMake version 3.26 or later is required to configure libCellML.
Instructions and information about installing CMake can be found in the :ref:`Setup <setup_cmake>` section.


Expand Down
2 changes: 1 addition & 1 deletion docs/setup.rst
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ CMake

:cmake:`CMake<>` is the cross-platform family of tools designed to build, test and package software.
CMake is used to control the software compilation process using simple platform and compiler independent configuration files, and to generate native makefiles and workspaces that can be used in the compiler environment of your choice.
Note that CMake version 3.2 or later is required to configure libCellML.
Note that CMake version 3.26 or later is required to configure libCellML.

Again, installation of CMake is particular to each operating system.

Expand Down
7 changes: 3 additions & 4 deletions docs/versions.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@

This document outlines the versions of packages which libCellML requires.

**TODO**



It is prefereable to use SWIG version 4.4.0 or later, but it is possible to use SWIG version 3.0.12 if necessary.

Check failure on line 9 in docs/versions.rst

View workflow job for this annotation

GitHub Actions / Check for spelling errors

prefereable ==> preferable
This is only relevant if creating the Python bindings for libCellML against the stable API using a Python version less than 3.15 and you intend to use it with a Python version of at least 3.15.
Comment thread
hsorby marked this conversation as resolved.
Outdated

**TODO**
9 changes: 3 additions & 6 deletions src/bindings/python/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -94,17 +94,14 @@ foreach(SWIG_INTERFACE_SRC ${SWIG_INTERFACE_SRCS})
SOURCES ${SWIG_INTERFACE_SRC}
)
target_link_libraries(${MODULE_TARGET} PRIVATE cellml)
if(Python_Development.SABIModule_FOUND)
target_compile_definitions(${MODULE_TARGET} PRIVATE Py_LIMITED_API=0x030a0000)
endif()
Comment thread
hsorby marked this conversation as resolved.

if(SWIG_VERSION VERSION_GREATER_EQUAL 4.1.0)
set_target_properties(${MODULE_TARGET} PROPERTIES SWIG_COMPILE_OPTIONS -flatstaticmethod)
endif()

if(FIND_PYTHON_DEVELOPMENT_MODULE)
set(_PYTHON_LINK_TARGET Python::Module)
else()
set(_PYTHON_LINK_TARGET Python::Python)
endif()

if (APPLE)
# Specifically allow dynamic lookup, here we are really targeting Python symbols.
set_target_properties(${MODULE_TARGET} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
Expand Down
1 change: 1 addition & 0 deletions src/bindings/python/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ cmake.source-dir = "../../.."
cmake.version = ">=3.26.1"
install.targets = ["install-wheel"]
ninja.version = ">=1.11"
wheel.py-api = "cp310"

[[tool.scikit-build.overrides]]
if.platform-system = "^win32"
Expand Down
Loading