Skip to content

Commit b31f27d

Browse files
committed
Add workflow using matrix.
1 parent a405046 commit b31f27d

File tree

3 files changed

+252
-2
lines changed

3 files changed

+252
-2
lines changed

Diff for: .github/workflows/ocaml-all.yaml

+244
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
name: OCaml Binding CI (Ubuntu + macOS)
2+
3+
on:
4+
push:
5+
branches: [ "**" ]
6+
pull_request:
7+
branches: [ "**" ]
8+
9+
jobs:
10+
no-matrix:
11+
name: No matrix job
12+
runs-on: ubuntu-latest
13+
steps:
14+
- uses: actions/checkout@v4
15+
16+
- name: Setup OCaml (no matrix)
17+
uses: ocaml/setup-ocaml@v3
18+
with:
19+
ocaml-compiler: 5.3.0
20+
opam-disable-sandboxing: true
21+
22+
- name: Debug PATH and ENV (no matrix)
23+
run: |
24+
echo "GITHUB_ENV:"
25+
cat $GITHUB_ENV || echo "❌ Not found"
26+
27+
echo ""
28+
echo "GITHUB_PATH:"
29+
cat $GITHUB_PATH || echo "❌ Not found"
30+
31+
echo "PATH:"
32+
echo "$PATH" | tr ':' '\n'
33+
echo ""
34+
echo "which ocamlc:"
35+
which ocamlc || echo "❌ Not found"
36+
echo ""
37+
echo "OPAM_SWITCH_PREFIX: $OPAM_SWITCH_PREFIX"
38+
shell: bash
39+
40+
build-test:
41+
strategy:
42+
matrix:
43+
# ubuntu-latest,
44+
os: [ macos-latest]
45+
ocaml-version: ["5"]
46+
fail-fast: false
47+
runs-on: ${{ matrix.os }}
48+
49+
steps:
50+
- name: Checkout code
51+
uses: actions/checkout@v4
52+
53+
# Cache ccache (shared across runs)
54+
- name: Cache ccache
55+
uses: actions/cache@v4
56+
with:
57+
path: ~/.ccache
58+
key: ${{ runner.os }}-ccache-${{ github.sha }}
59+
restore-keys: |
60+
${{ runner.os }}-ccache-
61+
62+
# Cache opam (compiler + packages)
63+
- name: Cache opam
64+
uses: actions/cache@v4
65+
with:
66+
path: ~/.opam
67+
key: ${{ runner.os }}-opam-${{ matrix.ocaml-version }}-${{ github.sha }}
68+
restore-keys: |
69+
${{ runner.os }}-opam-${{ matrix.ocaml-version }}-
70+
71+
# Setup OCaml via action
72+
- uses: ocaml/setup-ocaml@v3
73+
with:
74+
ocaml-compiler: ${{ matrix.ocaml-version }}
75+
opam-disable-sandboxing: true
76+
77+
- name: Debug after setup-ocaml
78+
run: |
79+
echo "GITHUB_ENV:"
80+
cat $GITHUB_ENV || echo "❌ Not found"
81+
82+
echo ""
83+
echo "GITHUB_PATH:"
84+
cat $GITHUB_PATH || echo "❌ Not found"
85+
86+
echo "PATH after setup:"
87+
echo "$PATH" | tr ':' '\n'
88+
89+
echo ""
90+
echo "which ocamlfind:"
91+
which ocamlfind || echo "❌ Not found"
92+
93+
echo ""
94+
echo "OPAM_SWITCH_PREFIX: $OPAM_SWITCH_PREFIX"
95+
96+
# Platform-specific dependencies
97+
- name: Install system dependencies (Ubuntu)
98+
if: matrix.os == 'ubuntu-latest'
99+
run: |
100+
sudo apt-get update
101+
sudo apt-get install -y \
102+
bubblewrap m4 libgmp-dev pkg-config ninja-build ccache
103+
104+
- name: Install system dependencies (macOS)
105+
if: matrix.os == 'macos-latest'
106+
run: |
107+
brew install gmp pkg-config ninja ccache
108+
109+
- name: Install required opam packages
110+
run: opam install -y ocamlfind zarith
111+
112+
- name: 🔍 Debug ocamlfind + ocamlc.opt issue
113+
run: |
114+
set -e # fail on error
115+
116+
eval $(opam env)
117+
118+
echo "🔎 ocamlc: $(which ocamlc)"
119+
echo "🔎 ocamlopt: $(which ocamlopt)"
120+
echo "🔎 ocamlfind: $(which ocamlfind)"
121+
echo "🔎 All ocamlfind on path:"
122+
which -a ocamlfind
123+
124+
echo ""
125+
echo "📄 Writing test.ml"
126+
echo 'let () = print_endline "Hello from OCaml"' > test.ml
127+
128+
echo ""
129+
echo "🧪 ocamlc compile"
130+
ocamlc test.ml -o test_bytecode
131+
132+
echo ""
133+
echo "🧪 ocamlopt compile"
134+
ocamlopt test.ml -o test_native
135+
136+
echo ""
137+
echo "🧪 ocamlfind ocamlc compile"
138+
ocamlfind ocamlc -package zarith -linkpkg test.ml -o test_bytecode_find
139+
140+
echo ""
141+
echo "🧪 ocamlfind ocamlopt compile"
142+
ocamlfind ocamlopt -package zarith -linkpkg test.ml -o test_native_find
143+
144+
# echo ""
145+
# echo "🧪 FULLPATH ocamlfind ocamlc compile"
146+
# /home/runner/work/z3/z3/_opam/bin/ocamlfind ocamlc -package zarith -linkpkg test.ml -o test_bytecode_full
147+
148+
# echo ""
149+
# echo "🧪 FULLPATH ocamlfind ocamlopt compile"
150+
# /home/runner/work/z3/z3/_opam/bin/ocamlfind ocamlopt -package zarith -linkpkg test.ml -o test_native_full
151+
152+
echo ""
153+
echo "✅ All compiles passed."
154+
155+
- name: 🧪 Debug OPAM + GITHUB_PATH setup
156+
run: |
157+
echo "🔍 PATH at this step:"
158+
echo "$PATH" | tr ':' '\n'
159+
160+
echo ""
161+
echo "📁 Listing \$GITHUB_PATH file (if exists):"
162+
if [ -f "$GITHUB_PATH" ]; then
163+
cat "$GITHUB_PATH"
164+
else
165+
echo "❌ GITHUB_PATH file does not exist at $GITHUB_PATH"
166+
fi
167+
168+
echo ""
169+
echo "📦 OPAM_SWITCH_PREFIX = $OPAM_SWITCH_PREFIX"
170+
echo ""
171+
echo "📂 Listing contents of \$OPAM_SWITCH_PREFIX/bin:"
172+
ls -al "$OPAM_SWITCH_PREFIX/bin" || echo "❌ Directory does not exist"
173+
174+
echo ""
175+
echo "🔍 Check if PATH includes _opam/bin:"
176+
echo "$PATH" | grep "_opam/bin" || echo "❌ _opam/bin NOT in PATH"
177+
178+
echo ""
179+
echo "✅ Done."
180+
181+
# Configure
182+
- name: Configure with CMake
183+
env:
184+
RUNNER_OS: ${{ runner.os }}
185+
CC: ${{ matrix.os == 'macos-latest' && 'ccache clang' || 'ccache gcc' }}
186+
CXX: ${{ matrix.os == 'macos-latest' && 'ccache clang++' || 'ccache g++' }}
187+
run: |
188+
mkdir -p build
189+
cd build
190+
eval $(opam env)
191+
echo "CC: $CC"
192+
echo "CXX: $CXX"
193+
echo "OCAMLFIND: $(which ocamlfind)"
194+
echo "OCAMLC: $(which ocamlc)"
195+
echo "OCAMLOPT: $(which ocamlopt)"
196+
echo "OCAML_VERSION: $(ocamlc -version)"
197+
echo "OCAMLLIB: $OCAMLLIB"
198+
env | grep OCAML
199+
cmake .. \
200+
-G Ninja \
201+
-DZ3_BUILD_LIBZ3_SHARED=ON \
202+
-DZ3_BUILD_OCAML_BINDINGS=ON \
203+
-DZ3_BUILD_JAVA_BINDINGS=OFF \
204+
-DZ3_BUILD_PYTHON_BINDINGS=OFF \
205+
-DZ3_BUILD_CLI=OFF \
206+
-DZ3_BUILD_TEST_EXECUTABLES=OFF \
207+
-DCMAKE_VERBOSE_MAKEFILE=TRUE
208+
209+
- name: Build Z3 and OCaml bindings
210+
run: |
211+
ccache -z || true
212+
eval $(opam env)
213+
cd build
214+
ninja build_z3_ocaml_bindings
215+
ccache -s || true
216+
217+
- name: Compile ml_example.byte
218+
run: |
219+
eval $(opam env)
220+
ocamlfind ocamlc -o ml_example.byte \
221+
-package zarith \
222+
-linkpkg \
223+
-I build/src/api/ml \
224+
-dllpath build/src/api/ml \
225+
build/src/api/ml/z3ml.cma \
226+
examples/ml/ml_example.ml
227+
228+
- name: Run ml_example.byte
229+
run: |
230+
eval $(opam env)
231+
ocamlrun ./ml_example.byte
232+
233+
- name: Compile ml_example (native)
234+
run: |
235+
eval $(opam env)
236+
ocamlfind ocamlopt -o ml_example \
237+
-package zarith \
238+
-linkpkg \
239+
-I build/src/api/ml \
240+
build/src/api/ml/z3ml.cmxa \
241+
examples/ml/ml_example.ml
242+
243+
- name: Run ml_example (native)
244+
run: ./ml_example

Diff for: .github/workflows/ocaml.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ jobs:
6363
ocamlc -version
6464
ccache -z # reset stats
6565
cd build
66-
ninja -j$(nproc) build_z3_ocaml_bindings
66+
ninja build_z3_ocaml_bindings
6767
ccache -s # show stats
6868
6969
- name: Compile ml_example.byte

Diff for: src/api/ml/CMakeLists.txt

+7-1
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,6 @@ add_custom_command(
211211
###############################################################################
212212
# Example
213213
###############################################################################
214-
215214

216215
execute_process(
217216
COMMAND ${OCAMLFIND} query zarith
@@ -281,6 +280,13 @@ add_custom_target(build_z3_ocaml_bindings
281280
build_ocaml_example
282281
)
283282

283+
if(APPLE)
284+
add_custom_command(
285+
TARGET build_z3_ocaml_bindings POST_BUILD
286+
COMMAND install_name_tool -change libz3.dylib "@loader_path/libz3.dylib" "${z3ml_bin}/dllz3ml.so"
287+
)
288+
endif()
289+
284290
###############################################################################
285291
# Install
286292
###############################################################################

0 commit comments

Comments
 (0)