@@ -101,6 +101,8 @@ module Line_writer : sig
101101
102102 val write : ?source : Line_reader .t -> t -> string -> unit
103103
104+ val write_lines : ?source : Line_reader .t -> t -> string -> unit
105+
104106 val lnum : t -> int
105107end = struct
106108 type t =
@@ -134,6 +136,16 @@ end = struct
134136 t.source < - source;
135137 t.lnum < - t.lnum + lnum_off
136138
139+ let write_lines ?source t lines =
140+ let l = String. split_on_char ~sep: '\n' lines in
141+ let rec w = function
142+ | [ " " ] | [] -> ()
143+ | s :: xs ->
144+ write ?source t s;
145+ w xs
146+ in
147+ w l
148+
137149 let lnum t = t.lnum
138150end
139151
@@ -231,7 +243,7 @@ end = struct
231243 build_info, units
232244end
233245
234- let link ~output ~linkall ~files ~resolve_sourcemap_url ~source_map =
246+ let link ~output ~linkall ~mklib ~ files ~resolve_sourcemap_url ~source_map =
235247 let t = Timer. make () in
236248 let oc = Line_writer. of_channel output in
237249 let warn_effects = ref false in
@@ -255,6 +267,7 @@ let link ~output ~linkall ~files ~resolve_sourcemap_url ~source_map =
255267 ~f: (fun (info : Unit_info.t ) (requires , to_link , all ) ->
256268 let all = StringSet. union all info.provides in
257269 if (not (Config.Flag. auto_link () ))
270+ || mklib
258271 || cmo_file
259272 || linkall
260273 || info.force_link
@@ -266,7 +279,7 @@ let link ~output ~linkall ~files ~resolve_sourcemap_url ~source_map =
266279 else requires, to_link, all))
267280 in
268281 let skip = StringSet. diff all to_link in
269- if not (StringSet. is_empty missing)
282+ if ( not (StringSet. is_empty missing)) && not mklib
270283 then
271284 failwith
272285 (Printf. sprintf
@@ -290,6 +303,8 @@ let link ~output ~linkall ~files ~resolve_sourcemap_url ~source_map =
290303 : int );
291304 sym_js := s :: ! sym_js)
292305 u.Unit_info. provides));
306+
307+ let build_info_emitted = ref false in
293308 List. iter files ~f: (fun (file , (build_info_for_file , units )) ->
294309 let sm_for_file = ref None in
295310 let ic = Line_reader. open_ file in
@@ -311,7 +326,14 @@ let link ~output ~linkall ~files ~resolve_sourcemap_url ~source_map =
311326 file
312327 line
313328 with
314- | Keep | Build_info _ -> copy ic oc
329+ | Keep -> copy ic oc
330+ | Build_info bi ->
331+ skip ic;
332+ if not ! build_info_emitted
333+ then (
334+ let bi = if mklib then Build_info. with_kind bi `Cma else bi in
335+ Line_writer. write_lines oc (Build_info. to_string bi);
336+ build_info_emitted := true )
315337 | Drop -> skip ic
316338 | Unit ->
317339 let u = Units. read ic Unit_info. empty in
@@ -327,7 +349,11 @@ let link ~output ~linkall ~files ~resolve_sourcemap_url ~source_map =
327349 then
328350 Format. eprintf
329351 " Copy %s@."
330- (String. concat ~sep: " ," (StringSet. elements u.provides)))
352+ (String. concat ~sep: " ," (StringSet. elements u.provides));
353+ if mklib
354+ then
355+ let u = if linkall then { u with force_link = true } else u in
356+ Line_writer. write_lines oc (Unit_info. to_string u))
331357 else (
332358 if debug ()
333359 then
@@ -345,7 +371,7 @@ let link ~output ~linkall ~files ~resolve_sourcemap_url ~source_map =
345371 skip ic
346372 done )
347373 | Source_map x ->
348- Line_reader. drop ic;
374+ skip ic;
349375 sm_for_file := Some x);
350376 read ()
351377 in
@@ -378,7 +404,7 @@ let link ~output ~linkall ~files ~resolve_sourcemap_url ~source_map =
378404 (Parse_bytecode.Debug. create ~include_cmis: false false )
379405 code;
380406 let content = Buffer. contents b in
381- String. split_on_char ~sep: '\n' content |> List. iter ~f: ( Line_writer. write oc) );
407+ Line_writer. write_lines oc content );
382408 (match ! sm_for_file with
383409 | None -> ()
384410 | Some x -> sm := (x, ! reloc) :: ! sm);
@@ -422,8 +448,8 @@ let link ~output ~linkall ~files ~resolve_sourcemap_url ~source_map =
422448 Line_writer. write oc s));
423449 if times () then Format. eprintf " sourcemap: %a@." Timer. print t
424450
425- let link ~output ~linkall ~files ~resolve_sourcemap_url ~source_map =
426- try link ~output ~linkall ~files ~resolve_sourcemap_url ~source_map
451+ let link ~output ~linkall ~mklib ~ files ~resolve_sourcemap_url ~source_map =
452+ try link ~output ~linkall ~mklib ~ files ~resolve_sourcemap_url ~source_map
427453 with Build_info. Incompatible_build_info { key; first = f1 , v1 ; second = f2 , v2 } ->
428454 let string_of_v = function
429455 | None -> " <empty>"
0 commit comments