add: voicevox_onnxruntimeをビルドできるようにする #231
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Build C++ Shared Library | |
on: | |
push: | |
workflow_dispatch: | |
inputs: | |
version: | |
description: "バージョン情報(A.BB.C / A.BB.C-preview.D)" | |
required: true | |
name: | |
description: "名前" | |
type: choice | |
default: onnxruntime | |
options: | |
- onnxruntime | |
- voicevox_onnxruntime | |
release: | |
description: "リリースするかどうか" | |
type: boolean | |
code_signing: | |
description: "コード署名する" | |
type: boolean | |
required: false | |
default: false | |
is_production: | |
description: "製品版をビルドする" | |
type: boolean | |
required: false | |
default: false | |
env: | |
ONNXRUNTIME_NAME: | |
|- | |
${{ inputs.name || 'onnxruntime' }} | |
ONNXRUNTIME_VERSION: | |
|- # workflow_dispatchでのバージョン名が入る。無指定なら適当なバージョン | |
${{ github.event.inputs.version || '1.17.3' }} | |
RELEASE: | |
|- # workflow_dispatchでのreleaseフラグがあればリリースする | |
${{ github.event.inputs.release == 'true' }} | |
defaults: | |
run: | |
shell: bash | |
jobs: | |
build-onnxruntime: | |
strategy: | |
fail-fast: false | |
matrix: | |
# TODO: 外せる`--compile_no_warning_as_error`は外す | |
include: | |
- artifact_name: ${{ inputs.name || 'onnxruntime' }}-win-x64 | |
os: windows-2022 | |
build_opts: |- | |
--compile_no_warning_as_error | |
--cmake_extra_defines | |
CMAKE_SYSTEM_NAME=Windows | |
CMAKE_SYSTEM_PROCESSOR=x86_64 | |
Rust_CARGO_TARGET=x86_64-pc-windows-msvc | |
result_dir: build/Release | |
release_config: Release | |
- artifact_name: ${{ inputs.name || 'onnxruntime' }}-win-x64-dml | |
os: windows-2022 | |
build_opts: |- | |
--compile_no_warning_as_error | |
--use_dml | |
--cmake_extra_defines | |
CMAKE_SYSTEM_NAME=Windows | |
CMAKE_SYSTEM_PROCESSOR=x86_64 | |
Rust_CARGO_TARGET=x86_64-pc-windows-msvc | |
result_dir: build/Release | |
release_config: Release | |
- artifact_name: ${{ inputs.name || 'onnxruntime' }}-win-x64-cuda | |
os: windows-2022 | |
cuda_version: 12.4.1 | |
# Windowsの場合デフォルトのパッケージ群では不十分であるため、必要そうなパッケージを指定する。ただしいくつかは不要かもしれない | |
cuda_sub_packages: '["cudart", "cuobjdump", "nvcc", "nvdisasm", "thrust", "cublas_dev", "cufft_dev", "curand_dev", "cusolver_dev", "cusparse_dev", "visual_studio_integration"]' | |
cudnn_url: https://developer.download.nvidia.com/compute/cudnn/redist/cudnn/windows-x86_64/cudnn-windows-x86_64-8.9.7.29_cuda12-archive.zip | |
build_opts: |- | |
--compile_no_warning_as_error | |
--use_cuda | |
--cuda_version 12.4 # WindowsではCUDAのディレクトリを見つけ出すのに必要(1.16.3時点) | |
--cmake_extra_defines | |
CMAKE_SYSTEM_NAME=Windows | |
CMAKE_SYSTEM_PROCESSOR=x86_64 | |
Rust_CARGO_TARGET=x86_64-pc-windows-msvc | |
result_dir: build/Release | |
release_config: Release | |
- artifact_name: ${{ inputs.name || 'onnxruntime' }}-win-x86 | |
os: windows-2022 | |
build_opts: |- | |
--compile_no_warning_as_error | |
--x86 | |
--cmake_extra_defines | |
CMAKE_SYSTEM_NAME=Windows | |
CMAKE_SYSTEM_PROCESSOR=x86 | |
Rust_CARGO_TARGET=i686-pc-windows-msvc | |
result_dir: build/Release | |
release_config: Release | |
- artifact_name: ${{ inputs.name || 'onnxruntime' }}-linux-x64 | |
os: ubuntu-20.04 | |
build_opts: |- | |
--compile_no_warning_as_error | |
--cmake_extra_defines | |
CMAKE_SYSTEM_NAME=Linux | |
CMAKE_SYSTEM_PROCESSOR=x86_64 | |
Rust_CARGO_TARGET=x86_64-unknown-linux-gnu | |
result_dir: build | |
release_config: Release | |
- artifact_name: ${{ inputs.name || 'onnxruntime' }}-linux-x64-cuda | |
os: ubuntu-20.04 | |
cuda_version: 12.4.1 | |
cuda_sub_packages: "[]" # デフォルト | |
cudnn_url: https://developer.download.nvidia.com/compute/cudnn/redist/cudnn/linux-x86_64/cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz | |
build_opts: |- | |
--compile_no_warning_as_error | |
--use_cuda | |
--cmake_extra_defines | |
CMAKE_SYSTEM_NAME=Linux | |
CMAKE_SYSTEM_PROCESSOR=x86_64 | |
Rust_CARGO_TARGET=x86_64-unknown-linux-gnu | |
result_dir: build | |
release_config: Release | |
- artifact_name: ${{ inputs.name || 'onnxruntime' }}-linux-armhf | |
os: ubuntu-20.04 | |
cc_version: "10" | |
cxx_version: "10" | |
linux_cross_arch: arm-linux-gnueabihf | |
symlink_workaround: true | |
build_opts: |- | |
--compile_no_warning_as_error | |
--arm | |
--cmake_extra_defines | |
CMAKE_SYSTEM_NAME=Linux | |
CMAKE_SYSTEM_PROCESSOR=armv7l | |
Rust_CARGO_TARGET=armv7-unknown-linux-gnueabihf | |
result_dir: build | |
release_config: Release | |
- artifact_name: ${{ inputs.name || 'onnxruntime' }}-linux-arm64 | |
os: ubuntu-20.04 | |
cc_version: "10" | |
cxx_version: "10" | |
linux_cross_arch: aarch64-linux-gnu | |
symlink_workaround: true | |
build_opts: |- | |
--compile_no_warning_as_error | |
--arm64 | |
--cmake_extra_defines | |
CMAKE_SYSTEM_NAME=Linux | |
CMAKE_SYSTEM_PROCESSOR=aarch64 | |
Rust_CARGO_TARGET=aarch64-unknown-linux-gnu | |
result_dir: build | |
release_config: Release | |
- artifact_name: ${{ inputs.name || 'onnxruntime' }}-osx-arm64 | |
os: macos-12 | |
build_opts: |- | |
--compile_no_warning_as_error | |
--cmake_extra_defines | |
CMAKE_SYSTEM_NAME=Darwin | |
CMAKE_OSX_ARCHITECTURES=arm64 | |
Rust_CARGO_TARGET=aarch64-apple-darwin | |
result_dir: build | |
release_config: Release | |
- artifact_name: ${{ inputs.name || 'onnxruntime' }}-osx-x86_64 | |
os: macos-12 | |
build_opts: |- | |
--compile_no_warning_as_error | |
--cmake_extra_defines | |
CMAKE_SYSTEM_NAME=Darwin | |
CMAKE_OSX_ARCHITECTURES=x86_64 | |
Rust_CARGO_TARGET=x86_64-apple-darwin | |
result_dir: build | |
release_config: Release | |
- artifact_name: ${{ inputs.name || 'onnxruntime' }}-android-x64 | |
os: ubuntu-20.04 | |
build_opts: |- | |
--compile_no_warning_as_error | |
--android | |
--android_abi x86_64 | |
--cmake_extra_defines | |
CMAKE_SYSTEM_NAME=Android | |
CMAKE_SYSTEM_PROCESSOR=x86_64 | |
Rust_CARGO_TARGET=x86_64-linux-android | |
result_dir: build | |
release_config: Release | |
- artifact_name: ${{ inputs.name || 'onnxruntime' }}-android-arm64 | |
os: ubuntu-20.04 | |
build_opts: |- | |
--compile_no_warning_as_error | |
--android | |
--android_abi arm64-v8a | |
--cmake_extra_defines | |
CMAKE_SYSTEM_NAME=Android | |
CMAKE_SYSTEM_PROCESSOR=aarch64 | |
Rust_CARGO_TARGET=aarch64-linux-android | |
result_dir: build | |
release_config: Release | |
- artifact_name: ${{ inputs.name || 'onnxruntime' }}-ios-arm64 | |
os: macos-12 | |
build_opts: |- | |
--compile_no_warning_as_error | |
--skip_tests | |
--use_xcode | |
--ios | |
--apple_sysroot iphoneos | |
--osx_arch arm64 | |
--apple_deploy_target 16.0 | |
--path_to_protoc_exe /usr/local/opt/protobuf@21/bin/protoc # Homebrewで入れた`protobuf@21` | |
--cmake_extra_defines | |
Rust_CARGO_TARGET=aarch64-apple-ios | |
result_dir: build/Release | |
release_config: Release-iphoneos | |
- artifact_name: ${{ inputs.name || 'onnxruntime' }}-ios-sim-arm64 | |
os: macos-12 | |
build_opts: |- | |
--compile_no_warning_as_error | |
--skip_tests | |
--use_xcode | |
--ios | |
--apple_sysroot iphonesimulator | |
--osx_arch arm64 | |
--apple_deploy_target 16.0 | |
--path_to_protoc_exe /usr/local/opt/protobuf@21/bin/protoc # Homebrewで入れた`protobuf@21` | |
--cmake_extra_defines | |
Rust_CARGO_TARGET=aarch64-apple-ios-sim | |
result_dir: build/Release | |
release_config: Release-iphonesimulator | |
- artifact_name: ${{ inputs.name || 'onnxruntime' }}-ios-sim-x86_64 | |
os: macos-12 | |
build_opts: |- | |
--compile_no_warning_as_error | |
--skip_tests | |
--use_xcode | |
--ios | |
--apple_sysroot iphonesimulator | |
--osx_arch x86_64 | |
--apple_deploy_target 16.0 | |
--path_to_protoc_exe /usr/local/opt/protobuf@21/bin/protoc # Homebrewで入れた`protobuf@21` | |
--cmake_extra_defines | |
Rust_CARGO_TARGET=x86_64-apple-ios | |
result_dir: build/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.linux_cross_arch != '' && matrix.linux_cross_arch) || '' }}${{ (matrix.linux_cross_arch != '' && '-') || '' }}" | |
ARCH_SUFFIX: "${{ (matrix.linux_cross_arch != '' && '-') || '' }}${{ (matrix.linux_cross_arch != '' && matrix.linux_cross_arch) || '' }}" | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: "3.10" | |
- name: Version check (semver) | |
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@v4 | |
if: env.ONNXRUNTIME_NAME == 'onnxruntime' | |
with: | |
repository: microsoft/onnxruntime | |
submodules: true | |
ref: v${{ env.ONNXRUNTIME_VERSION }} | |
- name: Checkout | |
uses: actions/checkout@v4 | |
if: env.ONNXRUNTIME_NAME == 'voicevox_onnxruntime' | |
with: | |
repository: microsoft/onnxruntime | |
submodules: true | |
ref: v${{ env.ONNXRUNTIME_VERSION }} | |
fetch-depth: 0 # 全履歴取得 | |
token: ${{ secrets.PRODUCTION_GITHUB_TOKEN }} | |
- name: Switch to production | |
if: env.ONNXRUNTIME_NAME == 'voicevox_onnxruntime' | |
run: | | |
( | |
git remote add private ${{ secrets.PRODUCTION_REPOSITORY_URL }} | |
git fetch private "refs/tags/v$ONNXRUNTIME_VERSION-voicevox" | |
git -c user.name=dummy -c [email protected] switch -d FETCH_HEAD | |
) > /dev/null 2>&1 | |
- name: Checkout builder | |
uses: actions/checkout@v4 | |
with: | |
path: builder | |
- name: Apply patch | |
run: | | |
git apply --ignore-whitespace --reject --whitespace=fix --verbose ./builder/1_17_3_android_arm64_build.patch | |
- name: Dump matrix context | |
env: | |
MATRIX_CONTEXT: ${{ toJSON(matrix) }} | |
run: echo "$MATRIX_CONTEXT" > matrix.json | |
- name: Cache build result | |
id: cache-build-result | |
uses: actions/cache@v3 | |
with: | |
path: build/ | |
key: ${{ matrix.artifact_name }}-v${{ env.ONNXRUNTIME_VERSION }}-cache-${{ hashFiles('matrix.json') }} | |
- name: Free Disk Space | |
uses: jlumbroso/free-disk-space@main | |
if: steps.cache-build-result.outputs.cache-hit != 'true' && runner.os == 'Linux' && contains(matrix.build_opts, '--use_cuda') | |
with: | |
tool-cache: false | |
large-packages: false | |
swap-storage: false | |
- name: Install tree | |
if: steps.cache-build-result.outputs.cache-hit != 'true' && runner.os == 'Windows' | |
uses: msys2/setup-msys2@v2 | |
with: | |
install: tree | |
- name: Install tree for debug | |
if: steps.cache-build-result.outputs.cache-hit != 'true' && runner.os == 'macOS' | |
run: brew install tree | |
- name: Install build dependencies on ubuntu | |
if: steps.cache-build-result.outputs.cache-hit != 'true' && startsWith(matrix.os, 'ubuntu') && matrix.linux_cross_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 }} | |
- name: Install build dependencies on macos | |
if: steps.cache-build-result.outputs.cache-hit != 'true' && startsWith(matrix.os, 'macos') | |
run: | | |
# Workaround for protoc https://github.com/microsoft/onnxruntime/issues/16238#issuecomment-1590398821 | |
brew install protobuf@21 | |
# ONNX Runtime v1.16.1 requires CMake 3.27 or higher. | |
- name: Install CMake | |
if: steps.cache-build-result.outputs.cache-hit != 'true' && startsWith(matrix.os, 'ubuntu') | |
env: | |
CMAKE_VERSION: 3.27.7 | |
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: Set up CUDA | |
if: steps.cache-build-result.outputs.cache-hit != 'true' && matrix.cuda_version && matrix.cudnn_url | |
uses: Jimver/[email protected] | |
with: | |
cuda: ${{ matrix.cuda_version }} | |
sub-packages: ${{ matrix.cuda_sub_packages }} | |
method: network | |
- name: Set `$CUDA_HOME` | |
if: steps.cache-build-result.outputs.cache-hit != 'true' && matrix.cuda_version && matrix.cudnn_url | |
run: echo "CUDA_HOME=$CUDA_PATH" >> "$GITHUB_ENV" | |
- name: Set up cuDNN | |
if: steps.cache-build-result.outputs.cache-hit != 'true' && matrix.cuda_version && matrix.cudnn_url | |
run: | | |
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.gz | |
tar xvf download/cudnn.tar.gz -C download/ | |
rm download/cudnn.tar.gz | |
fi | |
cudnn_path=$(find download -maxdepth 1 -name 'cudnn-*') | |
if [ ${{ runner.os }} = Windows ]; then | |
cudnn_path=$(cygpath -wa "$cudnn_path") | |
else | |
cudnn_path=$(realpath "$cudnn_path") | |
fi | |
echo "CUDNN_HOME=$cudnn_path" >> "$GITHUB_ENV" | |
- name: Extract Rust toolchain and target triple | |
id: rust-toolchain-and-target-triple | |
if: steps.cache-build-result.outputs.cache-hit != 'true' && env.ONNXRUNTIME_NAME == 'voicevox_onnxruntime' | |
run: | | |
echo "toolchain=$(cat ./rust-toolchain)" >> "$GITHUB_OUTPUT" | |
# shellcheck disable=SC2001 | |
echo "target=$(sed -E 's/.*Rust_CARGO_TARGET=([a-z0-9_-]+).*/\1/' <<< '${{ matrix.build_opts }}')" >> "$GITHUB_OUTPUT" | |
- name: Set up Rust | |
if: steps.cache-build-result.outputs.cache-hit != 'true' && env.ONNXRUNTIME_NAME == 'voicevox_onnxruntime' | |
uses: dtolnay/rust-toolchain@master | |
with: | |
toolchain: ${{ steps.rust-toolchain-and-target-triple.outputs.toolchain }} | |
targets: ${{ steps.rust-toolchain-and-target-triple.outputs.target }} | |
- name: Install cargo-binstall | |
if: steps.cache-build-result.outputs.cache-hit != 'true' && env.ONNXRUNTIME_NAME == 'voicevox_onnxruntime' | |
uses: taiki-e/install-action@cargo-binstall | |
- name: Install cxxbridge-cmd | |
if: steps.cache-build-result.outputs.cache-hit != 'true' && env.ONNXRUNTIME_NAME == 'voicevox_onnxruntime' | |
run: | | |
md=$(cargo metadata --manifest-path ./decrypt_vv_model/Cargo.toml --format-version 1) | |
version=$(jq -r '.packages[] | select(.name == "cxx").version' <<< "$md") | |
cargo binstall "cxxbridge-cmd@$version" --no-confirm --log-level debug | |
- name: Configure build environment for non-x86_64 Linux | |
if: steps.cache-build-result.outputs.cache-hit != 'true' && startsWith(matrix.os, 'ubuntu') && matrix.linux_cross_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.linux_cross_arch }}/lib -name '*.so*' -exec sudo ln -s {} /usr/lib/${{ matrix.linux_cross_arch }}/ ';' | |
sudo ln -s /usr/${{ matrix.linux_cross_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 to use latest Android NDK | |
if: steps.cache-build-result.outputs.cache-hit != 'true' && startsWith(matrix.os, 'ubuntu') && contains(matrix.build_opts, '--android') | |
run: | | |
# https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2004-Readme.md#environment-variables-2 | |
echo "ANDROID_NDK_HOME=$ANDROID_NDK_LATEST_HOME" >> "$GITHUB_ENV" | |
- name: Build ONNX Runtime | |
if: steps.cache-build-result.outputs.cache-hit != 'true' | |
run: | | |
# TODO: ↓ この記述は VOICEVOX/voicevox_core#41 時点でのarmhfビルドに対するもの。`CMAKE_SYSTEM_{NAME,PROCESSOR}`が必要のないケースが多いはず。例えばv1.17時点では、AndroidとiOSのビルドではcpuinfoのケアまでちゃんとされているはず。なので調べる。 | |
# 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. | |
build_opts=( | |
${{ matrix.build_opts }} | |
) | |
python ./tools/ci_build/build.py \ | |
--build_dir ./build \ | |
--config Release \ | |
--update \ | |
--build \ | |
--parallel \ | |
--build_shared_lib \ | |
"${build_opts[@]}" | |
- name: Inspect the build directory for debug | |
if: steps.cache-build-result.outputs.cache-hit != 'true' | |
run: | | |
if [ ${{ runner.os }} = Windows ]; then | |
tree() { | |
msys2.cmd -c "tree $1" | |
} | |
fi | |
tree build | |
- name: Organize artifact | |
run: | | |
# コピー先artifactを予め削除しておく | |
rm -rf ${{ matrix.result_dir }}/${{ matrix.artifact_name }} | |
rm -rf ./artifact | |
# Set library name | |
ARTIFACT_NAME=${{ matrix.artifact_name }} | |
if [[ "$ARTIFACT_NAME" == "$ONNXRUNTIME_NAME"-win-* ]]; then | |
# FIXME: この分岐はもう使わないのでは? | |
onnxruntime_filename="$ONNXRUNTIME_NAME.dll" | |
elif [[ "$ARTIFACT_NAME" == "$ONNXRUNTIME_NAME"-linux-* ]]; then | |
onnxruntime_filename="lib$ONNXRUNTIME_NAME.so.$ONNXRUNTIME_VERSION" | |
elif [[ "$ARTIFACT_NAME" == "$ONNXRUNTIME_NAME"-android-* ]]; then | |
onnxruntime_filename="lib$ONNXRUNTIME_NAME.so" | |
elif [[ "$ARTIFACT_NAME" == "$ONNXRUNTIME_NAME"-osx-* ]] || [[ "$ARTIFACT_NAME" == "$ONNXRUNTIME_NAME"-ios-* ]]; then | |
onnxruntime_filename="lib$ONNXRUNTIME_NAME.$ONNXRUNTIME_VERSION.dylib" | |
else | |
echo "Unknown target found : ${{ matrix.artifact_name }}" | |
return 1 | |
fi | |
if [ ${{ runner.os }} = Windows ]; then | |
# https://github.com/microsoft/onnxruntime/blob/v1.16.3/tools/ci_build/github/azure-pipelines/templates/c-api-artifacts-package-and-publish-steps-windows.yml#L34-L72 | |
# ただし、ortクレートには.pdbとinclude/は不要なので入れない。 | |
mkdir -p ./${{ matrix.result_dir }}/${{ matrix.artifact_name }}/lib | |
git rev-parse HEAD > ./${{ matrix.result_dir }}/${{ matrix.artifact_name }}/GIT_COMMIT_ID | |
cp ./{docs/Privacy.md,LICENSE,README.md,ThirdPartyNotices.txt,VERSION_NUMBER} \ | |
./${{ matrix.result_dir }}/${{ matrix.artifact_name }}/ | |
cp ./${{ matrix.result_dir }}/${{ matrix.release_config }}/"$ONNXRUNTIME_NAME".{dll,lib} \ | |
./${{ matrix.result_dir }}/${{ matrix.artifact_name }}/lib/ | |
if [ -f ./${{ matrix.result_dir }}/${{ matrix.release_config }}/"$ONNXRUNTIME_NAME".dll ]; then | |
cp ./${{ matrix.result_dir }}/${{ matrix.release_config }}//"$ONNXRUNTIME_NAME"{cuda,shared}.{dll,lib} \ | |
./${{ matrix.result_dir }}/${{ matrix.artifact_name }}/lib/ | |
fi | |
else | |
./tools/ci_build/github/linux/copy_strip_binary.sh \ | |
-r ${{ matrix.result_dir }} \ | |
-a ${{ matrix.artifact_name }} \ | |
-l "$onnxruntime_filename" \ | |
-c ${{ matrix.release_config }} \ | |
-s "$(pwd)" \ | |
-t "$(git rev-parse HEAD)" | |
fi | |
mv ${{ matrix.result_dir }}/${{ matrix.artifact_name }} ./artifact/ | |
- name: Code signing (Windows) | |
if: startsWith(matrix.os, 'windows') && inputs.code_signing | |
run: ./codesign.bash "artifact/${{ env.ASSET_NAME }}/voicevox_core.dll" | |
env: | |
ESIGNERCKA_USERNAME: ${{ secrets.ESIGNERCKA_USERNAME }} | |
ESIGNERCKA_PASSWORD: ${{ secrets.ESIGNERCKA_PASSWORD }} | |
ESIGNERCKA_TOTP_SECRET: ${{ secrets.ESIGNERCKA_TOTP_SECRET }} | |
- name: Upload artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ matrix.artifact_name }} | |
path: artifact/* | |
- name: Generate RELEASE_NAME | |
run: | | |
echo "RELEASE_NAME=${{ matrix.artifact_name }}-${{ env.ONNXRUNTIME_VERSION }}" >> "$GITHUB_ENV" | |
- name: Generate specifications | |
run: | | |
build_opts=( | |
${{ matrix.build_opts }} | |
) | |
for arg in "${build_opts[@]}"; do | |
case "$arg" in | |
CMAKE_SYSTEM_NAME=Windows) os=Windows ;; | |
CMAKE_SYSTEM_NAME=Linux) os=Linux ;; | |
CMAKE_SYSTEM_NAME=Darwin) os=macOS ;; | |
--android) os=Android ;; | |
--ios) os=iOS ;; | |
CMAKE_SYSTEM_PROCESSOR=x86_64 | CMAKE_OSX_ARCHITECTURES=x86_64 | x86_64) arch=x86_64 ;; | |
--x86) arch=x86 ;; | |
CMAKE_OSX_ARCHITECTURES=arm64 | --arm64 | arm64 | arm64-v8a) arch=AArch64 ;; | |
--arm) arch=ARMv7 ;; | |
--use_cuda) use_cuda=1 ;; | |
--use_dml) use_dml=1 ;; | |
esac | |
done | |
jq ' | |
{ | |
"os": $os, | |
"arch": $arch, | |
# ONNX Runtimeが示す順番に従う | |
"devices": [ | |
("CUDA" | select($use_cuda == "1")), | |
("DirectML" | select($use_dml == "1")), | |
"CPU" | |
] | join("/") | |
}' \ | |
-n \ | |
--arg os "$os" \ | |
--arg arch "$arch" \ | |
--arg use_cuda "$use_cuda" \ | |
--arg use_dml "$use_dml" \ | |
> "$RELEASE_NAME.json" | |
- name: Upload specifications | |
uses: actions/upload-artifact@v4 | |
with: | |
name: specs-${{ matrix.artifact_name }} | |
path: ${{ env.RELEASE_NAME }}.json | |
- 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_NAME }}-${{ env.ONNXRUNTIME_VERSION }} | |
file: ${{ env.RELEASE_NAME }}.tgz | |
build-xcframework: | |
needs: build-onnxruntime | |
runs-on: macos-12 | |
outputs: | |
release-name: ${{ steps.gen-envs.outputs.release-name }} | |
steps: | |
- name: Generate RELEASE_NAME and ONNXRUNTIME_BASENAME | |
id: gen-envs | |
run: | | |
RELEASE_NAME="$ONNXRUNTIME_NAME-ios-xcframework-$ONNXRUNTIME_VERSION" | |
echo "release-name=$RELEASE_NAME" >> "$GITHUB_OUTPUT" | |
echo "RELEASE_NAME=$RELEASE_NAME" >> "$GITHUB_ENV" | |
echo "ONNXRUNTIME_BASENAME=lib$ONNXRUNTIME_NAME.$ONNXRUNTIME_VERSION.dylib" >> "$GITHUB_ENV" | |
- uses: actions/checkout@v3 | |
- uses: actions/download-artifact@v4 | |
with: | |
name: ${{ env.ONNXRUNTIME_NAME }}-ios-arm64 | |
path: artifact/${{ env.ONNXRUNTIME_NAME }}-aarch64-apple-ios | |
- uses: actions/download-artifact@v4 | |
with: | |
name: ${{ env.ONNXRUNTIME_NAME }}-ios-sim-arm64 | |
path: artifact/${{ env.ONNXRUNTIME_NAME }}-aarch64-apple-ios-sim | |
- uses: actions/download-artifact@v4 | |
with: | |
name: ${{ env.ONNXRUNTIME_NAME }}-ios-sim-x86_64 | |
path: artifact/${{ env.ONNXRUNTIME_NAME }}-x86_64-apple-ios | |
- name: Remove no version notation dylib | |
run: | | |
rm -f artifact/"$ONNXRUNTIME_NAME"-x86_64-apple-ios/lib/*"$ONNXRUNTIME_NAME".dylib | |
rm -f artifact/"$ONNXRUNTIME_NAME"-aarch64-apple-ios-sim/lib/*"$ONNXRUNTIME_NAME".dylib | |
rm -f artifact/"$ONNXRUNTIME_NAME"-aarch64-apple-ios/lib/*"$ONNXRUNTIME_NAME".dylib | |
- name: '"onnxruntime" → "voicevox_onnxruntime"' | |
if: env.ONNXRUNTIME_NAME == 'voicevox_onnxruntime' | |
run: | | |
for arch in aarch64 sim; do | |
mv xcframework/Frameworks/$arch/{,voicevox_}onnxruntime.framework | |
done | |
find ./xcframework -type f -exec sed -i s/onnxruntime/voicevox_onnxruntime/ {} + | |
- name: Create aarch64 Framework | |
run: | | |
mkdir -p "Framework-aarch64" | |
cp -vr xcframework/Frameworks/aarch64/ Framework-aarch64/ | |
lipo -create "artifact/$ONNXRUNTIME_NAME-aarch64-apple-ios/lib/$ONNXRUNTIME_BASENAME" \ | |
-output "Framework-aarch64/$ONNXRUNTIME_NAME.framework/$ONNXRUNTIME_NAME" | |
- name: Change aarch64 @rpath | |
run: | | |
install_name_tool -id "@rpath/$ONNXRUNTIME_NAME.framework/$ONNXRUNTIME_NAME" \ | |
"Framework-aarch64/$ONNXRUNTIME_NAME.framework/$ONNXRUNTIME_NAME" | |
- name: Create fat binary | |
run: | | |
mkdir -p "artifact/$ONNXRUNTIME_NAME-sim" | |
lipo -create "artifact/$ONNXRUNTIME_NAME-x86_64-apple-ios/lib/$ONNXRUNTIME_BASENAME" \ | |
"artifact/$ONNXRUNTIME_NAME-aarch64-apple-ios-sim/lib/$ONNXRUNTIME_BASENAME" \ | |
-output "artifact/$ONNXRUNTIME_NAME-sim/$ONNXRUNTIME_NAME" | |
- name: Create sim Framework | |
run: | | |
mkdir -p "Framework-sim" | |
cp -vr xcframework/Frameworks/sim/ Framework-sim/ | |
cp -v "artifact/$ONNXRUNTIME_NAME-sim/$ONNXRUNTIME_NAME" \ | |
"Framework-sim/$ONNXRUNTIME_NAME.framework/$ONNXRUNTIME_NAME" | |
- name: Change sim @rpath | |
run: | | |
install_name_tool -id "@rpath/$ONNXRUNTIME_NAME.framework/$ONNXRUNTIME_NAME" \ | |
"Framework-sim/$ONNXRUNTIME_NAME.framework/$ONNXRUNTIME_NAME" | |
- name: Create XCFramework | |
run: | | |
mkdir -p "artifact/${{ env.ONNXRUNTIME_BASENAME }}" | |
xcodebuild -create-xcframework \ | |
-framework "Framework-sim/$ONNXRUNTIME_NAME.framework" \ | |
-framework "Framework-aarch64/$ONNXRUNTIME_NAME.framework" \ | |
-output "artifact/$ONNXRUNTIME_BASENAME/$ONNXRUNTIME_NAME.xcframework" | |
- name: Archive artifact | |
run: | | |
cd artifact/${{ env.ONNXRUNTIME_BASENAME }} | |
7z a "../../$RELEASE_NAME.zip" "$ONNXRUNTIME_NAME.xcframework" | |
- name: Upload to Release | |
if: env.RELEASE == 'true' | |
uses: svenstaro/upload-release-action@v2 | |
with: | |
repo_token: ${{ secrets.GITHUB_TOKEN }} | |
tag: ${{ env.ONNXRUNTIME_NAME }}-${{ env.ONNXRUNTIME_VERSION }} | |
file: ${{ env.RELEASE_NAME }}.zip | |
build-spec-table: | |
needs: [build-onnxruntime, build-xcframework] | |
runs-on: ubuntu-22.04 | |
steps: | |
- name: Download specifications | |
uses: actions/download-artifact@v4 | |
with: | |
path: specs | |
pattern: specs-* | |
merge-multiple: true | |
- name: Construct release notes | |
run: | | |
release_notes=$( | |
cat <<EOF | |
## 動的ライブラリ | |
<table data-voicevox-onnxruntime-specs-format-version="1" data-voicevox-onnxruntime-specs-type="dylibs"> | |
<thead> | |
<tr> | |
<th>OS</th> | |
<th>アーキテクチャ</th> | |
<th>デバイス</th> | |
<th>名前</th> | |
</tr> | |
</thead> | |
<tbody> | |
EOF | |
) | |
release_notes+=$'\n' | |
for specs_file in specs/*.json; do | |
specs=$(< "$specs_file") | |
release_name=$(basename "${specs_file%.json}") | |
release_notes+=$' <tr>\n' | |
release_notes+=" <td>$(jq .os -r <<< "$specs")</td>"$'\n' | |
release_notes+=" <td>$(jq .arch -r <<< "$specs")</td>"$'\n' | |
release_notes+=" <td>$(jq .devices -r <<< "$specs")</td>"$'\n' | |
release_notes+=" <td><a href=\"https://github.com/$GITHUB_REPOSITORY/releases/download/$ONNXRUNTIME_VERSION/$release_name.tgz\">$release_name.tgz</a></td>"$'\n' | |
release_notes+=$' </tr>\n' | |
done | |
release_notes+=$( | |
cat <<EOF | |
</tbody> | |
</table> | |
## XCFramework | |
<table data-voicevox-onnxruntime-specs-format-version="1" data-voicevox-onnxruntime-specs-type="xcframeworks"> | |
<thead> | |
<tr> | |
<th>OS</th> | |
<th>アーキテクチャ</th> | |
<th>デバイス</th> | |
<th>名前</th> | |
</tr> | |
</thead> | |
<tbody> | |
<tr> | |
<td>iOS</td> | |
<td>AArch64/x86_64</td> | |
<td>CPU</td> | |
<td><a href="https://github.com/$GITHUB_REPOSITORY/releases/download/$ONNXRUNTIME_VERSION/${{ needs.build-xcframework.outputs.release-name }}.zip">${{ needs.build-xcframework.outputs.release-name }}.zip</a></td> | |
</tr> | |
</tbody> | |
</table> | |
EOF | |
) | |
tee release-notes.md >&2 <<< "$release_notes" | |
- name: Update release notes | |
if: env.RELEASE == 'true' | |
uses: softprops/action-gh-release@v2 | |
with: | |
body_path: release-notes.md | |
prerelease: true | |
tag_name: ${{ env.ONNXRUNTIME_NAME }}-${{ env.ONNXRUNTIME_VERSION }} |