Skip to content

Commit d025f0c

Browse files
committed
dockerfile-opam: Factorize the ~hash_opam_<branch> parameters
1 parent ba04597 commit d025f0c

File tree

2 files changed

+114
-58
lines changed

2 files changed

+114
-58
lines changed

src-opam/dockerfile_opam.ml

Lines changed: 107 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -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

src-opam/dockerfile_opam.mli

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,19 @@ val install_opam_from_source : ?add_default_link:bool ->
3939
If [enable_0install_solver] is true (false by default), then the [builtin-0install]
4040
solver should be accessible in the resulting opam binary. *)
4141

42+
type opam_hashes = {
43+
opam_2_0_hash : string;
44+
opam_2_1_hash : string;
45+
opam_master_hash : string;
46+
}
47+
4248
val gen_opam2_distro :
4349
?win10_revision:Dockerfile_distro.win10_lcu ->
4450
?winget:string ->
4551
?clone_opam_repo:bool ->
4652
?arch:Ocaml_version.arch ->
4753
?labels:(string * string) list ->
48-
hash_opam_2_0:string ->
49-
hash_opam_2_1:string ->
50-
hash_opam_master:string ->
54+
opam_hashes:opam_hashes ->
5155
Dockerfile_distro.t
5256
-> string * Dockerfile.t
5357
(** [gen_opam2_distro ~hash_opam_2_0 ~hash_opam_2_1 ~hash_opam_master d] will generate a Dockerfile

0 commit comments

Comments
 (0)