Skip to content

Add workflow using matrix. #21

Add workflow using matrix.

Add workflow using matrix. #21

Workflow file for this run

name: OCaml Binding CI (Ubuntu + macOS)
on:
push:
branches: [ "**" ]
pull_request:
branches: [ "**" ]
jobs:
build-test:
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
ocaml-version: ["5"]
fail-fast: false
runs-on: ${{ matrix.os }}
steps:
- name: Checkout code
uses: actions/checkout@v4
# Cache ccache (shared across runs)
- name: Cache ccache
uses: actions/cache@v4
with:
path: ~/.ccache
key: ${{ runner.os }}-ccache-${{ github.sha }}
restore-keys: |
${{ runner.os }}-ccache-
# Cache opam (compiler + packages)
- name: Cache opam
uses: actions/cache@v4
with:
path: ~/.opam
key: ${{ runner.os }}-opam-${{ matrix.ocaml-version }}-${{ github.sha }}
restore-keys: |
${{ runner.os }}-opam-${{ matrix.ocaml-version }}-
# Setup OCaml via action
- uses: ocaml/setup-ocaml@v3
with:
ocaml-compiler: ${{ matrix.ocaml-version }}
opam-disable-sandboxing: true
# Platform-specific dependencies
- name: Install system dependencies (Ubuntu)
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y \
bubblewrap m4 libgmp-dev pkg-config ninja-build ccache
- name: Install system dependencies (macOS)
if: matrix.os == 'macos-latest'
run: |
brew install gmp pkg-config ninja ccache
- name: Install required opam packages
run: opam install -y ocamlfind zarith
- name: πŸ” Debug ocamlfind + ocamlc.opt issue
run: |
set -e # fail on error
eval $(opam env)
echo "πŸ”Ž ocamlc: $(which ocamlc)"
echo "πŸ”Ž ocamlopt: $(which ocamlopt)"
echo "πŸ”Ž ocamlfind: $(which ocamlfind)"
echo "πŸ”Ž All ocamlfind on path:"
which -a ocamlfind
echo ""
echo "πŸ“„ Writing test.ml"
echo 'let () = print_endline "Hello from OCaml"' > test.ml
echo ""
echo "πŸ§ͺ ocamlc compile"
ocamlc test.ml -o test_bytecode
echo ""
echo "πŸ§ͺ ocamlopt compile"
ocamlopt test.ml -o test_native
echo ""
echo "πŸ§ͺ ocamlfind ocamlc compile"
ocamlfind ocamlc -package zarith -linkpkg test.ml -o test_bytecode_find
echo ""
echo "πŸ§ͺ ocamlfind ocamlopt compile"
ocamlfind ocamlopt -package zarith -linkpkg test.ml -o test_native_find
echo ""
echo "πŸ§ͺ FULLPATH ocamlfind ocamlc compile"
/home/runner/work/z3/z3/_opam/bin/ocamlfind ocamlc -package zarith -linkpkg test.ml -o test_bytecode_full
echo ""
echo "πŸ§ͺ FULLPATH ocamlfind ocamlopt compile"
/home/runner/work/z3/z3/_opam/bin/ocamlfind ocamlopt -package zarith -linkpkg test.ml -o test_native_full
echo ""
echo "βœ… All compiles passed."
- name: πŸ§ͺ Debug OPAM + GITHUB_PATH setup
run: |
echo "πŸ” PATH at this step:"
echo "$PATH" | tr ':' '\n'
echo ""
echo "πŸ“ Listing \$GITHUB_PATH file (if exists):"
if [ -f "$GITHUB_PATH" ]; then
cat "$GITHUB_PATH"
else
echo "❌ GITHUB_PATH file does not exist at $GITHUB_PATH"
fi
echo ""
echo "πŸ“¦ OPAM_SWITCH_PREFIX = $OPAM_SWITCH_PREFIX"
echo ""
echo "πŸ“‚ Listing contents of \$OPAM_SWITCH_PREFIX/bin:"
ls -al "$OPAM_SWITCH_PREFIX/bin" || echo "❌ Directory does not exist"
echo ""
echo "πŸ” Check if PATH includes _opam/bin:"
echo "$PATH" | grep "_opam/bin" || echo "❌ _opam/bin NOT in PATH"
echo ""
echo "βœ… Done."
# Configure
- name: Configure with CMake
env:
RUNNER_OS: ${{ runner.os }}
CC: ${{ matrix.os == 'macos-latest' && 'ccache clang' || 'ccache gcc' }}
CXX: ${{ matrix.os == 'macos-latest' && 'ccache clang++' || 'ccache g++' }}
run: |
mkdir -p build
cd build
eval $(opam env)
echo "CC: $CC"
echo "CXX: $CXX"
echo "OCAMLFIND: $(which ocamlfind)"
echo "OCAMLC: $(which ocamlc)"
echo "OCAMLOPT: $(which ocamlopt)"
echo "OCAML_VERSION: $(ocamlc -version)"
echo "OCAMLLIB: $OCAMLLIB"
env | grep OCAML
cmake .. \
-G Ninja \
-DZ3_BUILD_LIBZ3_SHARED=ON \
-DZ3_BUILD_OCAML_BINDINGS=ON \
-DZ3_BUILD_JAVA_BINDINGS=OFF \
-DZ3_BUILD_PYTHON_BINDINGS=OFF \
-DZ3_BUILD_CLI=OFF \
-DZ3_BUILD_TEST_EXECUTABLES=OFF \
-DCMAKE_VERBOSE_MAKEFILE=TRUE
- name: Build Z3 and OCaml bindings
run: |
ccache -z || true
eval $(opam env)
cd build
ninja build_z3_ocaml_bindings
ccache -s || true
- name: Compile ml_example.byte
run: |
eval $(opam env)
ocamlfind ocamlc -o ml_example.byte \
-package zarith \
-linkpkg \
-I build/src/api/ml \
-dllpath build/src/api/ml \
build/src/api/ml/z3ml.cma \
examples/ml/ml_example.ml
- name: Run ml_example.byte
run: |
eval $(opam env)
ocamlrun ./ml_example.byte
- name: Compile ml_example (native)
run: |
eval $(opam env)
ocamlfind ocamlopt -o ml_example \
-package zarith \
-linkpkg \
-I build/src/api/ml \
build/src/api/ml/z3ml.cmxa \
examples/ml/ml_example.ml
- name: Run ml_example (native)
run: ./ml_example