My aggregated monorepo of OCaml code, automaintained
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add --extra-pin flag and extra_repo_dirs to build_tool_from_repo

Repeatable --extra-pin DIR flag pins additional local checkouts.
Used for JTW's mime_printer dependency which lives in a separate repo.
Each extra dir gets its .opam files read and added to pins/source_dirs.

Tested: mime_printer pinned from ~/mime_printer, solve succeeds,
72/74 JTW tool packages build (js_top_worker needs 5.4.1 update).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

+35 -16
+9 -3
day11/bin/cmd_batch.ml
··· 28 28 let run cache_dir opam_repositories np arch os_distribution os_version 29 29 with_doc ocaml_version_str odoc_repo jtw_repo patches_dir opam_build_repo 30 30 solve_only dry_run rebuild_failed rebuild_base small_universe 31 - driver_compiler_str target = 31 + extra_pins driver_compiler_str target = 32 32 cleanup_stale_mounts (); 33 33 let cache_dir = Common.fpath cache_dir in 34 34 Bos.OS.Dir.create ~path:true cache_dir |> ignore; ··· 369 369 let output = Fpath.to_string Fpath.(cache_dir / "jtw-output") in 370 370 Day11_jtw.Build_tools.build_and_run env benv ~np ~os_dir 371 371 ~packages:git_packages ~opam_env ~mounts:[repo_mount] 372 - ~repo_dir:dir ~output ~nodes ~solutions 372 + ~extra_repo_dirs:extra_pins ~repo_dir:dir ~output 373 + ~nodes ~solutions 373 374 | None -> ()); 374 375 0 375 376 end ··· 406 407 let doc = "Path to local js_top_worker source checkout (pins jtw packages to dev)" in 407 408 Arg.(value & opt (some string) None & info [ "jtw-repo" ] ~docv:"DIR" ~doc) 408 409 410 + let extra_pin_term = 411 + let doc = "Extra local source checkout to pin (repeatable). Reads .opam \ 412 + files and pins all packages to dev." in 413 + Arg.(value & opt_all string [] & info [ "extra-pin" ] ~docv:"DIR" ~doc) 414 + 409 415 let driver_compiler_term = 410 416 let doc = "Compiler for doc driver tools (default ocaml-base-compiler.5.4.1). \ 411 417 Only the driver layer uses this; odoc itself is built per target compiler." in ··· 425 431 $ odoc_repo_term $ jtw_repo_term $ Common.patches_dir_term 426 432 $ Common.opam_build_repo_term $ solve_only_term $ dry_run_term 427 433 $ rebuild_failed_term $ rebuild_base_term $ small_universe_term 428 - $ driver_compiler_term $ target_term) in 434 + $ extra_pin_term $ driver_compiler_term $ target_term) in 429 435 Cmd.v info term
+15 -5
day11/build/tools.ml
··· 104 104 packages = topo; builds = nodes } 105 105 106 106 let build_tool_from_repo env benv ?(np = 4) ~packages ~env:opam_env 107 - ?ocaml_version ?(mounts = []) ~repo_dir ~target_name () = 108 - let pins = read_pins_from_dir repo_dir in 109 - let source_dirs = OpamPackage.Name.Map.fold (fun name _ acc -> 110 - OpamPackage.Name.Map.add name repo_dir acc 111 - ) pins OpamPackage.Name.Map.empty in 107 + ?ocaml_version ?(mounts = []) ?(extra_repo_dirs = []) 108 + ~repo_dir ~target_name () = 109 + let add_repo_pins dir (pins, source_dirs) = 110 + let new_pins = read_pins_from_dir dir in 111 + let pins = OpamPackage.Name.Map.fold 112 + OpamPackage.Name.Map.add new_pins pins in 113 + let source_dirs = OpamPackage.Name.Map.fold (fun name _ acc -> 114 + OpamPackage.Name.Map.add name dir acc 115 + ) new_pins source_dirs in 116 + (pins, source_dirs) 117 + in 118 + let pins, source_dirs = 119 + List.fold_right add_repo_pins (repo_dir :: extra_repo_dirs) 120 + (OpamPackage.Name.Map.empty, OpamPackage.Name.Map.empty) 121 + in 112 122 let target = OpamPackage.of_string (target_name ^ ".dev") in 113 123 build_tool env benv ~np ~packages ~env:opam_env ~pins ~source_dirs 114 124 ~doc:false ?ocaml_version ~mounts target
+5 -4
day11/build/tools.mli
··· 34 34 env:(string -> OpamVariable.variable_contents option) -> 35 35 ?ocaml_version:OpamPackage.t -> 36 36 ?mounts:Day11_container.Mount.t list -> 37 + ?extra_repo_dirs:string list -> 37 38 repo_dir:string -> 38 39 target_name:string -> 39 40 unit -> 40 41 (Day11_layer.Layer_type.tool, [> Rresult.R.msg ]) result 41 42 (** [build_tool_from_repo env benv ~packages ~env ~repo_dir 42 - ~target_name ()] reads [.opam] files from [repo_dir], pins all 43 - packages found to dev, and builds [target_name.dev] with 44 - [~doc:false]. Use for tool builds from local checkouts (odoc, 45 - jtw, etc.). *) 43 + ?extra_repo_dirs ~target_name ()] reads [.opam] files from 44 + [repo_dir] and each [extra_repo_dirs], pins all packages found 45 + to dev, and builds [target_name.dev] with [~doc:false]. 46 + Use for tool builds from local checkouts. *)
+4 -4
day11/jtw/build_tools.ml
··· 1 1 let build_per_compiler env benv ~np ~packages ~opam_env ~mounts 2 - ~repo_dir ~solutions = 2 + ~extra_repo_dirs ~repo_dir ~solutions = 3 3 Printf.printf "\nBuilding JTW tools from %s...\n%!" repo_dir; 4 4 let compiler_versions = 5 5 Day11_doc.Generate.unique_compilers solutions in ··· 8 8 (OpamPackage.to_string compiler_v); 9 9 match Day11_build.Tools.build_tool_from_repo env benv ~np 10 10 ~packages ~env:opam_env ~ocaml_version:compiler_v 11 - ~mounts ~repo_dir 11 + ~mounts ~extra_repo_dirs ~repo_dir 12 12 ~target_name:Tool_layer.tool_target () with 13 13 | Ok tool -> 14 14 Printf.printf "JTW tools for %s: OK\n%!" ··· 21 21 ) compiler_versions 22 22 23 23 let build_and_run env benv ~np ~os_dir ~packages ~opam_env ~mounts 24 - ~repo_dir ~output ~nodes ~solutions = 24 + ~extra_repo_dirs ~repo_dir ~output ~nodes ~solutions = 25 25 let jtw_tools = build_per_compiler env benv ~np ~packages ~opam_env 26 - ~mounts ~repo_dir ~solutions in 26 + ~mounts ~extra_repo_dirs ~repo_dir ~solutions in 27 27 if jtw_tools = [] then 28 28 Printf.printf "No JTW tools built, skipping generation\n%!" 29 29 else begin
+2
day11/jtw/build_tools.mli
··· 11 11 packages:Day11_solver.Git_packages.t -> 12 12 opam_env:(string -> OpamVariable.variable_contents option) -> 13 13 mounts:Day11_container.Mount.t list -> 14 + extra_repo_dirs:string list -> 14 15 repo_dir:string -> 15 16 solutions:(OpamPackage.t * Day11_graph.Graph.solution) list -> 16 17 (OpamPackage.t * Day11_layer.Layer_type.tool) list ··· 24 25 packages:Day11_solver.Git_packages.t -> 25 26 opam_env:(string -> OpamVariable.variable_contents option) -> 26 27 mounts:Day11_container.Mount.t list -> 28 + extra_repo_dirs:string list -> 27 29 repo_dir:string -> 28 30 output:string -> 29 31 nodes:Day11_layer.Layer_type.build list ->