Skip to content

Commit 73ece8e

Browse files
committed
Link binary aliases instead of copying and factorize the code
1 parent d025f0c commit 73ece8e

File tree

1 file changed

+34
-58
lines changed

1 file changed

+34
-58
lines changed

src-opam/dockerfile_opam.ml

Lines changed: 34 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ type opam_branch = {
119119
branch : string;
120120
hash : string;
121121
enable_0install_solver : bool;
122-
public_names : string list;
122+
public_name : string;
123+
aliases : string list;
123124
}
124125

125126
let create_opam_branches opam_hashes =
@@ -133,43 +134,53 @@ let create_opam_branches opam_hashes =
133134
branch = "2.0";
134135
hash = opam_2_0_hash;
135136
enable_0install_solver = false;
136-
public_names = ["2.0"];
137+
public_name = "opam-2.0";
138+
aliases = ["opam"]; (* Default *)
137139
};
138140
{
139141
branch = "2.1";
140142
hash = opam_2_1_hash;
141143
enable_0install_solver = true;
142-
public_names = ["2.1"];
144+
public_name = "opam-2.1";
145+
aliases = [];
143146
};
144147
{
145148
branch = "master";
146149
hash = opam_master_hash;
147150
enable_0install_solver = true;
148-
public_names = ["2.2"; "dev"]; (* TODO: Change when opam 2.2 is branched *)
151+
public_name = "opam-2.2"; (* TODO: Change when opam 2.2 is branched *)
152+
aliases = ["opam-dev"];
149153
};
150154
]
151155

156+
let install_opams ?prefix f opam_branches =
157+
List.fold_left (fun acc {branch; hash; enable_0install_solver; _} ->
158+
let add_default_link = Some false in
159+
let enable_0install_solver = Some enable_0install_solver in
160+
acc @@ f ?add_default_link ?prefix ?enable_0install_solver ~branch ~hash ()
161+
) empty opam_branches
162+
163+
let copy_opams ~src ~dst opam_branches =
164+
List.fold_left (fun acc {branch; public_name; aliases; _} ->
165+
acc @@
166+
copy ~from:"0" ~src:[src^branch] ~dst:(dst^public_name) () @@@
167+
List.map (fun alias -> run "ln %s/%s %s/%s" dst public_name dst alias) aliases
168+
) empty opam_branches
169+
152170
(* Apk based Dockerfile *)
153171
let apk_opam2 ?(labels=[]) ?arch ~opam_hashes distro () =
154172
let opam_branches = create_opam_branches opam_hashes in
155173
let img, tag = D.base_distro_tag ?arch distro in
156174
header ?arch distro @@ label (("distro_style", "apk") :: labels)
157175
@@ Linux.Apk.install "build-base bzip2 git tar curl ca-certificates openssl"
158176
@@ Linux.Git.init ()
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
177+
@@ install_opams install_opam_from_source opam_branches
162178
@@ run "strip /usr/local/bin/opam*"
163179
@@ from ~tag img
164180
@@ Linux.Apk.add_repository ~tag:"edge" "https://dl-cdn.alpinelinux.org/alpine/edge/main"
165181
@@ Linux.Apk.add_repository ~tag:"edgecommunity" "https://dl-cdn.alpinelinux.org/alpine/edge/community"
166182
@@ Linux.Apk.add_repository ~tag:"testing" "https://dl-cdn.alpinelinux.org/alpine/edge/testing"
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
172-
@@ run "ln /usr/bin/opam-2.0 /usr/bin/opam"
183+
@@ copy_opams ~src:"/usr/local/bin" ~dst:"/usr/bin" opam_branches
173184
@@ Linux.Apk.dev_packages ()
174185
@@ Linux.Apk.add_user ~uid:1000 ~gid:1000 ~sudo:true "opam"
175186
@@ install_bubblewrap_wrappers @@ Linux.Git.init ()
@@ -183,17 +194,10 @@ let apt_opam2 ?(labels=[]) ?arch distro ~opam_hashes () =
183194
@@ Linux.Apt.install "build-essential curl git libcap-dev sudo"
184195
@@ Linux.Git.init ()
185196
@@ install_bubblewrap_from_source ()
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
197+
@@ install_opams install_opam_from_source opam_branches
189198
@@ from ~tag img
190199
@@ copy ~from:"0" ~src:["/usr/local/bin/bwrap"] ~dst:"/usr/bin/bwrap" ()
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
196-
@@ run "ln /usr/bin/opam-2.0 /usr/bin/opam"
200+
@@ copy_opams ~src:"/usr/local/bin" ~dst:"/usr/bin" opam_branches
197201
@@ run "ln -fs /usr/share/zoneinfo/Europe/London /etc/localtime"
198202
@@ Linux.Apt.dev_packages ()
199203
@@ run "echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections"
@@ -224,22 +228,15 @@ let yum_opam2 ?(labels= []) ?arch ~yum_workaround ~enable_powertools ~opam_hashe
224228
@@ Linux.RPM.dev_packages ~extra:"which tar curl xz libcap-devel openssl" ()
225229
@@ Linux.Git.init ()
226230
@@ install_bubblewrap_from_source ()
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
231+
@@ install_opams ~prefix:"/usr" install_opam_from_source opam_branches
230232
@@ from ~tag img
231233
@@ run "yum --version || dnf install -y yum"
232234
@@ workaround
233235
@@ Linux.RPM.update
234236
@@ Linux.RPM.dev_packages ()
235237
@@ (if enable_powertools then run "yum config-manager --set-enabled powertools" @@ Linux.RPM.update else empty)
236238
@@ copy ~from:"0" ~src:["/usr/local/bin/bwrap"] ~dst:"/usr/bin/bwrap" ()
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
242-
@@ run "ln /usr/bin/opam-2.0 /usr/bin/opam"
239+
@@ copy_opams ~src:"/usr/bin" ~dst:"/usr/bin" opam_branches
243240
@@ run
244241
"sed -i.bak '/LC_TIME LC_ALL LANGUAGE/aDefaults env_keep += \"OPAMYES OPAMJOBS OPAMVERBOSE\"' /etc/sudoers"
245242
@@ Linux.RPM.add_user ~uid:1000 ~sudo:true "opam"
@@ -254,18 +251,11 @@ let zypper_opam2 ?(labels=[]) ?arch ~opam_hashes distro () =
254251
@@ Linux.Zypper.dev_packages ()
255252
@@ Linux.Git.init ()
256253
@@ install_bubblewrap_from_source ()
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
254+
@@ install_opams ~prefix:"/usr" install_opam_from_source opam_branches
260255
@@ from ~tag img
261256
@@ Linux.Zypper.dev_packages ()
262257
@@ copy ~from:"0" ~src:["/usr/local/bin/bwrap"] ~dst:"/usr/bin/bwrap" ()
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
268-
@@ run "ln /usr/bin/opam-2.0 /usr/bin/opam"
258+
@@ copy_opams ~src:"/usr/bin" ~dst:"/usr/bin" opam_branches
269259
@@ Linux.Zypper.add_user ~uid:1000 ~sudo:true "opam"
270260
@@ install_bubblewrap_wrappers @@ Linux.Git.init ()
271261

@@ -276,17 +266,10 @@ let pacman_opam2 ?(labels=[]) ?arch ~opam_hashes distro () =
276266
header ?arch distro @@ label (("distro_style", "pacman") :: labels)
277267
@@ Linux.Pacman.dev_packages ()
278268
@@ Linux.Git.init ()
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
269+
@@ install_opams install_opam_from_source opam_branches
282270
@@ run "strip /usr/local/bin/opam*"
283271
@@ from ~tag img
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
289-
@@ run "ln /usr/bin/opam-2.0 /usr/bin/opam"
272+
@@ copy_opams ~src:"/usr/local/bin" ~dst:"/usr/bin" opam_branches
290273
@@ Linux.Pacman.dev_packages ()
291274
@@ Linux.Pacman.add_user ~uid:1000 ~sudo:true "opam"
292275
@@ install_bubblewrap_wrappers @@ Linux.Git.init ()
@@ -300,17 +283,10 @@ let cygwin_opam2 ?win10_revision ?(labels=[]) ?arch ~opam_hashes distro () =
300283
@@ user "ContainerAdministrator"
301284
@@ Windows.Cygwin.(setup ~cyg ~extra:(cygwin_packages ()) ())
302285
@@ Windows.Cygwin.Git.init ()
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
286+
@@ install_opams install_opam_from_source_cygwin opam_branches
306287
@@ run "strip /usr/local/bin/opam*"
307288
@@ from ~tag img
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
313-
@@ run "ln /usr/bin/opam-2.0 /usr/bin/opam"
289+
@@ copy_opams ~src:"/usr/local/bin" ~dst:"/usr/bin" opam_branches
314290
@@ Windows.Cygwin.(setup ~cyg ~extra:(cygwin_packages ()) ())
315291
@@ Windows.Cygwin.Git.init ()
316292

0 commit comments

Comments
 (0)