Skip to content

Add BUILD_PYPI option, use it to control installation of libraries int… #5963

Add BUILD_PYPI option, use it to control installation of libraries int…

Add BUILD_PYPI option, use it to control installation of libraries int… #5963

name: continuous-integration
# syntax https://help.github.com/en/articles/workflow-syntax-for-github-actions
on:
# Run at 2am every night.
schedule:
- cron: '0 2 * * *'
pull_request:
branches:
- '*'
push:
branches:
- main
tags:
- '*'
jobs:
windows:
runs-on: windows-2025
name: Windows
outputs:
version: ${{ steps.configure.outputs.version }}
steps:
- uses: actions/checkout@v4
- name: Install Doxygen
# choco install doxygen.portable # <-- too unreliable.
run: |
(New-Object System.Net.WebClient).DownloadFile("https://github.com/doxygen/doxygen/releases/download/Release_1_12_0/doxygen-1.12.0.windows.x64.bin.zip", "doxygen.zip")
7z x $env:GITHUB_WORKSPACE/doxygen.zip -odoxygen
echo "$env:GITHUB_WORKSPACE\\doxygen" >> $GITHUB_PATH
- name: Install Python packages
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install numpy
#Need numpy to use SWIG numpy typemaps.
run: |
python3 -m pip install numpy==2.0
python3 -m pip install wheel
python3 -m pip install build
- name: Install SWIG
run: |
choco install swig --version 4.2.0 --yes --limit-output --allow-downgrade
swig -swiglib
- name: Cache dependencies
id: cache-dependencies
uses: actions/cache@v3
with:
path: ~/opensim_dependencies_install
# Every time a cache is created, it's stored with this key.
# In subsequent runs, if the key matches the key of an existing cache,
# then the cache is used. We chose for this key to depend on the
# operating system and a hash of the hashes of all files in the
# dependencies directory (non-recursive).
# https://help.github.com/en/actions/automating-your-workflow-with-github-actions/caching-dependencies-to-speed-up-workflows#matching-a-cache-key
key: ${{ runner.os }}-dependencies-${{ hashFiles('dependencies/*') }}
- name: Build dependencies
if: steps.cache-dependencies.outputs.cache-hit != 'true'
run: |
echo $env:GITHUB_WORKSPACE\\build_deps
mkdir $env:GITHUB_WORKSPACE\\build_deps
chdir $env:GITHUB_WORKSPACE\\build_deps
# /W0 disables warnings.
# https://msdn.microsoft.com/en-us/library/19z1t1wy.aspx
# TODO: CMake provides /W3, which overrides our /W0
cmake -E env CXXFLAGS="/W0 /MD" cmake $env:GITHUB_WORKSPACE/dependencies -LAH -G"Visual Studio 17 2022" -A x64 -DCMAKE_INSTALL_PREFIX=~/opensim_dependencies_install -DSUPERBUILD_ezc3d=ON -DOPENSIM_WITH_=ON -DOPENSIM_PYTHON_STANDALONE=ON
cmake --build . --config Release -- /maxcpucount:4
- name: Configure opensim-core
id: configure
run: |
mkdir $env:GITHUB_WORKSPACE\\build
chdir $env:GITHUB_WORKSPACE\\build
# TODO: Can remove /WX when we use that in CMakeLists.txt.
# Set the CXXFLAGS environment variable to turn warnings into errors.
# Skip timing test section included by default.
cmake -E env CXXFLAGS="/WX /MD -DSKIP_TIMING" cmake $env:GITHUB_WORKSPACE -LAH -G"Visual Studio 17 2022" -A x64 -DCMAKE_INSTALL_PREFIX=~/opensim-core-install -DOPENSIM_DEPENDENCIES_DIR=~/opensim_dependencies_install -DOPENSIM_C3D_PARSER=ezc3d -DOPENSIM_WITH_=on -DBUILD_PYTHON_WRAPPING=on -DBUILD_JAVA_WRAPPING=on -DPython3_ROOT_DIR=C:\hostedtoolcache\windows\Python\3.11.9\x64
$env:match = cmake -L . | Select-String -Pattern OPENSIM_QUALIFIED_VERSION
$version = $env:match.split('=')[1]
echo $version
echo "VERSION=$version" >> $GITHUB_ENV
echo "version=$version" >> $env:GITHUB_OUTPUT
- name: Build opensim-core
# Install now to avoid building bindings twice (TODO: still an issue with Visual Studio 2022).
run: |
chdir $env:GITHUB_WORKSPACE\\build
cmake --build . --config Release --target doxygen -- /maxcpucount:4
cmake --build . --config Release --target install -- /maxcpucount:4
- name: Test opensim-core
run: |
chdir $env:GITHUB_WORKSPACE\\build
ctest --parallel 4 --output-on-failure --build-config Release -E Java_*
- name: Install opensim-core
# TODO: This is where we wish to do the installing, but it's done above for now.
run: |
chdir $env:GITHUB_WORKSPACE\\build
chdir $env:GITHUB_WORKSPACE
Copy-Item -Path "~/opensim-core-install" -Destination "opensim-core-${{ steps.configure.outputs.version }}" -Recurse
7z a "opensim-core-${{ steps.configure.outputs.version }}.zip" "opensim-core-${{ steps.configure.outputs.version }}"
- name: Build wheel
run: |
cd ~/opensim-core-install/sdk/python
python -m build --wheel
- name: Upload windows wheel
uses: actions/upload-artifact@v4
with:
name: opensim-4.5.2-cp310-cp310-win_amd64.whl
path: ~/opensim-core-install/sdk/python/dist/opensim-4.5.2-cp310-cp310-win_amd64.whl
# # Run python tests.
# python -m unittest discover --start-directory opensim/tests --verbose
- name: Upload opensim-core
uses: actions/upload-artifact@v4
with:
name: opensim-core-${{ steps.configure.outputs.version }}-win
path: opensim-core-${{ steps.configure.outputs.version }}.zip
mac_x86_64:
runs-on: macos-15-intel
name: Mac x86_64
outputs:
version: ${{ steps.configure.outputs.version }}
steps:
- uses: actions/checkout@v4
- name: Install Python packages
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install Homebrew packages
# Save the gfortran version to a file so we can use it in the cache key.
run: |
brew install pkgconfig autoconf libtool automake wget pcre doxygen llvm
brew reinstall gcc
pip3 install numpy==2.0
gfortran -v
mkdir gfortran_version
gfortran -v &> gfortran_version/gfortran_version.txt
- name: Cache SWIG
id: cache-swig
uses: actions/cache@v3
with:
path: ~/swig
key: ${{ runner.os }}-swig
- name: Install SWIG
# if: steps.cache-swig.outputs.cache-hit != 'true'
run: |
mkdir ~/swig-source && cd ~/swig-source
wget https://github.com/swig/swig/archive/refs/tags/v4.1.1.tar.gz
tar xzf v4.1.1.tar.gz && cd swig-4.1.1
sh autogen.sh && ./configure --prefix=$HOME/swig --disable-ccache
make && make -j4 install
- name: Cache dependencies
id: cache-dependencies
uses: actions/cache@v3
with:
path: ~/opensim_dependencies_install
# If Homebrew updates the gcc package, then our cache of IPOPT is invalid.
# Specifically, the pkgcfg_lib_IPOPT_gfortran CMake variable becomes
# undefined.
key: ${{ runner.os }}-dependencies-${{ hashFiles('dependencies/*') }}-${{ hashFiles('gfortran_version/*') }}
- name: Build dependencies
if: steps.cache-dependencies.outputs.cache-hit != 'true'
run: |
mkdir $GITHUB_WORKSPACE/../build_deps
cd $GITHUB_WORKSPACE/../build_deps
DEP_CMAKE_ARGS=($GITHUB_WORKSPACE/dependencies -LAH)
DEP_CMAKE_ARGS+=(-DCMAKE_INSTALL_PREFIX=~/opensim_dependencies_install)
DEP_CMAKE_ARGS+=(-DCMAKE_BUILD_TYPE=Release)
DEP_CMAKE_ARGS+=(-DSUPERBUILD_ezc3d=ON)
DEP_CMAKE_ARGS+=(-DOPENSIM_WITH_=ON)
DEP_CMAKE_ARGS+=(-DOPENSIM_DISABLE_LOG_FILE=ON)
DEP_CMAKE_ARGS+=(-DCMAKE_OSX_DEPLOYMENT_TARGET=11)
printf '%s\n' "${DEP_CMAKE_ARGS[@]}"
cmake "${DEP_CMAKE_ARGS[@]}"
make --jobs 4
- name: Configure opensim-core
id: configure
run: |
mkdir $GITHUB_WORKSPACE/../build
cd $GITHUB_WORKSPACE/../build
OSIM_CMAKE_ARGS=($GITHUB_WORKSPACE -LAH)
OSIM_CMAKE_ARGS+=(-DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/../opensim-core-install)
OSIM_CMAKE_ARGS+=(-DCMAKE_BUILD_TYPE=Release)
OSIM_CMAKE_ARGS+=(-DOPENSIM_DEPENDENCIES_DIR=~/opensim_dependencies_install)
OSIM_CMAKE_ARGS+=(-DCMAKE_OSX_DEPLOYMENT_TARGET=11)
OSIM_CMAKE_ARGS+=(-DOPENSIM_C3D_PARSER=ezc3d)
OSIM_CMAKE_ARGS+=(-DBUILD_PYTHON_WRAPPING=on -DBUILD_JAVA_WRAPPING=on)
OSIM_CMAKE_ARGS+=(-DSWIG_EXECUTABLE=$HOME/swig/bin/swig)
OSIM_CMAKE_ARGS+=(-DOPENSIM_INSTALL_UNIX_FHS=OFF)
OSIM_CMAKE_ARGS+=(-DOPENSIM_DOXYGEN_USE_MATHJAX=off)
# TODO: Update to simbody.github.io/latest
OSIM_CMAKE_ARGS+=(-DOPENSIM_SIMBODY_DOXYGEN_LOCATION="https://simbody.github.io/simtk.org/api_docs/simbody/latest/")
OSIM_CMAKE_ARGS+=(-DCMAKE_CXX_FLAGS="-Werror, -Wdeprecated-copy")
printf '%s\n' "${OSIM_CMAKE_ARGS[@]}"
cmake "${OSIM_CMAKE_ARGS[@]}"
VERSION=`cmake -L . | grep OPENSIM_QUALIFIED_VERSION | cut -d "=" -f2`
echo $VERSION
echo "VERSION=$VERSION" >> $GITHUB_ENV
echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Build opensim-core
run: |
cd $GITHUB_WORKSPACE/../build
make --jobs 4
- name: Test opensim-core
run: |
cd $GITHUB_WORKSPACE/../build
ctest --parallel 4 --output-on-failure
- name: Install opensim-core
run: |
cd $GITHUB_WORKSPACE/../build
make doxygen
make install
cd $GITHUB_WORKSPACE
mv $GITHUB_WORKSPACE/../opensim-core-install opensim-core-${{ steps.configure.outputs.version }}
zip --symlinks --recurse-paths --quiet opensim-core-${{ steps.configure.outputs.version }}.zip opensim-core-${{ steps.configure.outputs.version }}
mv opensim-core-${{ steps.configure.outputs.version }} $GITHUB_WORKSPACE/../opensim-core-install
- name: Test Python bindings
run: |
cd $GITHUB_WORKSPACE/../opensim-core-install/sdk/Python
# Run the python tests, verbosely.
python3 -m unittest discover --start-directory opensim/tests --verbose
- name: Upload opensim-core
uses: actions/upload-artifact@v4
with:
# The upload-artifact zipping does not preserve symlinks or executable
# bits. So we zip ourselves, even though this causes a double-zip.
name: opensim-core-${{ steps.configure.outputs.version }}-mac-x86_64
path: opensim-core-${{ steps.configure.outputs.version }}.zip
mac_arm64:
runs-on: macos-15
name: Mac Arm64
outputs:
version: ${{ steps.configure.outputs.version }}
steps:
- uses: actions/checkout@v4
- name: Install Python packages
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install Homebrew packages
# Save the gfortran version to a file so we can use it in the cache key.
run: |
brew install pkgconfig autoconf libtool automake wget pcre doxygen llvm
brew reinstall gcc
pip3 install numpy==2.0
pip3 install wheel
pip3 install build
gfortran -v
mkdir gfortran_version
gfortran -v &> gfortran_version/gfortran_version.txt
- name: Cache SWIG
id: cache-swig
uses: actions/cache@v3
with:
path: ~/swig
key: ${{ runner.os }}-swig
- name: Install SWIG
# if: steps.cache-swig.outputs.cache-hit != 'true'
run: |
mkdir ~/swig-source && cd ~/swig-source
wget https://github.com/swig/swig/archive/refs/tags/v4.1.1.tar.gz
tar xzf v4.1.1.tar.gz && cd swig-4.1.1
sh autogen.sh && ./configure --prefix=$HOME/swig --disable-ccache
make && make -j4 install
- name: Cache dependencies
id: cache-dependencies
uses: actions/cache@v3
with:
path: ~/opensim_dependencies_install
# If Homebrew updates the gcc package, then our cache of IPOPT is invalid.
# Specifically, the pkgcfg_lib_IPOPT_gfortran CMake variable becomes
# undefined.
key: ${{ runner.os }}-dependencies-${{ hashFiles('dependencies/*') }}-${{ hashFiles('gfortran_version/*') }}
- name: Build dependencies
if: steps.cache-dependencies.outputs.cache-hit != 'true'
run: |
mkdir $GITHUB_WORKSPACE/../build_deps
cd $GITHUB_WORKSPACE/../build_deps
DEP_CMAKE_ARGS=($GITHUB_WORKSPACE/dependencies -LAH)
DEP_CMAKE_ARGS+=(-DCMAKE_INSTALL_PREFIX=~/opensim_dependencies_install)
DEP_CMAKE_ARGS+=(-DCMAKE_BUILD_TYPE=Release)
DEP_CMAKE_ARGS+=(-DSUPERBUILD_ezc3d=ON)
DEP_CMAKE_ARGS+=(-DOPENSIM_WITH_=ON)
DEP_CMAKE_ARGS+=(-DOPENSIM_DISABLE_LOG_FILE=ON)
DEP_CMAKE_ARGS+=(-DCMAKE_OSX_DEPLOYMENT_TARGET=11)
printf '%s\n' "${DEP_CMAKE_ARGS[@]}"
cmake "${DEP_CMAKE_ARGS[@]}"
make --jobs 4
- name: Configure opensim-core
id: configure
run: |
mkdir $GITHUB_WORKSPACE/../build
cd $GITHUB_WORKSPACE/../build
OSIM_CMAKE_ARGS=($GITHUB_WORKSPACE -LAH)
OSIM_CMAKE_ARGS+=(-DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/../opensim-core-install)
OSIM_CMAKE_ARGS+=(-DCMAKE_BUILD_TYPE=Release)
OSIM_CMAKE_ARGS+=(-DOPENSIM_DEPENDENCIES_DIR=~/opensim_dependencies_install)
OSIM_CMAKE_ARGS+=(-DCMAKE_OSX_DEPLOYMENT_TARGET=11)
OSIM_CMAKE_ARGS+=(-DOPENSIM_C3D_PARSER=ezc3d)
OSIM_CMAKE_ARGS+=(-DBUILD_PYTHON_WRAPPING=on -DBUILD_JAVA_WRAPPING=on)
OSIM_CMAKE_ARGS+=(-DBUILD_PYPI=on)
OSIM_CMAKE_ARGS+=(-DOPENSIM_WITH_=ON)
OSIM_CMAKE_ARGS+=(-DSWIG_EXECUTABLE=$HOME/swig/bin/swig)
OSIM_CMAKE_ARGS+=(-DOPENSIM_INSTALL_UNIX_FHS=OFF)
OSIM_CMAKE_ARGS+=(-DOPENSIM_DOXYGEN_USE_MATHJAX=off)
# TODO: Update to simbody.github.io/latest
OSIM_CMAKE_ARGS+=(-DOPENSIM_SIMBODY_DOXYGEN_LOCATION="https://simbody.github.io/simtk.org/api_docs/simbody/latest/")
OSIM_CMAKE_ARGS+=(-DCMAKE_CXX_FLAGS="-Werror, -Wdeprecated-copy")
printf '%s\n' "${OSIM_CMAKE_ARGS[@]}"
cmake "${OSIM_CMAKE_ARGS[@]}"
VERSION=`cmake -L . | grep OPENSIM_QUALIFIED_VERSION | cut -d "=" -f2`
echo $VERSION
echo "VERSION=$VERSION" >> $GITHUB_ENV
echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Build opensim-core
run: |
cd $GITHUB_WORKSPACE/../build
make --jobs 4
- name: Test opensim-core
run: |
cd $GITHUB_WORKSPACE/../build
ctest --parallel 4 --output-on-failure
- name: Install opensim-core
run: |
cd $GITHUB_WORKSPACE/../build
make doxygen
make install
cd $GITHUB_WORKSPACE
mv $GITHUB_WORKSPACE/../opensim-core-install opensim-core-${{ steps.configure.outputs.version }}
zip --symlinks --recurse-paths --quiet opensim-core-${{ steps.configure.outputs.version }}.zip opensim-core-${{ steps.configure.outputs.version }}
mv opensim-core-${{ steps.configure.outputs.version }} $GITHUB_WORKSPACE/../opensim-core-install
- name: Build wheel
run: |
cd $GITHUB_WORKSPACE/../opensim-core-install/sdk/Python
python3 -m build --wheel
- name: Upload osx wheel
uses: actions/upload-artifact@v4
with:
name: opensim-4.5.2-cp310-cp310-macosx_15_0_universal2.whl
path: /Users/runner/work/opensim-core/opensim-core-install/sdk/python/dist/opensim-4.5.2-cp310-cp310-macosx_15_0_universal2.whl
- name: Test Python bindings
run: |
cd $GITHUB_WORKSPACE/../opensim-core-install/sdk/Python
# Run the python tests, verbosely.
python3 -m unittest discover --start-directory opensim/tests --verbose
- name: Upload opensim-core
uses: actions/upload-artifact@v4
with:
# The upload-artifact zipping does not preserve symlinks or executable
# bits. So we zip ourselves, even though this causes a double-zip.
name: opensim-core-${{ steps.configure.outputs.version }}-mac-arm64
path: opensim-core-${{ steps.configure.outputs.version }}.zip
ubuntu22:
name: Ubuntu 22.04
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Install Python packages
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install Numpy
run: |
pip install pip --upgrade
pip install numpy==2.0
- name: Install packages
run: sudo apt-get update && sudo apt-get install --yes build-essential libtool autoconf pkg-config gfortran libopenblas-dev liblapack-dev freeglut3-dev libxi-dev libxmu-dev doxygen patchelf
- name: Cache SWIG
id: cache-swig
uses: actions/cache@v3
with:
path: ~/swig
key: ${{ runner.os }}-swig
- name: Install SWIG
# if: steps.cache-swig.outputs.cache-hit != 'true'
run: |
mkdir ~/swig-source && cd ~/swig-source
wget https://github.com/swig/swig/archive/refs/tags/v4.1.1.tar.gz
tar xzf v4.1.1.tar.gz && cd swig-4.1.1
sh autogen.sh && ./configure --prefix=$HOME/swig --disable-ccache
make && make -j4 install
- name: Cache dependencies
id: cache-dependencies
uses: actions/cache@v3
with:
path: ~/opensim_dependencies_install
key: ${{ runner.os }}-dependencies-${{ hashFiles('dependencies/*') }}
- name: Build dependencies
#if: steps.cache-dependencies.outputs.cache-hit != 'true'
run: |
mkdir $GITHUB_WORKSPACE/../build_deps
cd $GITHUB_WORKSPACE/../build_deps
DEP_CMAKE_ARGS=($GITHUB_WORKSPACE/dependencies -LAH)
DEP_CMAKE_ARGS+=(-DCMAKE_INSTALL_PREFIX=~/opensim_dependencies_install)
DEP_CMAKE_ARGS+=(-DCMAKE_BUILD_TYPE=Release)
DEP_CMAKE_ARGS+=(-DSUPERBUILD_ezc3d=ON)
DEP_CMAKE_ARGS+=(-DOPENSIM_WITH_CASADI=ON)
DEP_CMAKE_ARGS+=(-DOPENSIM_DISABLE_LOG_FILE=ON)
printf '%s\n' "${DEP_CMAKE_ARGS[@]}"
cmake "${DEP_CMAKE_ARGS[@]}"
make --jobs 4
- name: Configure opensim-core
id: configure
run: |
mkdir $GITHUB_WORKSPACE/../build
cd $GITHUB_WORKSPACE/../build
OSIM_CMAKE_ARGS=($GITHUB_WORKSPACE -LAH)
OSIM_CMAKE_ARGS+=(-DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/../opensim-core-install)
OSIM_CMAKE_ARGS+=(-DCMAKE_BUILD_TYPE=Release)
OSIM_CMAKE_ARGS+=(-DOPENSIM_DEPENDENCIES_DIR=~/opensim_dependencies_install)
OSIM_CMAKE_ARGS+=(-DOPENSIM_C3D_PARSER=ezc3d)
OSIM_CMAKE_ARGS+=(-DBUILD_PYTHON_WRAPPING=on -DBUILD_JAVA_WRAPPING=on)
OSIM_CMAKE_ARGS+=(-DSWIG_DIR=~/swig/share/swig)
OSIM_CMAKE_ARGS+=(-DSWIG_EXECUTABLE=~/swig/bin/swig)
OSIM_CMAKE_ARGS+=(-DOPENSIM_INSTALL_UNIX_FHS=OFF)
OSIM_CMAKE_ARGS+=(-DOPENSIM_DOXYGEN_USE_MATHJAX=off)
# TODO: Update to simbody.github.io/latest
OSIM_CMAKE_ARGS+=(-DOPENSIM_SIMBODY_DOXYGEN_LOCATION="https://simbody.github.io/simtk.org/api_docs/simbody/latest/")
OSIM_CMAKE_ARGS+=(-DCMAKE_CXX_FLAGS="-Werror")
printf '%s\n' "${OSIM_CMAKE_ARGS[@]}"
cmake "${OSIM_CMAKE_ARGS[@]}"
VERSION=`cmake -L . | grep OPENSIM_QUALIFIED_VERSION | cut -d "=" -f2`
echo $VERSION
echo "VERSION=$VERSION" >> $GITHUB_ENV
echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Build opensim-core
run: |
cd $GITHUB_WORKSPACE/../build
make --jobs 4
- name: Test opensim-core
run: |
cd $GITHUB_WORKSPACE/../build
# TODO: Temporary for python to find Simbody libraries.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/opensim_dependencies_install/simbody/lib
ctest --parallel 4 --output-on-failure
- name: Install opensim-core
run: |
cd $GITHUB_WORKSPACE/../build
make doxygen
make --jobs 4 install
cd $GITHUB_WORKSPACE
mv $GITHUB_WORKSPACE/../opensim-core-install opensim-core-${{ steps.configure.outputs.version }}
zip --symlinks --recurse-paths --quiet opensim-core-${{ steps.configure.outputs.version }}-ubuntu22.zip opensim-core-${{ steps.configure.outputs.version }}
mv opensim-core-${{ steps.configure.outputs.version }} $GITHUB_WORKSPACE/../opensim-core-install
- name: Test Python bindings
run: |
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/opensim_dependencies_install/simbody/lib
cd $GITHUB_WORKSPACE/../opensim-core-install/sdk/Python
# Run the python tests, verbosely.
python3 -m unittest discover --start-directory opensim/tests --verbose
- name: Upload opensim-core
uses: actions/upload-artifact@v4
with:
# The upload-artifact zipping does not preserve symlinks or executable
# bits. So we zip ourselves, even though this causes a double-zip.
name: opensim-core-${{ steps.configure.outputs.version }}-ubuntu22-linux
path: opensim-core-${{ steps.configure.outputs.version }}-ubuntu22.zip
ubuntu24:
name: Ubuntu 24.04
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- name: Install Python packages
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install Numpy
run: |
pip install pip --upgrade
pip install numpy==2.0
pip install build
pip install wheel
- name: Install packages
run: sudo apt-get update && sudo apt-get install --yes build-essential libtool autoconf pkg-config gfortran libopenblas-dev liblapack-dev freeglut3-dev libxi-dev libxmu-dev doxygen patchelf
- name: Cache SWIG
id: cache-swig
uses: actions/cache@v3
with:
path: ~/swig
key: ${{ runner.os }}-swig
- name: Install SWIG
# if: steps.cache-swig.outputs.cache-hit != 'true'
run: |
mkdir ~/swig-source && cd ~/swig-source
wget https://github.com/swig/swig/archive/refs/tags/v4.1.1.tar.gz
tar xzf v4.1.1.tar.gz && cd swig-4.1.1
sh autogen.sh && ./configure --prefix=$HOME/swig --disable-ccache
make && make -j4 install
- name: Cache dependencies
id: cache-dependencies
uses: actions/cache@v3
with:
path: ~/opensim_dependencies_install
key: ${{ runner.os }}-dependencies-${{ hashFiles('dependencies/*') }}
- name: Build dependencies
if: steps.cache-dependencies.outputs.cache-hit != 'true'
run: |
mkdir $GITHUB_WORKSPACE/../build_deps
cd $GITHUB_WORKSPACE/../build_deps
DEP_CMAKE_ARGS=($GITHUB_WORKSPACE/dependencies -LAH)
DEP_CMAKE_ARGS+=(-DCMAKE_INSTALL_PREFIX=~/opensim_dependencies_install)
DEP_CMAKE_ARGS+=(-DCMAKE_BUILD_TYPE=Release)
DEP_CMAKE_ARGS+=(-DSUPERBUILD_ezc3d=ON)
DEP_CMAKE_ARGS+=(-DOPENSIM_WITH_CASADI=ON)
DEP_CMAKE_ARGS+=(-DOPENSIM_DISABLE_LOG_FILE=ON)
printf '%s\n' "${DEP_CMAKE_ARGS[@]}"
cmake "${DEP_CMAKE_ARGS[@]}"
make --jobs 4
- name: Configure opensim-core
id: configure
run: |
mkdir $GITHUB_WORKSPACE/../build
cd $GITHUB_WORKSPACE/../build
OSIM_CMAKE_ARGS=($GITHUB_WORKSPACE -LAH)
OSIM_CMAKE_ARGS+=(-DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/../opensim-core-install)
OSIM_CMAKE_ARGS+=(-DCMAKE_BUILD_TYPE=Release)
OSIM_CMAKE_ARGS+=(-DOPENSIM_DEPENDENCIES_DIR=~/opensim_dependencies_install)
OSIM_CMAKE_ARGS+=(-DOPENSIM_C3D_PARSER=ezc3d)
OSIM_CMAKE_ARGS+=(-DBUILD_PYTHON_WRAPPING=on -DBUILD_JAVA_WRAPPING=on)
OSIM_CMAKE_ARGS+=(-DBUILD_PYPI=on)
OSIM_CMAKE_ARGS+=(-DOPENSIM_WITH_CASADI=ON)
OSIM_CMAKE_ARGS+=(-DSWIG_DIR=~/swig/share/swig)
OSIM_CMAKE_ARGS+=(-DSWIG_EXECUTABLE=~/swig/bin/swig)
OSIM_CMAKE_ARGS+=(-DOPENSIM_INSTALL_UNIX_FHS=ON)
OSIM_CMAKE_ARGS+=(-DOPENSIM_DOXYGEN_USE_MATHJAX=off)
# TODO: Update to simbody.github.io/latest
OSIM_CMAKE_ARGS+=(-DOPENSIM_SIMBODY_DOXYGEN_LOCATION="https://simbody.github.io/simtk.org/api_docs/simbody/latest/")
OSIM_CMAKE_ARGS+=(-DCMAKE_CXX_FLAGS="-Werror")
printf '%s\n' "${OSIM_CMAKE_ARGS[@]}"
cmake "${OSIM_CMAKE_ARGS[@]}"
VERSION=`cmake -L . | grep OPENSIM_QUALIFIED_VERSION | cut -d "=" -f2`
echo $VERSION
echo "VERSION=$VERSION" >> $GITHUB_ENV
echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Build opensim-core
run: |
cd $GITHUB_WORKSPACE/../build
make --jobs 4
- name: Test opensim-core
run: |
cd $GITHUB_WORKSPACE/../build
# TODO: Temporary for python to find Simbody libraries.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/opensim_dependencies_install/simbody/lib
ctest --parallel 4 --output-on-failure
- name: Install opensim-core
run: |
cd $GITHUB_WORKSPACE/../build
make doxygen
make --jobs 4 install
cd $GITHUB_WORKSPACE
mv $GITHUB_WORKSPACE/../opensim-core-install opensim-core-${{ steps.configure.outputs.version }}
zip --symlinks --recurse-paths --quiet opensim-core-${{ steps.configure.outputs.version }}-ubuntu22.zip opensim-core-${{ steps.configure.outputs.version }}
mv opensim-core-${{ steps.configure.outputs.version }} $GITHUB_WORKSPACE/../opensim-core-install
- name: Build wheel
run: |
cd $GITHUB_WORKSPACE/../opensim-core-install/lib/python3.10/site-packages
python3 -m build --wheel
- name: Upload linux wheel
uses: actions/upload-artifact@v4
with:
name: opensim-4.5.2-cp310-cp310-linux_x86_64.whl
path: /home/runner/work/opensim-core/opensim-core-install/lib/python3.10/site-packages/dist/opensim-4.5.2-cp310-cp310-linux_x86_64.whl
- name: Test Python bindings
run: |
pip install /home/runner/work/opensim-core/opensim-core-install/lib/python3.10/site-packages/dist/opensim-4.5.2-cp310-cp310-linux_x86_64.whl
# Run the python tests, verbosely
python3 -m unittest discover --start-directory /home/runner/work/opensim-core/opensim-core-install/lib/python3.10/site-packages/opensim/tests --verbose
- name: Upload opensim-core
uses: actions/upload-artifact@v4
with:
# The upload-artifact zipping does not preserve symlinks or executable
# bits. So we zip ourselves, even though this causes a double-zip.
name: opensim-core-${{ steps.configure.outputs.version }}-ubuntu24-linux
path: opensim-core-${{ steps.configure.outputs.version }}-ubuntu24.zip
build_gui:
name: Build GUI
runs-on: ubuntu-latest
env:
GH_TOKEN: ${{ github.token }}
if: ${{ contains(github.event.pull_request.title, '[build-gui]') || contains(github.event.pull_request.body, '[build-gui]') }}
steps:
- name: Dispatch opensim-gui workflow and get the run ID
uses: codex-/return-dispatch@v1
id: return_dispatch
with:
token: ${{ secrets.ACTION_SECRET }}
ref: refs/heads/main
repo: opensim-gui
owner: opensim-org
workflow: build-on-core-pr.yml
- name: Use the output run ID
run: echo ${{steps.return_dispatch.outputs.run_id}}
- name: Await opensim-gui workflow
uses: Codex-/[email protected]
with:
token: ${{ secrets.ACTION_SECRET }}
repo: opensim-gui
owner: opensim-org
run_id: ${{ steps.return_dispatch.outputs.run_id }}
run_timeout_seconds: 10000
style:
name: Style
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check for tabs
# Ensure that there are no tabs in source code.
# GREP returns 0 (true) if there are any matches, and
# we don't want any matches. If there are matches,
# print a helpful message, and make the test fail by using "false".
# The GREP command here checks for any tab characters in the the files
# that match the specified pattern. GREP does not pick up explicit tabs
# (e.g., literally a \t in a source file).
run: if grep --line-num --recursive --exclude-dir="*dependencies*" --exclude-dir="*snopt*" --include={CMakeLists.txt,*.cpp,*.c,*.h} -P "\t" . ; then echo "Tabs found in the lines shown above. See CONTRIBUTING.md about tabs."; false; fi