Skip to content

Commit b599979

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

File tree

3 files changed

+283
-54
lines changed

3 files changed

+283
-54
lines changed

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

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

+39-53
Original file line numberDiff line numberDiff line change
@@ -211,74 +211,60 @@ add_custom_command(
211211
###############################################################################
212212
# Example
213213
###############################################################################
214-
215214

216215
execute_process(
217216
COMMAND ${OCAMLFIND} query zarith
218217
OUTPUT_VARIABLE ocaml_pkg_zarith_path
219218
OUTPUT_STRIP_TRAILING_WHITESPACE)
220219

220+
add_custom_target(build_z3_ocaml_bindings
221+
ALL
222+
DEPENDS
223+
${z3ml_bin}/z3ml.cma
224+
${z3ml_bin}/z3ml.cmxa
225+
${z3ml_bin}/z3ml.cmxs
226+
${z3ml_bin}/dllz3ml.so
227+
${z3ml_bin}/libz3ml.a
228+
)
229+
230+
if(APPLE)
231+
add_custom_command(
232+
TARGET build_z3_ocaml_bindings POST_BUILD
233+
COMMAND install_name_tool -change libz3.dylib "@loader_path/libz3.dylib" "${z3ml_bin}/dllz3ml.so"
234+
)
235+
endif()
236+
237+
# test
221238

222239
set(z3ml_example_src ${PROJECT_SOURCE_DIR}/examples/ml/ml_example.ml)
223240

224241
add_custom_command(
225-
OUTPUT ${z3ml_bin}/ml_example${bc_ext}
226-
${z3ml_bin}/ml_example.bc.log
227-
COMMAND "${OCAMLFIND}" "ocamlc"
228-
"-o" "${z3ml_bin}/ml_example${bc_ext}"
229-
"-package" "zarith"
230-
"-I" "${z3ml_bin}"
231-
"-dllpath" "${z3ml_bin}"
232-
"-I" ${ocaml_stublibs_path}
233-
"-dllpath" ${ocaml_stublibs_path}
234-
"${ocaml_pkg_zarith_path}/zarith.cma"
242+
TARGET build_z3_ocaml_bindings POST_BUILD
243+
COMMAND "${OCAMLFIND}" ocamlc
244+
-o "${z3ml_bin}/ml_example.byte"
245+
-package zarith
246+
-linkpkg
247+
-I "${z3ml_bin}"
248+
-dllpath "${z3ml_bin}"
235249
"${z3ml_bin}/z3ml.cma"
236-
${z3ml_example_src}
237-
COMMAND
238-
"ocamlrun" "${z3ml_bin}/ml_example${bc_ext}"
239-
">" "${z3ml_bin}/ml_example.bc.log"
240-
DEPENDS
241-
${z3ml_bin}/z3ml.cma
242-
${z3ml_bin}/dllz3ml.so
243-
${z3ml_example_src}
244-
COMMENT "Testing build and run ml_example bytecode"
245-
VERBATIM)
250+
"${z3ml_example_src}"
251+
COMMAND ocamlrun "${z3ml_bin}/ml_example.byte" > "${z3ml_bin}/ml_example.bc.log"
252+
COMMENT "Run OCaml bytecode example"
253+
VERBATIM
254+
)
246255

247256
add_custom_command(
248-
OUTPUT ${z3ml_bin}/ml_example${exe_ext}
249-
${z3ml_bin}/ml_example.log
250-
COMMAND "${OCAMLFIND}" "ocamlopt"
251-
"-o" "${z3ml_bin}/ml_example${exe_ext}"
252-
"-package" "zarith"
253-
"-linkpkg"
254-
"-I" "${z3ml_bin}"
257+
TARGET build_z3_ocaml_bindings POST_BUILD
258+
COMMAND "${OCAMLFIND}" ocamlopt
259+
-o "${z3ml_bin}/ml_example"
260+
-package zarith
261+
-linkpkg
262+
-I "${z3ml_bin}"
255263
"${z3ml_bin}/z3ml.cmxa"
256264
"${z3ml_example_src}"
257-
COMMAND "${z3ml_bin}/ml_example${exe_ext}"
258-
">" "${z3ml_bin}/ml_example.log"
259-
DEPENDS
260-
${z3ml_bin}/z3ml.cmxa
261-
${z3ml_bin}/dllz3ml.so
262-
${z3ml_example_src}
263-
COMMENT "Testing build and run ml_example natively"
264-
VERBATIM)
265-
266-
add_custom_target(build_ocaml_example
267-
ALL
268-
DEPENDS
269-
${z3ml_bin}/ml_example${bc_ext}
270-
${z3ml_bin}/ml_example${exe_ext}
271-
)
272-
273-
add_custom_target(build_z3_ocaml_bindings
274-
ALL
275-
DEPENDS
276-
${z3ml_bin}/z3ml.cma
277-
${z3ml_bin}/z3ml.cmxa
278-
${z3ml_bin}/z3ml.cmxs
279-
${z3ml_bin}/dllz3ml.so
280-
${z3ml_bin}/libz3ml.a
281-
build_ocaml_example
265+
COMMAND "${z3ml_bin}/ml_example" > "${z3ml_bin}/ml_example.log"
266+
COMMENT "Run OCaml native example"
267+
VERBATIM
282268
)
283269

284270
###############################################################################

0 commit comments

Comments
 (0)