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
0 commit comments