Skip to content

v0.2.9

v0.2.9 #179

name: linux-precompile-musl
on:
push:
tags:
- 'v*'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
alpine:
runs-on: ubuntu-latest
container: alpine:latest
env:
MIX_ENV: prod
OPENCV_VER: "4.10.0"
EVISION_PREFER_PRECOMPILED: "false"
EVISION_GENERATE_LANG: "erlang,elixir"
strategy:
matrix:
include:
- pair:
OTP_VERSION: "25.3"
NIF_VERSION: "2.16"
ELIXIR_VERSION: "1.16.1"
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install system dependencies
run: |
apk add cmake make python3 bash curl unzip gcc g++ ncurses-dev openssl-dev linux-headers perl git dpkg patch
- name: Compile and Install Erlang and Elixir
run: |
curl -fSL "https://github.com/erlang/otp/releases/download/OTP-${{ matrix.pair.OTP_VERSION }}/otp_src_${{ matrix.pair.OTP_VERSION }}.tar.gz" -o "otp_src_${{ matrix.pair.OTP_VERSION }}.tar.gz"
tar xzf "otp_src_${{ matrix.pair.OTP_VERSION }}.tar.gz"
cd "otp_src_${{ matrix.pair.OTP_VERSION }}"
./configure
make -j`nproc` install
git clone -b "v${{ matrix.pair.ELIXIR_VERSION }}" https://github.com/elixir-lang/elixir.git
cd elixir
make compile
make install
mix local.hex --force
mix local.rebar --force
- name: Cache mix packages
id: cache-mix-deps
uses: actions/cache@v4
with:
key: deps-${{ hashFiles('mix.lock') }}-${{ matrix.pair.OTP_VERSION }}-${{ matrix.pair.ELIXIR_VERSION }}
path: |
./deps
- name: Get mix deps
if: steps.cache-mix-deps.outputs.cache-hit != 'true'
run: |
mix deps.get
- name: Cache OpenCV Source Code
id: cache-opencv
uses: actions/cache@v4
with:
key: opencv-${{ env.OPENCV_VER }}
path: |
./3rd_party
- name: Download OpenCV Source Code
if: steps.cache-opencv.outputs.cache-hit != 'true'
run: |
bash scripts/download_opencv.sh ${OPENCV_VER} 3rd_party/cache 3rd_party/opencv/
- name: Cache compiled OpenCV
id: cache-mix-compile_opencv
uses: actions/cache@v4
with:
key: precompiled-opencv-${{ env.OPENCV_VER }}-${{ runner.os }}-x86_64-linux-musl-${{ hashFiles('cc_toolchain/**') }}-${{ hashFiles('Makefile') }}-${{ hashFiles('py_src/*.py') }}
path: |
./_build/${{ env.MIX_ENV }}/lib/evision
./c_src/headers.txt
./c_src/configuration.private.hpp
- name: Compile OpenCV (without contrib modules)
run: |
export EVISION_ENABLE_CONTRIB=false
rm -rf "./_build/${{ env.MIX_ENV }}/lib/evision"
mix compile_opencv
- name: Mix compile (without contrib modules)
run: |
export EVISION_ENABLE_CONTRIB=false
rm -f _build/${MIX_ENV}/lib/evision/priv/evision.so
rm -rf lib/generated && rm -rf src/generated
mkdir -p lib/generated && mkdir -p src/generated
mix compile
- name: Create precompiled library (without contrib modules)
run: |
export PKG_NAME=evision-nif_${{ matrix.pair.NIF_VERSION }}-x86_64-linux-musl-${GITHUB_REF##*/v}
mkdir -p "${PKG_NAME}"
export PRIV_DIR="$(pwd)/_build/${MIX_ENV}/lib/evision/priv"
mv "${PRIV_DIR}/include" /tmp/include
cp -a "${PRIV_DIR}" "${PKG_NAME}"
cp -a lib/generated "${PKG_NAME}/elixir_generated"
cp -a src/generated "${PKG_NAME}/erlang_generated"
tar -czf "${PKG_NAME}.tar.gz" "${PKG_NAME}"
rm -rf "${PKG_NAME}"
ls -lah "${PKG_NAME}.tar.gz"
mkdir -p artifacts
mv "${PKG_NAME}.tar.gz" artifacts
cd artifacts
sha256sum "${PKG_NAME}.tar.gz" | tee "${PKG_NAME}.tar.gz.sha256"
mv /tmp/include "${PRIV_DIR}/include"
- name: Mix compile (without contrib modules) for Gleam (experimental)
run: |
export EVISION_ENABLE_CONTRIB=false
export GLEAM_EVISION=true
rm -f _build/${MIX_ENV}/lib/evision/priv/evision.so
rm -rf lib/generated && rm -rf src/generated
mix compile
unset GLEAM_EVISION
- name: Create precompiled library (without contrib modules) for Gleam (experimental)
run: |
export PKG_NAME=gleam_evision-nif_${{ matrix.pair.NIF_VERSION }}-x86_64-linux-musl-${GITHUB_REF##*/v}
mkdir -p "${PKG_NAME}"
export PRIV_DIR="$(pwd)/_build/${MIX_ENV}/lib/evision/priv"
mv "${PRIV_DIR}/include" /tmp/include
cp -a "${PRIV_DIR}" "${PKG_NAME}"
cp -a gleam_src "${PKG_NAME}/gleam_generated"
cp -a src/evision_highgui.erl "${PKG_NAME}/gleam_generated/"
cp -a src/evision_internal_structurise.erl "${PKG_NAME}/gleam_generated/"
cp -a src/evision_windows_fix.erl "${PKG_NAME}/gleam_generated/"
tar -czf "${PKG_NAME}.tar.gz" "${PKG_NAME}"
rm -rf "${PKG_NAME}"
ls -lah "${PKG_NAME}.tar.gz"
mkdir -p artifacts
mv "${PKG_NAME}.tar.gz" artifacts
cd artifacts
sha256sum "${PKG_NAME}.tar.gz" | tee "${PKG_NAME}.tar.gz.sha256"
mv /tmp/include "${PRIV_DIR}/include"
- name: Compile OpenCV (with contrib modules)
run: |
export EVISION_ENABLE_CONTRIB=true
rm -rf "./_build/${{ env.MIX_ENV }}/lib/evision"
mix compile_opencv
- name: Mix compile (with contrib modules)
run: |
export EVISION_ENABLE_CONTRIB=true
rm -f _build/${MIX_ENV}/lib/evision/priv/evision.so
rm -rf lib/generated && rm -rf src/generated
mkdir -p lib/generated && mkdir -p src/generated
mix compile
- name: Create precompiled library (with contrib modules)
run: |
export PKG_NAME=evision-nif_${{ matrix.pair.NIF_VERSION }}-x86_64-linux-musl-contrib-${GITHUB_REF##*/v}
mkdir -p "${PKG_NAME}"
export PRIV_DIR="$(pwd)/_build/${MIX_ENV}/lib/evision/priv"
mv "${PRIV_DIR}/include" /tmp/include
cp -a "${PRIV_DIR}" "${PKG_NAME}"
cp -a lib/generated "${PKG_NAME}/elixir_generated"
cp -a src/generated "${PKG_NAME}/erlang_generated"
tar -czf "${PKG_NAME}.tar.gz" "${PKG_NAME}"
rm -rf "${PKG_NAME}"
ls -lah "${PKG_NAME}.tar.gz"
mkdir -p artifacts
mv "${PKG_NAME}.tar.gz" artifacts
cd artifacts
sha256sum "${PKG_NAME}.tar.gz" | tee "${PKG_NAME}.tar.gz.sha256"
mv /tmp/include "${PRIV_DIR}/include"
- name: Mix compile (with contrib modules) for Gleam (experimental)
run: |
export EVISION_ENABLE_CONTRIB=true
export GLEAM_EVISION=true
rm -f _build/${MIX_ENV}/lib/evision/priv/evision.so
rm -rf lib/generated && rm -rf src/generated
mix compile
- name: Create precompiled library (with contrib modules) for Gleam (experimental)
run: |
export PKG_NAME=gleam_evision-nif_${{ matrix.pair.NIF_VERSION }}-x86_64-linux-musl-contrib-${GITHUB_REF##*/v}
mkdir -p "${PKG_NAME}"
export PRIV_DIR="$(pwd)/_build/${MIX_ENV}/lib/evision/priv"
mv "${PRIV_DIR}/include" /tmp/include
cp -a "${PRIV_DIR}" "${PKG_NAME}"
cp -a gleam_src "${PKG_NAME}/gleam_generated"
cp -a src/evision_highgui.erl "${PKG_NAME}/gleam_generated/"
cp -a src/evision_internal_structurise.erl "${PKG_NAME}/gleam_generated/"
cp -a src/evision_windows_fix.erl "${PKG_NAME}/gleam_generated/"
tar -czf "${PKG_NAME}.tar.gz" "${PKG_NAME}"
rm -rf "${PKG_NAME}"
ls -lah "${PKG_NAME}.tar.gz"
mkdir -p artifacts
mv "${PKG_NAME}.tar.gz" artifacts
cd artifacts
sha256sum "${PKG_NAME}.tar.gz" | tee "${PKG_NAME}.tar.gz.sha256"
mv /tmp/include "${PRIV_DIR}/include"
- uses: softprops/action-gh-release@v2
with:
files: |
artifacts/*.tar.gz
artifacts/*.sha256
zig_build:
runs-on: ubuntu-20.04
env:
OPENCV_VER: "4.10.0"
MIX_ENV: prod
ZIG_VERSION: "0.8.0"
EVISION_PREFER_PRECOMPILED: "false"
EVISION_GENERATE_LANG: "erlang,elixir"
strategy:
fail-fast: false
matrix:
include:
- pair:
arch: aarch64-linux-musl
OTP_VERSION: "25.3"
NIF_VERSION: "2.16"
ELIXIR_VERSION: "1.16.1"
- pair:
arch: riscv64-linux-musl
OTP_VERSION: "25.3"
NIF_VERSION: "2.16"
ELIXIR_VERSION: "1.16.1"
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install OTP and Elixir
uses: erlef/setup-beam@v1
with:
otp-version: ${{ matrix.pair.OTP_VERSION }}
elixir-version: ${{ matrix.pair.ELIXIR_VERSION }}
- name: Install Zig
uses: goto-bus-stop/setup-zig@v2
with:
version: ${{ env.ZIG_VERSION }}
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y build-essential automake autoconf pkg-config bc m4 unzip zip curl git libssl-dev gzip libncurses5-dev python3 ca-certificates libeigen3-dev
- name: Cache mix packages
id: cache-mix-deps
uses: actions/cache@v4
with:
key: deps-${{ hashFiles('mix.lock') }}-${{ matrix.pair.OTP_VERSION }}-${{ matrix.pair.ELIXIR_VERSION }}
path: |
./deps
- name: Get mix deps
if: steps.cache-mix-deps.outputs.cache-hit != 'true'
run: |
mix deps.get
- name: Cache OpenCV source code
id: cache-opencv
uses: actions/cache@v4
with:
key: opencv-with-contrib-${{ env.OPENCV_VER }}
path: |
./3rd_party
- name: Download OpenCV source code
if: steps.cache-opencv.outputs.cache-hit != 'true'
run: |
bash scripts/download_opencv.sh ${OPENCV_VER} 3rd_party/cache 3rd_party/opencv/
bash scripts/download_opencv_contrib.sh ${OPENCV_VER} 3rd_party/cache 3rd_party/opencv/
- name: Cache compiled OpenCV
id: cache-mix-compile_opencv
uses: actions/cache@v4
with:
key: precompiled-opencv-${{ env.OPENCV_VER }}-${{ matrix.pair.arch }}-${{ hashFiles('cc_toolchain/*linux-musl.cmake') }}-${{ hashFiles('cc_toolchain/zig.toolchain.cmake') }}-${{ hashFiles('Makefile') }}-${{ hashFiles('py_src/*.py') }}
path: |
./_build/${{ env.MIX_ENV }}/lib/evision
./c_src/headers.txt
./c_src/configuration.private.hpp
- name: Compile OpenCV (without contrib modules)
run: |
export CMAKE_TOOLCHAIN_FILE="$(pwd)/cc_toolchain/${{ matrix.pair.arch }}.cmake"
echo "CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}"
export ZIG_TOOLCHAIN_PATH="$(which zig)"
export EVISION_ENABLE_CONTRIB=false
rm -rf "./_build/${{ env.MIX_ENV }}/lib/evision"
mix compile_opencv
- name: Mix compile (without contrib modules)
run: |
export CMAKE_TOOLCHAIN_FILE="$(pwd)/cc_toolchain/${{ matrix.pair.arch }}.cmake"
echo "CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}"
export ZIG_TOOLCHAIN_PATH="$(which zig)"
export EVISION_ENABLE_CONTRIB=false
rm -f _build/${MIX_ENV}/lib/evision/priv/evision.so
rm -rf lib/generated && rm -rf src/generated
mkdir -p lib/generated && mkdir -p src/generated
mix compile
- name: Create precompiled library (without contrib modules)
run: |
export PKG_NAME=evision-nif_${{ matrix.pair.NIF_VERSION }}-${{ matrix.pair.arch }}-${GITHUB_REF##*/v}
mkdir -p "${PKG_NAME}"
export PRIV_DIR="$(pwd)/_build/${MIX_ENV}/lib/evision/priv"
mv "${PRIV_DIR}/include" /tmp/include
cp -a "${PRIV_DIR}" "${PKG_NAME}"
cp -a lib/generated "${PKG_NAME}/elixir_generated"
cp -a src/generated "${PKG_NAME}/erlang_generated"
tar -czf "${PKG_NAME}.tar.gz" "${PKG_NAME}"
rm -rf "${PKG_NAME}"
ls -lah "${PKG_NAME}.tar.gz"
mkdir -p artifacts
mv "${PKG_NAME}.tar.gz" artifacts
cd artifacts
sha256sum "${PKG_NAME}.tar.gz" | tee "${PKG_NAME}.tar.gz.sha256"
mv /tmp/include "${PRIV_DIR}/include"
- name: Mix compile (without contrib modules) for Gleam (experimental)
run: |
export CMAKE_TOOLCHAIN_FILE="$(pwd)/cc_toolchain/${{ matrix.pair.arch }}.cmake"
echo "CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}"
export ZIG_TOOLCHAIN_PATH="$(which zig)"
export EVISION_ENABLE_CONTRIB=false
export GLEAM_EVISION=true
rm -f _build/${MIX_ENV}/lib/evision/priv/evision.so
rm -rf lib/generated && rm -rf src/generated
mix compile
unset GLEAM_EVISION
- name: Create precompiled library (without contrib modules) for Gleam (experimental)
run: |
export PKG_NAME=gleam_evision-nif_${{ matrix.pair.NIF_VERSION }}-${{ matrix.pair.arch }}-${GITHUB_REF##*/v}
mkdir -p "${PKG_NAME}"
export PRIV_DIR="$(pwd)/_build/${MIX_ENV}/lib/evision/priv"
mv "${PRIV_DIR}/include" /tmp/include
cp -a "${PRIV_DIR}" "${PKG_NAME}"
cp -a gleam_src "${PKG_NAME}/gleam_generated"
cp -a src/evision_highgui.erl "${PKG_NAME}/gleam_generated/"
cp -a src/evision_internal_structurise.erl "${PKG_NAME}/gleam_generated/"
cp -a src/evision_windows_fix.erl "${PKG_NAME}/gleam_generated/"
tar -czf "${PKG_NAME}.tar.gz" "${PKG_NAME}"
rm -rf "${PKG_NAME}"
ls -lah "${PKG_NAME}.tar.gz"
mkdir -p artifacts
mv "${PKG_NAME}.tar.gz" artifacts
cd artifacts
sha256sum "${PKG_NAME}.tar.gz" | tee "${PKG_NAME}.tar.gz.sha256"
mv /tmp/include "${PRIV_DIR}/include"
- name: Compile OpenCV (with contrib modules)
run: |
export CMAKE_TOOLCHAIN_FILE="$(pwd)/cc_toolchain/${{ matrix.pair.arch }}.cmake"
echo "CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}"
export ZIG_TOOLCHAIN_PATH="$(which zig)"
export EVISION_ENABLE_CONTRIB=true
rm -rf "./_build/${{ env.MIX_ENV }}/lib/evision"
mix compile_opencv
- name: Mix compile (with contrib modules)
run: |
export CMAKE_TOOLCHAIN_FILE="$(pwd)/cc_toolchain/${{ matrix.pair.arch }}.cmake"
echo "CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}"
export ZIG_TOOLCHAIN_PATH="$(which zig)"
export EVISION_ENABLE_CONTRIB=true
rm -f _build/${MIX_ENV}/lib/evision/priv/evision.so
rm -rf lib/generated && rm -rf src/generated
mkdir -p lib/generated && mkdir -p src/generated
mix compile
- name: Create precompiled library (with contrib modules)
run: |
export PKG_NAME=evision-nif_${{ matrix.pair.NIF_VERSION }}-${{ matrix.pair.arch }}-contrib-${GITHUB_REF##*/v}
mkdir -p "${PKG_NAME}"
export PRIV_DIR="$(pwd)/_build/${MIX_ENV}/lib/evision/priv"
mv "${PRIV_DIR}/include" /tmp/include
cp -a "${PRIV_DIR}" "${PKG_NAME}"
cp -a lib/generated "${PKG_NAME}/elixir_generated"
cp -a src/generated "${PKG_NAME}/erlang_generated"
tar -czf "${PKG_NAME}.tar.gz" "${PKG_NAME}"
rm -rf "${PKG_NAME}"
ls -lah "${PKG_NAME}.tar.gz"
mkdir -p artifacts
mv "${PKG_NAME}.tar.gz" artifacts
cd artifacts
sha256sum "${PKG_NAME}.tar.gz" | tee "${PKG_NAME}.tar.gz.sha256"
mv /tmp/include "${PRIV_DIR}/include"
- name: Mix compile (with contrib modules) for Gleam (experimental)
run: |
export CMAKE_TOOLCHAIN_FILE="$(pwd)/cc_toolchain/${{ matrix.pair.arch }}.cmake"
echo "CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}"
export ZIG_TOOLCHAIN_PATH="$(which zig)"
export EVISION_ENABLE_CONTRIB=true
export GLEAM_EVISION=true
rm -f _build/${MIX_ENV}/lib/evision/priv/evision.so
rm -rf lib/generated && rm -rf src/generated
mix compile
- name: Create precompiled library (with contrib modules) for Gleam (experimental)
run: |
export PKG_NAME=gleam_evision-nif_${{ matrix.pair.NIF_VERSION }}-${{ matrix.pair.arch }}-contrib-${GITHUB_REF##*/v}
mkdir -p "${PKG_NAME}"
export PRIV_DIR="$(pwd)/_build/${MIX_ENV}/lib/evision/priv"
mv "${PRIV_DIR}/include" /tmp/include
cp -a "${PRIV_DIR}" "${PKG_NAME}"
cp -a gleam_src "${PKG_NAME}/gleam_generated"
cp -a src/evision_highgui.erl "${PKG_NAME}/gleam_generated/"
cp -a src/evision_internal_structurise.erl "${PKG_NAME}/gleam_generated/"
cp -a src/evision_windows_fix.erl "${PKG_NAME}/gleam_generated/"
tar -czf "${PKG_NAME}.tar.gz" "${PKG_NAME}"
rm -rf "${PKG_NAME}"
ls -lah "${PKG_NAME}.tar.gz"
mkdir -p artifacts
mv "${PKG_NAME}.tar.gz" artifacts
cd artifacts
sha256sum "${PKG_NAME}.tar.gz" | tee "${PKG_NAME}.tar.gz.sha256"
mv /tmp/include "${PRIV_DIR}/include"
- uses: softprops/action-gh-release@v2
with:
files: |
artifacts/*.tar.gz
artifacts/*.sha256