Skip to content

Workflow file for this run

name: Build C++ Shared Library
on:
push:
branches:
# - main
release:
types:
- published
workflow_dispatch:
inputs:
version:
description: "バージョン情報(A.BB.C / A.BB.C-preview.D)"
required: true
release:
description: "リリースするかどうか"
type: boolean
env:
ONNXRUNTIME_VERSION:
|- # releaseタグ名か、workflow_dispatchでのバージョン名が入る。無指定なら適当なバージョン
${{ github.event.release.tag_name || github.event.inputs.version || '1.14.0' }}
RELEASE:
|- # releaseタグ名か、workflow_dispatchでのreleaseフラグがあればリリースする
${{ github.event.release.tag_name != '' || github.event.inputs.release == 'true' }}
jobs:
build-onnxruntime:
strategy:
fail-fast: false
matrix:
include:
- artifact_name: onnxruntime-win-x64
os: windows-2019
build_opts: --cmake_extra_defines CMAKE_SYSTEM_NAME=Windows CMAKE_SYSTEM_PROCESSOR=x86_64 --config Release --parallel --update --build --build_shared_lib
result_dir: build/Windows
release_config: Release
- artifact_name: onnxruntime-linux-x64
os: ubuntu-20.04
build_opts: --cmake_extra_defines CMAKE_SYSTEM_NAME=Linux CMAKE_SYSTEM_PROCESSOR=x86_64 --config Release --parallel --update --build --build_shared_lib
result_dir: build/Linux
release_config: Release
- artifact_name: onnxruntime-linux-x64-gpu
os: ubuntu-20.04
cuda_version: 11.6.2
cudnn_url: https://developer.download.nvidia.com/compute/redist/cudnn/v8.4.1/local_installers/11.6/cudnn-linux-x86_64-8.4.1.50_cuda11.6-archive.tar.xz
build_opts: --cmake_extra_defines CMAKE_SYSTEM_NAME=Linux CMAKE_SYSTEM_PROCESSOR=x86_64 --config Release --parallel --update --build --build_shared_lib --use_cuda
result_dir: build/Linux
release_config: Release
- artifact_name: onnxruntime-osx-x86_64
os: macos-12
build_opts: --cmake_extra_defines CMAKE_SYSTEM_NAME=Darwin CMAKE_SYSTEM_PROCESSOR=x86_64 --config Release --parallel --update --build --build_shared_lib
result_dir: build/MacOS
release_config: Release
- artifact_name: onnxruntime-linux-armhf
os: ubuntu-20.04
cc_version: "8"
cxx_version: "8"
arch: arm-linux-gnueabihf
symlink_workaround: true
build_opts: --arm --cmake_extra_defines CMAKE_SYSTEM_NAME=Linux CMAKE_SYSTEM_PROCESSOR=armv7l --config Release --parallel --update --build --build_shared_lib
result_dir: build/Linux
release_config: Release
- artifact_name: onnxruntime-linux-arm64
os: ubuntu-20.04
cc_version: "8"
cxx_version: "8"
arch: aarch64-linux-gnu
symlink_workaround: true
build_opts: --arm64 --cmake_extra_defines CMAKE_SYSTEM_NAME=Linux CMAKE_SYSTEM_PROCESSOR=aarch64 --config Release --parallel --update --build --build_shared_lib
result_dir: build/Linux
release_config: Release
- artifact_name: onnxruntime-ios-arm64
os: macos-12
build_opts: --config Release --parallel --update --build --build_shared_lib --skip_tests --use_xcode --ios --ios_sysroot iphoneos --osx_arch arm64 --apple_deploy_target 16.0
result_dir: build/iOS/Release
release_config: Release-iphoneos
- artifact_name: onnxruntime-ios-sim-arm64
os: macos-12
build_opts: --config Release --parallel --update --build --build_shared_lib --skip_tests --use_xcode --ios --ios_sysroot iphonesimulator --osx_arch arm64 --apple_deploy_target 16.0
result_dir: build/iOS/Release
release_config: Release-iphonesimulator
- artifact_name: onnxruntime-ios-sim-x86_64
os: macos-12
build_opts: --config Release --parallel --update --build --build_shared_lib --skip_tests --use_xcode --ios --ios_sysroot iphonesimulator --osx_arch x86_64 --apple_deploy_target 16.0
result_dir: build/iOS/Release
release_config: Release-iphonesimulator
env:
# prefix usage: "", "arm-linux-gnueabihf-" => "gcc-8", "arm-linux-gnueabihf-gcc-8" (command name)
# suffix usage: "", "-arm-linux-gnueabihf" => "gcc-8", "gcc-8-arm-linux-gnueabihf" (package name)
ARCH_PREFIX: "${{ (matrix.arch != '' && matrix.arch) || '' }}${{ (matrix.arch != '' && '-') || '' }}"
ARCH_SUFFIX: "${{ (matrix.arch != '' && '-') || '' }}${{ (matrix.arch != '' && matrix.arch) || '' }}"
runs-on: ${{ matrix.os }}
steps:
- name: Version check (semver)
shell: bash
run: |
VERSION="${{ env.ONNXRUNTIME_VERSION }}"
if [[ $VERSION =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)(-([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?(\+([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?$ ]]; then
echo "Version: $VERSION"
else
echo "$VERSION is not a valid semver."
exit 1
fi
- name: Checkout
uses: actions/checkout@v2
with:
repository: microsoft/onnxruntime
submodules: recursive
ref: v${{ env.ONNXRUNTIME_VERSION }}
- name: Dump matrix context
env:
MATRIX_CONTEXT: ${{ toJSON(matrix) }}
run: |
echo "$MATRIX_CONTEXT" > matrix.json
cat matrix.json
- name: Install tree
if: runner.os == 'Windows'
uses: msys2/setup-msys2@v2
with:
install: tree
- name: Install tree
if: runner.os == 'macOS'
run: brew install tree
- name: Cache build result
id: cache-build-result
uses: actions/cache@v2
with:
path: build/
key: ${{ matrix.artifact_name }}-v${{ env.ONNXRUNTIME_VERSION }}-cache-v1-${{ hashFiles('matrix.json') }}
- name: Install build dependencies
if: steps.cache-build-result.outputs.cache-hit != 'true' && startsWith(matrix.os, 'ubuntu') && matrix.cuda_version && matrix.cudnn_url
run: |
sudo apt-get update
sudo apt-get install -y moreutils
python3 -m pip install -r tools/ci_build/github/linux/docker/inference/x64/python/cpu/scripts/requirements.txt
- name: Install build dependencies
if: steps.cache-build-result.outputs.cache-hit != 'true' && startsWith(matrix.os, 'ubuntu') && matrix.arch
run: |
sudo apt-get update
sudo apt-get install -y \
build-essential \
git \
wget \
qemu-user-binfmt \
gcc-${{ matrix.cc_version }}${{ env.ARCH_SUFFIX }} \
g++-${{ matrix.cxx_version }}${{ env.ARCH_SUFFIX }} \
python3
- name: Setup CUDA
if: steps.cache-build-result.outputs.cache-hit != 'true' && matrix.cuda_version
uses: Jimver/[email protected]
with:
method: network
cuda: ${{ matrix.cuda_version }}
- name: Set `$CUDA_HOME`
if: steps.cache-build-result.outputs.cache-hit != 'true' && matrix.cuda_version
shell: bash
run: echo "CUDA_HOME=$CUDA_PATH" >> "$GITHUB_ENV"
- name: Setup cuDNN
if: steps.cache-build-result.outputs.cache-hit != 'true' && matrix.cudnn_url
shell: bash
run: |
set -eux
mkdir download
if [ "$RUNNER_OS" = Windows ]; then
curl -L "${{ matrix.cudnn_url }}" > download/cudnn.zip
unzip download/cudnn.zip -d download
rm download/cudnn.zip
else
curl -L "${{ matrix.cudnn_url }}" > download/cudnn.tar.xz
tar -Jxf download/cudnn.tar.xz -C download/
rm download/cudnn.tar.xz
fi
cudnn_path=$(find download -maxdepth 1 -name 'cudnn-*')
cudnn_path=$(realpath "$cudnn_path")
if [ ${{ runner.os }} = Windows ]; then
tree() {
msys2.cmd -c "tree $1"
}
fi
tree "$cudnn_path"
echo "CUDNN_PATH=$cudnn_path" >> "$GITHUB_ENV"
echo "CUDNN_HOME=$cudnn_path" >> "$GITHUB_ENV"
echo "$cudnn_path/bin" >> "$GITHUB_PATH"
# ONNX Runtime v1.14.1 requires CMake 3.24 or higher.
- name: Install CMake
if: steps.cache-build-result.outputs.cache-hit != 'true' && startsWith(matrix.os, 'ubuntu')
env:
CMAKE_VERSION: 3.24.4
run: |
wget -O cmake.sh "https://github.com/Kitware/CMake/releases/download/v${{ env.CMAKE_VERSION }}/cmake-${{ env.CMAKE_VERSION }}-linux-x86_64.sh"
sudo bash cmake.sh --skip-license --prefix=/usr/local
- name: Configure build environment (Linux arm/aarch64)
if: steps.cache-build-result.outputs.cache-hit != 'true' && startsWith(matrix.os, 'ubuntu') && matrix.arch
run: |
# Required for arm build
# https://github.com/microsoft/onnxruntime/issues/4189#issuecomment-642528278
echo 'string(APPEND CMAKE_C_FLAGS " -latomic")' >> cmake/CMakeLists.txt
echo 'string(APPEND CMAKE_CXX_FLAGS " -latomic")' >> cmake/CMakeLists.txt
# Prevent Exec Format Error during cross-compiling
if ${{ matrix.symlink_workaround }}; then
find /usr/${{ matrix.arch }}/lib -name '*.so*' -exec sudo ln -s {} /usr/lib/${{ matrix.arch }}/ ';'
sudo ln -s /usr/${{ matrix.arch }}/lib/ld-linux-*.so* /usr/lib/
fi
# Set environment variable CC / CXX
echo "CC=${{ env.ARCH_PREFIX }}gcc-${{ matrix.cc_version }}" >> "$GITHUB_ENV"
echo "CXX=${{ env.ARCH_PREFIX }}g++-${{ matrix.cxx_version }}" >> "$GITHUB_ENV"
# ???
- name: Configure build environment (Linux CUDA)
if: steps.cache-build-result.outputs.cache-hit != 'true' && startsWith(matrix.os, 'ubuntu') && matrix.cuda_version
run: |
cat <(echo "include_directories($CUDNN_HOME/include)") cmake/CMakeLists.txt | sponge cmake/CMakeLists.txt
cat <(echo "link_directories($CUDNN_HOME/lib)") cmake/CMakeLists.txt | sponge cmake/CMakeLists.txt
git diff
- name: Build ONNX Runtime (Windows)
if: steps.cache-build-result.outputs.cache-hit != 'true' && runner.os == 'Windows'
shell: cmd
run: .\build.bat ${{ matrix.build_opts }}
- name: Build ONNX Runtime (non-Windows)
if: steps.cache-build-result.outputs.cache-hit != 'true' && runner.os != 'Windows'
shell: bash
run: |
# add --arm for gcc-8: https://github.com/microsoft/onnxruntime/issues/4189
# skip test: https://github.com/microsoft/onnxruntime/issues/2436
# ONNX Runtime v1.9.0 requires CMAKE_SYSTEM_PROCESSOR, https://github.com/microsoft/onnxruntime/releases/tag/v1.9.0
# Both CMAKE_SYSTEM_NAME and CMAKE_SYSTEM_PROCESSOR are required.
bash ./build.sh ${{ matrix.build_opts }}
- name: tree build
shell: bash
run: |
if [ ${{ runner.os }} = Windows ]; then
tree() {
msys2.cmd -c "tree $1"
}
fi
tree build
- name: Organize artifact
shell: bash
run: |
# コピー先artifactを予め削除しておく
rm -rf ${{ matrix.result_dir }}/${{ matrix.artifact_name }}
rm -rf ./artifact
ls -l ${{ matrix.result_dir }}/${{ matrix.release_config }}
mkdir -p ./artifact/${{ matrix.artifact_name }}/include
mkdir -p ./artifact/${{ matrix.artifact_name }}/lib
cp ./LICENSE ./artifact/${{ matrix.artifact_name }}/
cp ./ThirdPartyNotices.txt ./artifact/${{ matrix.artifact_name }}/
cp ./VERSION_NUMBER ./artifact/${{ matrix.artifact_name }}/
cp ./include/onnxruntime/core/session/onnxruntime_c_api.h ./artifact/${{ matrix.artifact_name }}/include/
# TODO
#mv include/onnxruntime/core/providers/dml/dml_provider_factory.h ./artifact/${{ matrix.artifact_name }}/include/
if [ ${{ runner.os }} = Windows ]; then
cp ${{ matrix.result_dir }}/onnxruntime.dir/${{ matrix.release_config }}/onnxruntime.dll.recipe ./artifact/${{ matrix.artifact_name }}/
elif ${{ contains(matrix.artifact_name, 'ios') }}; then
if ${{ contains(matrix.artifact_name, 'arm64') }}; then
arch=arm64
elif ${{ contains(matrix.artifact_name, 'x86_64') }}; then
arch=x86_64
fi
cp ${{ matrix.result_dir }}/build/onnxruntime.build/${{ matrix.release_config }}/Object-normal/"$arch"/onnxruntime.${{ env.ONNXRUNTIME_VERSION }}.LinkFileList ./artifact/${{ matrix.artifact_name }}/
cp ${{ matrix.result_dir }}/build/onnxruntime.build/${{ matrix.release_config }}/Object-normal/"$arch"/onnxruntime.${{ env.ONNXRUNTIME_VERSION }}_dependency_info.dat ./artifact/${{ matrix.artifact_name }}/
else
cp ${{ matrix.result_dir }}/${{ matrix.release_config }}/CMakeFiles/onnxruntime.dir/link.txt ./artifact/${{ matrix.artifact_name }}/
fi
if [ "$RUNNER_OS" = Windows ]; then
staticlib_ext=lib
else
staticlib_ext=a
fi
find ${{ matrix.result_dir }}/${{ matrix.release_config }} -name "*.$staticlib_ext" -exec cp {} ./artifact/${{ matrix.artifact_name }}/lib/ ';'
if ${{ !!matrix.cuda_version }}; then
cp -r ${{ matrix.result_dir }}/${{ matrix.release_config }}/CMakeFiles/onnxruntime_providers_shared.dir artifact/${{ matrix.artifact_name }}/
cp -r ${{ matrix.result_dir }}/${{ matrix.release_config }}/CMakeFiles/onnxruntime_providers_cuda.dir artifact/${{ matrix.artifact_name }}/
fi
if [ ${{ runner.os }} = Windows ]; then
tree() {
msys2 "tree $1"
}
fi
tree ./artifact/${{ matrix.artifact_name }}/
## Set library name
#if [[ ${{ matrix.artifact_name }} == onnxruntime-linux-* ]]; then
# ONNXRUNTIME_NAME=libonnxruntime.so.${{ env.ONNXRUNTIME_VERSION }}
#elif [[ ${{ matrix.artifact_name }} == onnxruntime-ios-* ]]; then
# ONNXRUNTIME_NAME=libonnxruntime.${{ env.ONNXRUNTIME_VERSION }}.dylib
#else
# echo "Unknown target found : ${{ matrix.artifact_name }}"
# return 1
#fi
#./tools/ci_build/github/linux/copy_strip_binary.sh \
# -r ${{ matrix.result_dir }} \
# -a ${{ matrix.artifact_name }} \
# -l $ONNXRUNTIME_NAME \
# -c ${{ matrix.release_config }} \
# -s "$(pwd)" \
# -t "$(git rev-parse HEAD)"
#mv ${{ matrix.result_dir }}/${{ matrix.artifact_name }} ./artifact/
- name: Upload artifact
uses: actions/upload-artifact@v2
with:
name: ${{ matrix.artifact_name }}
path: artifact/*
retention-days: 14
- name: Generate RELEASE_NAME
if: env.RELEASE == 'true'
run: |
echo "RELEASE_NAME=${{ matrix.artifact_name }}-${{ env.ONNXRUNTIME_VERSION }}" >> $GITHUB_ENV
- name: Rearchive artifact
if: env.RELEASE == 'true'
run: |
mv artifact/ "${{ env.RELEASE_NAME }}"
tar cfz "${{ env.RELEASE_NAME }}.tgz" "${{ env.RELEASE_NAME }}/"
- name: Upload to Release
if: env.RELEASE == 'true'
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
tag: ${{ env.ONNXRUNTIME_VERSION }} # ==> github.event.release.tag_name
file: ${{ env.RELEASE_NAME }}.tgz