A fork of mtelver's day10 project

day10: remove post-container artifact generation, jtw handles it

The jtw opam command now generates .cmi copies, META copies, and
dynamic_cmis.json inside the container, so the post-container code
in linux.ml that duplicated this work is no longer needed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

+3 -39
+3 -39
bin/linux.ml
··· 652 652 let exit_status = Util.load_layer_info_exit_status layer_json in 653 653 if exit_status = 0 then Some layer_dir else None 654 654 655 - (** Run jtw generation in a container: compile .cma -> .cma.js, copy .cmi, META *) 655 + (** Run jtw generation in a container using jtw opam *) 656 656 let run_jtw_in_container ~t ~temp_dir ~build_log ~build_layer_dir ~jtw_layer_dir ~dep_build_hashes ~pkg ~installed_libs ~ocaml_version = 657 657 let config = t.config in 658 658 let os_key = Config.os_key ~config in ··· 663 663 let () = List.iter Os.mkdir [ lowerdir; upperdir; workdir; rootfsdir ] in 664 664 let uid_gid = Printf.sprintf "%d:%d" t.uid t.gid in 665 665 let () = ignore (Os.sudo [ "chown"; uid_gid; upperdir; workdir ]) in 666 - (* Build script to compile .cma files *) 666 + (* Build jtw opam script for per-package artifact generation *) 667 667 let script = Jtw_gen.jtw_container_script ~pkg ~installed_libs in 668 668 let argv = [ "/usr/bin/env"; "bash"; "-c"; script ] in 669 669 (* Build lower directory from build layer + dependency build layers + jtw-tools layer *) ··· 717 717 let jtw_layer_lib = Path.(jtw_layer_dir / "lib") in 718 718 Os.mkdir ~parents:true (Filename.dirname jtw_layer_lib); 719 719 ignore (Os.sudo [ "cp"; "-a"; jtw_output_lib; jtw_layer_lib ]); 720 - (* Fix ownership so subsequent writes (cmi, META, dynamic_cmis.json) work *) 720 + (* Fix ownership *) 721 721 let uid_gid = Printf.sprintf "%d:%d" (Unix.getuid ()) (Unix.getgid ()) in 722 722 ignore (Os.sudo [ "chown"; "-R"; uid_gid; jtw_layer_lib ]) 723 - end; 724 - (* Also copy .cmi and META from the build layer to the jtw layer *) 725 - let build_lib = Path.(build_layer_dir / "fs" / "home" / "opam" / ".opam" / "default" / "lib") in 726 - List.iter (fun rel_path -> 727 - if Filename.check_suffix rel_path ".cmi" || Filename.basename rel_path = "META" then begin 728 - let src = Path.(build_lib / rel_path) in 729 - let dst = Path.(jtw_layer_dir / "lib" / rel_path) in 730 - if Sys.file_exists src then begin 731 - Os.mkdir ~parents:true (Filename.dirname dst); 732 - (try Os.cp src dst with _ -> ()) 733 - end 734 - end 735 - ) installed_libs; 736 - (* Generate dynamic_cmis.json for each lib subdirectory that has .cmi files *) 737 - let jtw_lib_dir = Path.(jtw_layer_dir / "lib") in 738 - if Sys.file_exists jtw_lib_dir then begin 739 - let rec scan_dirs base rel = 740 - let full = if rel = "" then base else Path.(base / rel) in 741 - if Sys.file_exists full && Sys.is_directory full then begin 742 - let entries = try Sys.readdir full |> Array.to_list with _ -> [] in 743 - let cmi_files = List.filter (fun f -> Filename.check_suffix f ".cmi") entries in 744 - if cmi_files <> [] then begin 745 - let dcs_url = "lib/" ^ rel in 746 - let dcs_json = Jtw_gen.generate_dynamic_cmis_json ~dcs_url cmi_files in 747 - Os.write_to_file Path.(full / "dynamic_cmis.json") dcs_json 748 - end; 749 - (* Recurse into subdirectories *) 750 - List.iter (fun name -> 751 - let sub = if rel = "" then name else rel ^ "/" ^ name in 752 - let sub_full = Path.(base / sub) in 753 - if Sys.file_exists sub_full && Sys.is_directory sub_full then 754 - scan_dirs base sub 755 - ) entries 756 - end 757 - in 758 - scan_dirs jtw_lib_dir "" 759 723 end; 760 724 (* Clean up *) 761 725 let _ = Os.sudo [ "rm"; "-rf"; lowerdir; workdir; rootfsdir; upperdir; jtw_output_host ] in