@@ -109,46 +109,90 @@ let header ?win10_revision ?arch ?maintainer ?img ?tag d =
109109 @@ maintainer
110110 @@ shell
111111
112+ type opam_hashes = {
113+ opam_2_0_hash : string ;
114+ opam_2_1_hash : string ;
115+ opam_master_hash : string ;
116+ }
117+
118+ type opam_branch = {
119+ branch : string ;
120+ hash : string ;
121+ enable_0install_solver : bool ;
122+ public_names : string list ;
123+ }
124+
125+ let create_opam_branches opam_hashes =
126+ let {
127+ opam_2_0_hash;
128+ opam_2_1_hash;
129+ opam_master_hash;
130+ } = opam_hashes in
131+ [
132+ {
133+ branch = " 2.0" ;
134+ hash = opam_2_0_hash;
135+ enable_0install_solver = false ;
136+ public_names = [" 2.0" ];
137+ };
138+ {
139+ branch = " 2.1" ;
140+ hash = opam_2_1_hash;
141+ enable_0install_solver = true ;
142+ public_names = [" 2.1" ];
143+ };
144+ {
145+ branch = " master" ;
146+ hash = opam_master_hash;
147+ enable_0install_solver = true ;
148+ public_names = [" 2.2" ; " dev" ]; (* TODO: Change when opam 2.2 is branched *)
149+ };
150+ ]
151+
112152(* Apk based Dockerfile *)
113- let apk_opam2 ?(labels =[] ) ?arch ~hash_opam_2_0 ~hash_opam_2_1 ~hash_opam_master distro () =
153+ let apk_opam2 ?(labels =[] ) ?arch ~opam_hashes distro () =
154+ let opam_branches = create_opam_branches opam_hashes in
114155 let img, tag = D. base_distro_tag ?arch distro in
115156 header ?arch distro @@ label ((" distro_style" , " apk" ) :: labels)
116157 @@ Linux.Apk. install " build-base bzip2 git tar curl ca-certificates openssl"
117158 @@ Linux.Git. init ()
118- @@ install_opam_from_source ~add_default_link: false ~ branch: " 2.0 " ~ hash: hash_opam_2_0 ()
119- @@ install_opam_from_source ~add_default_link: false ~enable_0install_solver: true ~branch: " 2.1 " ~hash: hash_opam_2_1 ()
120- @@ install_opam_from_source ~add_default_link: false ~enable_0install_solver: true ~branch: " master " ~hash: hash_opam_master ()
159+ @@ List. fold_left ( fun acc { branch; hash; enable_0install_solver; _} ->
160+ acc @@ install_opam_from_source ~add_default_link: false ~enable_0install_solver ~branch ~hash ()
161+ ) empty opam_branches
121162 @@ run " strip /usr/local/bin/opam*"
122163 @@ from ~tag img
123164 @@ Linux.Apk. add_repository ~tag: " edge" " https://dl-cdn.alpinelinux.org/alpine/edge/main"
124165 @@ Linux.Apk. add_repository ~tag: " edgecommunity" " https://dl-cdn.alpinelinux.org/alpine/edge/community"
125166 @@ Linux.Apk. add_repository ~tag: " testing" " https://dl-cdn.alpinelinux.org/alpine/edge/testing"
126- @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-2.0" ] ~dst: " /usr/bin/opam-2.0" ()
127- @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-2.1" ] ~dst: " /usr/bin/opam-2.1" ()
128- @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-master" ] ~dst: " /usr/bin/opam-2.2" () (* TODO: Change when opam 2.2 is branched *)
129- @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-master" ] ~dst: " /usr/bin/opam-dev" ()
167+ @@ List. fold_left (fun acc {branch; public_names; _} ->
168+ List. fold_left (fun acc public_name ->
169+ acc @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-" ^ branch] ~dst: (" /usr/bin/opam-" ^ public_name) ()
170+ ) acc public_names
171+ ) empty opam_branches
130172 @@ run " ln /usr/bin/opam-2.0 /usr/bin/opam"
131173 @@ Linux.Apk. dev_packages ()
132174 @@ Linux.Apk. add_user ~uid: 1000 ~gid: 1000 ~sudo: true " opam"
133175 @@ install_bubblewrap_wrappers @@ Linux.Git. init ()
134176
135177
136178(* Debian based Dockerfile *)
137- let apt_opam2 ?(labels =[] ) ?arch distro ~hash_opam_2_0 ~hash_opam_2_1 ~hash_opam_master () =
179+ let apt_opam2 ?(labels =[] ) ?arch distro ~opam_hashes () =
180+ let opam_branches = create_opam_branches opam_hashes in
138181 let img, tag = D. base_distro_tag ?arch distro in
139182 header ?arch distro @@ label ((" distro_style" , " apt" ) :: labels)
140183 @@ Linux.Apt. install " build-essential curl git libcap-dev sudo"
141184 @@ Linux.Git. init ()
142185 @@ install_bubblewrap_from_source ()
143- @@ install_opam_from_source ~add_default_link: false ~ branch: " 2.0 " ~ hash: hash_opam_2_0 ()
144- @@ install_opam_from_source ~add_default_link: false ~enable_0install_solver: true ~branch: " 2.1 " ~hash: hash_opam_2_1 ()
145- @@ install_opam_from_source ~add_default_link: false ~enable_0install_solver: true ~branch: " master " ~hash: hash_opam_master ()
186+ @@ List. fold_left ( fun acc { branch; hash; enable_0install_solver; _} ->
187+ acc @@ install_opam_from_source ~add_default_link: false ~enable_0install_solver ~branch ~hash ()
188+ ) empty opam_branches
146189 @@ from ~tag img
147190 @@ copy ~from: " 0" ~src: [" /usr/local/bin/bwrap" ] ~dst: " /usr/bin/bwrap" ()
148- @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-2.0" ] ~dst: " /usr/bin/opam-2.0" ()
149- @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-2.1" ] ~dst: " /usr/bin/opam-2.1" ()
150- @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-master" ] ~dst: " /usr/bin/opam-2.2" () (* TODO: Change when opam 2.2 is branched *)
151- @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-master" ] ~dst: " /usr/bin/opam-dev" ()
191+ @@ List. fold_left (fun acc {branch; public_names; _} ->
192+ List. fold_left (fun acc public_name ->
193+ acc @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-" ^ branch] ~dst: (" /usr/bin/opam-" ^ public_name) ()
194+ ) acc public_names
195+ ) empty opam_branches
152196 @@ run " ln /usr/bin/opam-2.0 /usr/bin/opam"
153197 @@ run " ln -fs /usr/share/zoneinfo/Europe/London /etc/localtime"
154198 @@ Linux.Apt. dev_packages ()
@@ -164,7 +208,8 @@ let apt_opam2 ?(labels=[]) ?arch distro ~hash_opam_2_0 ~hash_opam_2_1 ~hash_opam
164208
165209 [enable_powertools] enables the PowerTools repository on CentOS 8 and above.
166210 This is needed to get most of *-devel packages frequently used by opam packages. *)
167- let yum_opam2 ?(labels = [] ) ?arch ~yum_workaround ~enable_powertools ~hash_opam_2_0 ~hash_opam_2_1 ~hash_opam_master distro () =
211+ let yum_opam2 ?(labels = [] ) ?arch ~yum_workaround ~enable_powertools ~opam_hashes distro () =
212+ let opam_branches = create_opam_branches opam_hashes in
168213 let img, tag = D. base_distro_tag ?arch distro in
169214 let workaround =
170215 if yum_workaround then
@@ -179,20 +224,21 @@ let yum_opam2 ?(labels= []) ?arch ~yum_workaround ~enable_powertools ~hash_opam_
179224 @@ Linux.RPM. dev_packages ~extra: " which tar curl xz libcap-devel openssl" ()
180225 @@ Linux.Git. init ()
181226 @@ install_bubblewrap_from_source ()
182- @@ install_opam_from_source ~prefix: " /usr " ~add_default_link: false ~ branch: " 2.0 " ~ hash: hash_opam_2_0 ()
183- @@ install_opam_from_source ~prefix: " /usr" ~add_default_link: false ~enable_0install_solver: true ~branch: " 2.1 " ~hash: hash_opam_2_1 ()
184- @@ install_opam_from_source ~prefix: " /usr " ~add_default_link: false ~enable_0install_solver: true ~branch: " master " ~hash: hash_opam_master ()
227+ @@ List. fold_left ( fun acc { branch; hash; enable_0install_solver; _} ->
228+ acc @@ install_opam_from_source ~prefix: " /usr" ~add_default_link: false ~enable_0install_solver ~branch ~hash ()
229+ ) empty opam_branches
185230 @@ from ~tag img
186231 @@ run " yum --version || dnf install -y yum"
187232 @@ workaround
188233 @@ Linux.RPM. update
189234 @@ Linux.RPM. dev_packages ()
190235 @@ (if enable_powertools then run " yum config-manager --set-enabled powertools" @@ Linux.RPM. update else empty)
191236 @@ copy ~from: " 0" ~src: [" /usr/local/bin/bwrap" ] ~dst: " /usr/bin/bwrap" ()
192- @@ copy ~from: " 0" ~src: [" /usr/bin/opam-2.0" ] ~dst: " /usr/bin/opam-2.0" ()
193- @@ copy ~from: " 0" ~src: [" /usr/bin/opam-2.1" ] ~dst: " /usr/bin/opam-2.1" ()
194- @@ copy ~from: " 0" ~src: [" /usr/bin/opam-master" ] ~dst: " /usr/bin/opam-2.2" () (* TODO: Change when opam 2.2 is branched *)
195- @@ copy ~from: " 0" ~src: [" /usr/bin/opam-master" ] ~dst: " /usr/bin/opam-dev" ()
237+ @@ List. fold_left (fun acc {branch; public_names; _} ->
238+ List. fold_left (fun acc public_name ->
239+ acc @@ copy ~from: " 0" ~src: [" /usr/bin/opam-" ^ branch] ~dst: (" /usr/bin/opam-" ^ public_name) ()
240+ ) acc public_names
241+ ) empty opam_branches
196242 @@ run " ln /usr/bin/opam-2.0 /usr/bin/opam"
197243 @@ run
198244 " sed -i.bak '/LC_TIME LC_ALL LANGUAGE/aDefaults env_keep += \" OPAMYES OPAMJOBS OPAMVERBOSE\" ' /etc/sudoers"
@@ -201,63 +247,69 @@ let yum_opam2 ?(labels= []) ?arch ~yum_workaround ~enable_powertools ~hash_opam_
201247
202248
203249(* Zypper based Dockerfile *)
204- let zypper_opam2 ?(labels =[] ) ?arch ~hash_opam_2_0 ~hash_opam_2_1 ~hash_opam_master distro () =
250+ let zypper_opam2 ?(labels =[] ) ?arch ~opam_hashes distro () =
251+ let opam_branches = create_opam_branches opam_hashes in
205252 let img, tag = D. base_distro_tag ?arch distro in
206253 header ?arch distro @@ label ((" distro_style" , " zypper" ) :: labels)
207254 @@ Linux.Zypper. dev_packages ()
208255 @@ Linux.Git. init ()
209256 @@ install_bubblewrap_from_source ()
210- @@ install_opam_from_source ~prefix: " /usr " ~add_default_link: false ~ branch: " 2.0 " ~ hash: hash_opam_2_0 ()
211- @@ install_opam_from_source ~prefix: " /usr" ~add_default_link: false ~enable_0install_solver: true ~branch: " 2.1 " ~hash: hash_opam_2_1 ()
212- @@ install_opam_from_source ~prefix: " /usr " ~add_default_link: false ~enable_0install_solver: true ~branch: " master " ~hash: hash_opam_master ()
257+ @@ List. fold_left ( fun acc { branch; hash; enable_0install_solver; _} ->
258+ acc @@ install_opam_from_source ~prefix: " /usr" ~add_default_link: false ~enable_0install_solver ~branch ~hash ()
259+ ) empty opam_branches
213260 @@ from ~tag img
214261 @@ Linux.Zypper. dev_packages ()
215262 @@ copy ~from: " 0" ~src: [" /usr/local/bin/bwrap" ] ~dst: " /usr/bin/bwrap" ()
216- @@ copy ~from: " 0" ~src: [" /usr/bin/opam-2.0" ] ~dst: " /usr/bin/opam-2.0" ()
217- @@ copy ~from: " 0" ~src: [" /usr/bin/opam-2.1" ] ~dst: " /usr/bin/opam-2.1" ()
218- @@ copy ~from: " 0" ~src: [" /usr/bin/opam-master" ] ~dst: " /usr/bin/opam-2.2" () (* TODO: Change when opam 2.2 is branched *)
219- @@ copy ~from: " 0" ~src: [" /usr/bin/opam-master" ] ~dst: " /usr/bin/opam-dev" ()
263+ @@ List. fold_left (fun acc {branch; public_names; _} ->
264+ List. fold_left (fun acc public_name ->
265+ acc @@ copy ~from: " 0" ~src: [" /usr/bin/opam-" ^ branch] ~dst: (" /usr/bin/opam-" ^ public_name) ()
266+ ) acc public_names
267+ ) empty opam_branches
220268 @@ run " ln /usr/bin/opam-2.0 /usr/bin/opam"
221269 @@ Linux.Zypper. add_user ~uid: 1000 ~sudo: true " opam"
222270 @@ install_bubblewrap_wrappers @@ Linux.Git. init ()
223271
224272(* Pacman based Dockerfile *)
225- let pacman_opam2 ?(labels =[] ) ?arch ~hash_opam_2_0 ~hash_opam_2_1 ~hash_opam_master distro () =
273+ let pacman_opam2 ?(labels =[] ) ?arch ~opam_hashes distro () =
274+ let opam_branches = create_opam_branches opam_hashes in
226275 let img, tag = D. base_distro_tag ?arch distro in
227276 header ?arch distro @@ label ((" distro_style" , " pacman" ) :: labels)
228277 @@ Linux.Pacman. dev_packages ()
229278 @@ Linux.Git. init ()
230- @@ install_opam_from_source ~add_default_link: false ~ branch: " 2.0 " ~ hash: hash_opam_2_0 ()
231- @@ install_opam_from_source ~add_default_link: false ~enable_0install_solver: true ~branch: " 2.1 " ~hash: hash_opam_2_1 ()
232- @@ install_opam_from_source ~add_default_link: false ~enable_0install_solver: true ~branch: " master " ~hash: hash_opam_master ()
279+ @@ List. fold_left ( fun acc { branch; hash; enable_0install_solver; _} ->
280+ acc @@ install_opam_from_source ~add_default_link: false ~enable_0install_solver ~branch ~hash ()
281+ ) empty opam_branches
233282 @@ run " strip /usr/local/bin/opam*"
234283 @@ from ~tag img
235- @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-2.0" ] ~dst: " /usr/bin/opam-2.0" ()
236- @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-2.1" ] ~dst: " /usr/bin/opam-2.1" ()
237- @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-master" ] ~dst: " /usr/bin/opam-2.2" () (* TODO: Change when opam 2.2 is branched *)
238- @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-master" ] ~dst: " /usr/bin/opam-dev" ()
284+ @@ List. fold_left (fun acc {branch; public_names; _} ->
285+ List. fold_left (fun acc public_name ->
286+ acc @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-" ^ branch] ~dst: (" /usr/bin/opam-" ^ public_name) ()
287+ ) acc public_names
288+ ) empty opam_branches
239289 @@ run " ln /usr/bin/opam-2.0 /usr/bin/opam"
240290 @@ Linux.Pacman. dev_packages ()
241291 @@ Linux.Pacman. add_user ~uid: 1000 ~sudo: true " opam"
242292 @@ install_bubblewrap_wrappers @@ Linux.Git. init ()
243293
244294(* Cygwin based Dockerfile *)
245- let cygwin_opam2 ?win10_revision ?(labels =[] ) ?arch ~hash_opam_2_0 ~hash_opam_2_1 ~hash_opam_master distro () =
295+ let cygwin_opam2 ?win10_revision ?(labels =[] ) ?arch ~opam_hashes distro () =
296+ let opam_branches = create_opam_branches opam_hashes in
246297 let img, tag = D. base_distro_tag ?arch distro in
247298 let cyg = Windows.Cygwin. { default with args = " --allow-test-packages" :: default.args } in
248299 header ?win10_revision ?arch distro @@ label ((" distro_style" , " cygwin" ) :: labels)
249300 @@ user " ContainerAdministrator"
250301 @@ Windows.Cygwin. (setup ~cyg ~extra: (cygwin_packages () ) () )
251302 @@ Windows.Cygwin.Git. init ()
252- @@ install_opam_from_source_cygwin ~add_default_link: false ~ branch: " 2.0 " ~ hash: hash_opam_2_0 ()
253- @@ install_opam_from_source_cygwin ~add_default_link: false ~enable_0install_solver: true ~branch: " 2.1 " ~hash: hash_opam_2_1 ()
254- @@ install_opam_from_source_cygwin ~add_default_link: false ~enable_0install_solver: true ~branch: " master " ~hash: hash_opam_master ()
303+ @@ List. fold_left ( fun acc { branch; hash; enable_0install_solver; _} ->
304+ acc @@ install_opam_from_source_cygwin ~add_default_link: false ~enable_0install_solver ~branch ~hash ()
305+ ) empty opam_branches
255306 @@ run " strip /usr/local/bin/opam*"
256307 @@ from ~tag img
257- @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-2.0" ] ~dst: " /usr/bin/opam-2.0" ()
258- @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-2.1" ] ~dst: " /usr/bin/opam-2.1" ()
259- @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-master" ] ~dst: " /usr/bin/opam-2.2" () (* TODO: Change when opam 2.2 is branched *)
260- @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-master" ] ~dst: " /usr/bin/opam-dev" ()
308+ @@ List. fold_left (fun acc {branch; public_names; _} ->
309+ List. fold_left (fun acc public_name ->
310+ acc @@ copy ~from: " 0" ~src: [" /usr/local/bin/opam-" ^ branch] ~dst: (" /usr/bin/opam-" ^ public_name) ()
311+ ) acc public_names
312+ ) empty opam_branches
261313 @@ run " ln /usr/bin/opam-2.0 /usr/bin/opam"
262314 @@ Windows.Cygwin. (setup ~cyg ~extra: (cygwin_packages () ) () )
263315 @@ Windows.Cygwin.Git. init ()
@@ -296,17 +348,17 @@ let windows_opam2 ?win10_revision ?winget ?(labels=[]) ?arch distro () =
296348 @@ Windows.Cygwin.Git. init ()
297349 @@ Windows. cleanup ()
298350
299- let gen_opam2_distro ?win10_revision ?winget ?(clone_opam_repo =true ) ?arch ?labels ~hash_opam_2_0 ~ hash_opam_2_1 ~ hash_opam_master d =
351+ let gen_opam2_distro ?win10_revision ?winget ?(clone_opam_repo =true ) ?arch ?labels ~opam_hashes d =
300352 let fn = match D. package_manager d with
301- | `Apk -> apk_opam2 ?labels ?arch ~hash_opam_2_0 ~hash_opam_2_1 ~hash_opam_master d ()
302- | `Apt -> apt_opam2 ?labels ?arch ~hash_opam_2_0 ~hash_opam_2_1 ~hash_opam_master d ()
353+ | `Apk -> apk_opam2 ?labels ?arch ~opam_hashes d ()
354+ | `Apt -> apt_opam2 ?labels ?arch ~opam_hashes d ()
303355 | `Yum ->
304356 let yum_workaround = match d with `CentOS `V7 -> true | _ -> false in
305357 let enable_powertools = match d with `CentOS (`V6 | `V7 ) -> false | `CentOS _ -> true | _ -> false in
306- yum_opam2 ?labels ?arch ~yum_workaround ~enable_powertools ~hash_opam_2_0 ~hash_opam_2_1 ~hash_opam_master d ()
307- | `Zypper -> zypper_opam2 ?labels ?arch ~hash_opam_2_0 ~hash_opam_2_1 ~hash_opam_master d ()
308- | `Pacman -> pacman_opam2 ?labels ?arch ~hash_opam_2_0 ~hash_opam_2_1 ~hash_opam_master d ()
309- | `Cygwin -> cygwin_opam2 ?win10_revision ?labels ?arch ~hash_opam_2_0 ~hash_opam_2_1 ~hash_opam_master d ()
358+ yum_opam2 ?labels ?arch ~yum_workaround ~enable_powertools ~opam_hashes d ()
359+ | `Zypper -> zypper_opam2 ?labels ?arch ~opam_hashes d ()
360+ | `Pacman -> pacman_opam2 ?labels ?arch ~opam_hashes d ()
361+ | `Cygwin -> cygwin_opam2 ?win10_revision ?labels ?arch ~opam_hashes d ()
310362 | `Windows -> windows_opam2 ?win10_revision ?winget ?labels ?arch d ()
311363 in
312364 let clone = if clone_opam_repo then
0 commit comments