Skip to content

Added windows cross compile builds & fixed build issues #462

Added windows cross compile builds & fixed build issues

Added windows cross compile builds & fixed build issues #462

Workflow file for this run

name: "Pre-Release"
on:
push:
branches: ["main-dev"]
pull_request:
branches: ["main-dev"]
env:
BUILD_TYPE: Release
GH_TOKEN: ${{ secrets.SEMANTIC_RELEASE_TOKEN }}
PYTHON_VERSION: 3.11
SWIFT_VERSION: 5.9
PYTHONUTF8: 1
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
jobs:
versioning:
name: Update Version
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
persist-credentials: false
- name: Run TinySemVer
uses: ashvardanian/tinysemver@v2.0.7
with:
verbose: "true"
version-file: "VERSION"
update-version-in: |
Cargo.toml:^version = "(\d+\.\d+\.\d+)"
package.json:"version": "(\d+\.\d+\.\d+)"
CMakeLists.txt:VERSION (\d+\.\d+\.\d+)
update-major-version-in: |
include/stringzilla/stringzilla.h:^#define STRINGZILLA_VERSION_MAJOR (\d+)
update-minor-version-in: |
include/stringzilla/stringzilla.h:^#define STRINGZILLA_VERSION_MINOR (\d+)
update-patch-version-in: |
include/stringzilla/stringzilla.h:^#define STRINGZILLA_VERSION_PATCH (\d+)
dry-run: "true"
test_ubuntu_gcc:
name: Ubuntu (GCC 12)
runs-on: ubuntu-22.04
env:
CC: gcc-12
CXX: g++-12
steps:
- uses: actions/checkout@v4
# C/C++
# If the compilation fails, we want to log the compilation commands in addition to
# the standard output.
- name: Install dependencies
run: |
sudo apt update
sudo apt install -y cmake build-essential libjemalloc-dev libomp-dev gcc-12 g++-12
- name: Build C/C++
run: |
cmake -B build_artifacts \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_EXPORT_COMPILE_COMMANDS=1 \
-DSTRINGZILLA_BUILD_BENCHMARK=1 \
-DSTRINGZILLA_BUILD_TEST=1
cmake --build build_artifacts --config RelWithDebInfo > build_artifacts/logs.txt 2>&1 || {
echo "Compilation failed. Here are the logs:"
cat build_artifacts/logs.txt
echo "The original compilation commands:"
cat build_artifacts/compile_commands.json
echo "CPU Features:"
lscpu
echo "GCC Version:"
gcc-12 --version
echo "G++ Version:"
g++-12 --version
exit 1
}
- name: Test C++
run: build_artifacts/stringzilla_test_cpp20
- name: Check stringzillite is built correctly
run: test -z "$(ldd build_artifacts/libstringzillite.so | grep '.so')"
- name: Test on Real World Data
run: |
build_artifacts/stringzilla_bench_search ${DATASET_PATH} # for substring search
build_artifacts/stringzilla_bench_token ${DATASET_PATH} # for hashing, equality comparisons, etc.
build_artifacts/stringzilla_bench_similarity ${DATASET_PATH} # for edit distances and alignment scores
build_artifacts/stringzilla_bench_sort ${DATASET_PATH} # for sorting arrays of strings
build_artifacts/stringzilla_bench_container ${DATASET_PATH} # for STL containers with string keys
env:
DATASET_PATH: ./README.md
# Don't overload GitHub with our benchmarks.
# The results in such an unstable environment will be meaningless anyway.
if: 0
# Python
- name: Set up Python ${{ env.PYTHON_VERSION }}
uses: actions/setup-python@v5.2.0
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: Build Python
run: |
python -m pip install --upgrade pip
pip install pytest pytest-repeat numpy pyarrow
python -m pip install .
- name: Test Python
run: pytest scripts/test.py -s -x
# JavaScript
# - name: Set up Node.js
# uses: actions/setup-node
# with:
# node-version: 18
# - name: Build and test JavaScript
# run: npm ci && npm test
# Rust
- name: Test Rust
uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true
test_ubuntu_clang:
name: Ubuntu (Clang 16)
runs-on: ubuntu-22.04
env:
CC: clang-16
CXX: clang++-16
steps:
- uses: actions/checkout@v4
# C/C++
# Clang 16 isn't available from default repos on Ubuntu 22.04, so we have to install it manually
- name: Install dependencies
run: |
sudo apt update
sudo apt install -y cmake build-essential libjemalloc-dev
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 16
- name: Build C/C++
run: |
cmake -B build_artifacts \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_EXPORT_COMPILE_COMMANDS=1 \
-DSTRINGZILLA_BUILD_BENCHMARK=1 \
-DSTRINGZILLA_BUILD_TEST=1
cmake --build build_artifacts --config RelWithDebInfo > build_artifacts/logs.txt 2>&1 || {
echo "Compilation failed. Here are the logs:"
cat build_artifacts/logs.txt
echo "The original compilation commands:"
cat build_artifacts/compile_commands.json
echo "CPU Features:"
lscpu
echo "Clang Version:"
clang-16 --version
echo "Clang++ Version:"
clang++-16 --version
exit 1
}
- name: Test C++
run: build_artifacts/stringzilla_test_cpp20
- name: Check stringzillite is built correctly
run: test -z "$(ldd build_artifacts/libstringzillite.so | grep '.so')"
- name: Test on Real World Data
run: |
build_artifacts/stringzilla_bench_search ${DATASET_PATH} # for substring search
build_artifacts/stringzilla_bench_token ${DATASET_PATH} # for hashing, equality comparisons, etc.
build_artifacts/stringzilla_bench_similarity ${DATASET_PATH} # for edit distances and alignment scores
build_artifacts/stringzilla_bench_sort ${DATASET_PATH} # for sorting arrays of strings
build_artifacts/stringzilla_bench_container ${DATASET_PATH} # for STL containers with string keys
env:
DATASET_PATH: ./README.md
# Don't overload GitHub with our benchmarks.
# The results in such an unstable environment will be meaningless anyway.
if: 0
# Python
- name: Set up Python ${{ env.PYTHON_VERSION }}
uses: actions/setup-python@v5.2.0
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: Build Python
run: |
python -m pip install --upgrade pip
pip install pytest pytest-repeat numpy pyarrow
python -m pip install .
- name: Test Python
run: pytest scripts/test.py -s -x
# Rust
- name: Test Rust
uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true
# Swift
# Fails due to: https://github.com/swift-actions/setup-swift/issues/591
# - name: Set up Swift ${{ env.SWIFT_VERSION }}
# uses: swift-actions/setup-swift@v1
# with:
# swift-version: ${{ env.SWIFT_VERSION }}
# - name: Build Swift
# run: swift build -c release --static-swift-stdlib
# - name: Test Swift
# run: swift test -c release --enable-test-discovery
# Temporary workaround to run Swift tests on Linux
# Based on: https://github.com/swift-actions/setup-swift/issues/591#issuecomment-1685710678
test_ubuntu_swift:
name: Swift on Linux
runs-on: ubuntu-22.04
container: swift:5.9
steps:
- uses: actions/checkout@v4
- name: Test Swift
run: swift test
test_ubuntu_cross_compilation:
name: Clang Cross Compilation
runs-on: ubuntu-22.04
env:
CC: clang-16
CXX: clang++-16
AR: llvm-ar
NM: llvm-nm
RANLIB: llvm-ranlib
strategy:
fail-fast: false
matrix:
include:
- arch: amd64
target: x86_64-linux-gnu
- arch: arm64
target: aarch64-linux-gnu
steps:
- uses: actions/checkout@v4
# C/C++
# We need to install the cross-compilation toolchain for ARM64 and ARMHF
# Clang 16 isn't available from default repos on Ubuntu 22.04, so we have to install it manually
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y make build-essential crossbuild-essential-arm64 crossbuild-essential-armhf libjemalloc-dev
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 16
- name: Build C/C++
run: |
cmake -B build_artifacts \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_EXPORT_COMPILE_COMMANDS=1 \
-DCMAKE_C_COMPILER_TARGET=${{ matrix.target }} \
-DCMAKE_CXX_COMPILER_TARGET=${{ matrix.target }} \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_PROCESSOR=${{ matrix.arch }} \
-DSTRINGZILLA_BUILD_SHARED=1 \
-DSTRINGZILLA_BUILD_BENCHMARK=1 \
-DSTRINGZILLA_BUILD_TEST=1
cmake --build build_artifacts --config RelWithDebInfo
# We can't run the produced builds, but we can make sure they exist
- name: Test artifacts presense
run: |
test -e build_artifacts/libstringzillite.so
test -e build_artifacts/libstringzilla_shared.so
test -e build_artifacts/stringzilla_test_cpp20
- name: Check stringzillite is built correctly
run: test -z "$(ldd build_artifacts/libstringzillite.so | grep '.so')"
test_macos:
name: MacOS
runs-on: macos-14
steps:
- uses: actions/checkout@v4
# C/C++
- name: Install dependencies
run: |
brew update
brew install cmake
- name: Build C/C++
run: |
cmake -B build_artifacts \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_EXPORT_COMPILE_COMMANDS=1 \
-DSTRINGZILLA_BUILD_BENCHMARK=1 \
-DSTRINGZILLA_BUILD_TEST=1
cmake --build build_artifacts --config RelWithDebInfo
- name: Test C++
run: build_artifacts/stringzilla_test_cpp17
- name: Check stringzillite is built correctly
run: test -z "$(ldd build_artifacts/libstringzillite.so | grep '.so')"
- name: Test on Real World Data
run: |
build_artifacts/stringzilla_bench_search ${DATASET_PATH} # for substring search
build_artifacts/stringzilla_bench_token ${DATASET_PATH} # for hashing, equality comparisons, etc.
build_artifacts/stringzilla_bench_similarity ${DATASET_PATH} # for edit distances and alignment scores
build_artifacts/stringzilla_bench_sort ${DATASET_PATH} # for sorting arrays of strings
build_artifacts/stringzilla_bench_container ${DATASET_PATH} # for STL containers with string keys
env:
DATASET_PATH: ./README.md
# Don't overload GitHub with our benchmarks.
# The results in such an unstable environment will be meaningless anyway.
if: 0
# Python
- name: Set up Python ${{ env.PYTHON_VERSION }}
uses: actions/setup-python@v5.2.0
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: Build Python
run: |
python -m pip install --upgrade pip
pip install pytest pytest-repeat numpy pyarrow
python -m pip install .
env:
MACOSX_DEPLOYMENT_TARGET: "11.0"
- name: Test Python
run: pytest scripts/test.py -s -x
# Swift
- name: Set up Swift ${{ env.SWIFT_VERSION }}
uses: swift-actions/setup-swift@v1
with:
swift-version: ${{ env.SWIFT_VERSION }}
- name: Build Swift
run: swift build
- name: Test Swift
run: swift test
# Rust
- name: Test Rust
uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true
test_windows:
name: Windows
runs-on: windows-2022
steps:
- uses: actions/checkout@v4
- uses: ilammy/msvc-dev-cmd@v1
- name: Build C/C++
shell: cmd
run: |
cmake -GNinja -B build_artifacts ^
-DCMAKE_BUILD_TYPE=RelWithDebInfo ^
-DCMAKE_EXPORT_COMPILE_COMMANDS=1 ^
-DSTRINGZILLA_BUILD_BENCHMARK=1 ^
-DSTRINGZILLA_BUILD_TEST=1
cmake --build build_artifacts --config RelWithDebInfo > build_artifacts/logs.txt 2>&1 || (
echo "Compilation failed. Here are the logs:"
type build_artifacts\logs.txt
echo "The original compilation commands:"
type build_artifacts\compile_commands.json
echo:
echo "CPU Features:"
wmic cpu list /format:list
exit 1
)
- name: Test C++
run: .\build_artifacts\stringzilla_test_cpp20.exe
- name: Check stringzillite is built correctly
shell: cmd
run: dumpbin /nologo /dependents stringzillite.dll | findstr /r "^[^a-z].*\.dll" && exit /b 1 || exit /b 0
- name: Test on Real World Data
run: |
.\build_artifacts\stringzilla_bench_search.exe ${DATASET_PATH} # for substring search
.\build_artifacts\stringzilla_bench_token.exe ${DATASET_PATH} # for hashing, equality comparisons, etc.
.\build_artifacts\stringzilla_bench_similarity.exe ${DATASET_PATH} # for edit distances and alignment scores
.\build_artifacts\stringzilla_bench_sort.exe ${DATASET_PATH} # for sorting arrays of strings
.\build_artifacts\stringzilla_bench_container.exe ${DATASET_PATH} # for STL containers with string keys
env:
DATASET_PATH: ./README.md
# Don't overload GitHub with our benchmarks.
# The results in such an unstable environment will be meaningless anyway.
if: 0
# Python
- name: Set up Python ${{ env.PYTHON_VERSION }}
uses: actions/setup-python@v5.2.0
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: Build Python
run: |
python -m pip install --upgrade pip
pip install pytest pytest-repeat numpy pyarrow
python -m pip install .
- name: Test Python
run: pytest scripts/test.py -s -x
test_windows_cross_compilation:
name: Windows Cross Compilation ${{ matrix.target }}
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
include:
- arch: x64
target: x64
- arch: x86
target: x86
- arch: amd64_arm64
target: arm64
steps:
- uses: actions/checkout@v4
- uses: ilammy/msvc-dev-cmd@v1
with:
arch: ${{ matrix.arch }}
- name: Build C/C++
shell: cmd
run: |
cmake -GNinja -B build_artifacts ^
-DCMAKE_BUILD_TYPE=RelWithDebInfo ^
-DCMAKE_EXPORT_COMPILE_COMMANDS=1 ^
-DSTRINGZILLA_BUILD_SHARED=1 ^
-DSTRINGZILLA_BUILD_BENCHMARK=1 ^
-DSTRINGZILLA_BUILD_TEST=1
cmake --build build_artifacts --config RelWithDebInfo
# We can't run the produced builds, but we can make sure they exist
- name: Test artifacts presense
shell: cmd
run: |
type build_artifacts\stringzillite.dll >NUL
type build_artifacts\stringzilla_shared.dll >NUL
type build_artifacts\stringzilla_test_cpp20.exe >NUL
- name: Check stringzillite is built correctly
shell: cmd
run: dumpbin /nologo /dependents stringzillite.dll | findstr /r "^[^a-z].*\.dll" && exit /b 1 || exit /b 0
test_alpine:
name: Alpine Linux
runs-on: ubuntu-24.04
container:
image: alpine:latest
options: --privileged # If needed for certain Docker operations
steps:
- uses: actions/checkout@v3
# C/C++
- name: Build C/C++
run: |
apk add --update make cmake g++ gcc
cmake -B build_artifacts \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_EXPORT_COMPILE_COMMANDS=1 \
-DSTRINGZILLA_BUILD_BENCHMARK=1 \
-DSTRINGZILLA_BUILD_TEST=1
cmake --build build_artifacts --config RelWithDebInfo
- name: Test C++
run: build_artifacts/stringzilla_test_cpp20
- name: Check stringzillite is built correctly
run: test -z "$(ldd build_artifacts/libstringzillite.so | grep '.so')"
# Python
- name: Build Python
run: |
apk add python3 py3-pip python3-dev
pip install --break-system-packages pytest pytest-repeat
pip install --break-system-packages .
- name: Test Python
run: pytest scripts/test.py -s -x
# Rust
- name: Test Rust
uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true
build_wheels:
name: Build Python ${{ matrix.python-version }} for ${{ matrix.os }}
runs-on: ${{ matrix.os }}
needs:
[
test_ubuntu_gcc,
test_ubuntu_clang,
test_macos,
test_windows,
test_alpine,
]
strategy:
matrix:
os: [ubuntu-24.04, macos-14, windows-2022]
python-version: ["36", "37", "38", "39", "310", "311", "312"]
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5.2.0
with:
python-version: 3.x
# We only need QEMU for Linux builds
- name: Setup QEMU
if: matrix.os == 'ubuntu-24.04'
uses: docker/setup-qemu-action@v3
- name: Install cibuildwheel
run: python -m pip install cibuildwheel
- name: Build wheels
run: cibuildwheel --output-dir wheelhouse
env:
CIBW_BUILD: cp${{ matrix.python-version }}-*