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