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_targets to solver for multi-package tool builds

Solver accepts ~extra_targets which are pinned and added as roots
alongside the main target. Used by JTW which needs both
js_top_worker-bin (binary) and js_top_worker-web (library for
worker.js compilation) in the same solution.

Currently blocked on ox by missing js_of_ocaml-lwt+ox package.

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

+28 -8
+6 -3
day11/build/tools.ml
··· 28 28 let build_tool env (benv : Types.build_env) ?(np = 4) ~packages ~env:opam_env 29 29 ?(constraints = OpamPackage.Name.Map.empty) 30 30 ?(pins = OpamPackage.Name.Map.empty) 31 - ?(doc = true) 31 + ?(doc = true) ?(extra_targets = []) 32 32 ?ocaml_version 33 33 ?(source_dirs = OpamPackage.Name.Map.empty) 34 34 ?(mounts = []) target = 35 35 let pkg_str = OpamPackage.to_string target in 36 36 Log.info (fun m -> m "Building tool %s" pkg_str); 37 37 match Day11_solver.Solve.solve ~packages ~env:opam_env 38 - ~constraints ~pins ~doc ?ocaml_version target with 38 + ~constraints ~pins ~doc ~extra_targets ?ocaml_version target with 39 39 | Error diag -> 40 40 Rresult.R.error_msgf "Cannot solve %s: %s" pkg_str diag 41 41 | Ok solution -> ··· 105 105 106 106 let build_tool_from_repo env benv ?(np = 4) ~packages ~env:opam_env 107 107 ?ocaml_version ?(mounts = []) ?(extra_repo_dirs = []) 108 + ?(extra_target_names = []) 108 109 ~repo_dir ~target_name () = 109 110 let add_repo_pins dir (pins, source_dirs) = 110 111 let new_pins = read_pins_from_dir dir in ··· 120 121 (OpamPackage.Name.Map.empty, OpamPackage.Name.Map.empty) 121 122 in 122 123 let target = OpamPackage.of_string (target_name ^ ".dev") in 124 + let extra_targets = List.map (fun n -> 125 + OpamPackage.of_string (n ^ ".dev")) extra_target_names in 123 126 build_tool env benv ~np ~packages ~env:opam_env ~pins ~source_dirs 124 - ~doc:false ?ocaml_version ~mounts target 127 + ~doc:false ~extra_targets ?ocaml_version ~mounts target
+2
day11/build/tools.mli
··· 9 9 ?constraints:OpamFormula.version_constraint OpamTypes.name_map -> 10 10 ?pins:(OpamPackage.Version.t * OpamFile.OPAM.t) OpamPackage.Name.Map.t -> 11 11 ?doc:bool -> 12 + ?extra_targets:OpamPackage.t list -> 12 13 ?ocaml_version:OpamPackage.t -> 13 14 ?source_dirs:string OpamPackage.Name.Map.t -> 14 15 ?mounts:Day11_container.Mount.t list -> ··· 35 36 ?ocaml_version:OpamPackage.t -> 36 37 ?mounts:Day11_container.Mount.t list -> 37 38 ?extra_repo_dirs:string list -> 39 + ?extra_target_names:string list -> 38 40 repo_dir:string -> 39 41 target_name:string -> 40 42 unit ->
+1
day11/jtw/build_tools.ml
··· 9 9 match Day11_build.Tools.build_tool_from_repo env benv ~np 10 10 ~packages ~env:opam_env ~ocaml_version:compiler_v 11 11 ~mounts ~extra_repo_dirs ~repo_dir 12 + ~extra_target_names:Tool_layer.extra_tool_targets 12 13 ~target_name:Tool_layer.tool_target () with 13 14 | Ok tool -> 14 15 Printf.printf "JTW tools for %s: OK\n%!"
+1
day11/jtw/tool_layer.ml
··· 65 65 (pin_cmds @ extra_pin_cmds @ [ install_cmd; verify_cmd; jtw_cmd ]) 66 66 67 67 let tool_target = "js_top_worker-bin" 68 + let extra_tool_targets = [ "js_top_worker-web" ] 68 69 69 70 let exists ~layer_dir = 70 71 Sys.file_exists
+5 -1
day11/jtw/tool_layer.mli
··· 40 40 and builds worker.js. The caller must provide the bind mount. *) 41 41 42 42 val tool_target : string 43 - (** The opam package name for the jtw tool binary (["js_top_worker-bin"]). *) 43 + (** The primary opam package name for the jtw tool binary. *) 44 + 45 + val extra_tool_targets : string list 46 + (** Additional packages needed in the jtw tool layer beyond 47 + [tool_target] (e.g. [js_top_worker-web] for worker.js). *) 44 48 45 49 val exists : layer_dir:Fpath.t -> bool 46 50 (** Check if the tool layer has been built. *)
+12 -4
day11/solver/solve.ml
··· 2 2 3 3 let solve_internal ~packages:pkgs ~env ?(constraints = OpamPackage.Name.Map.empty) 4 4 ?(pins = OpamPackage.Name.Map.empty) 5 - ?(prefer_oldest = false) ?(doc = true) target = 5 + ?(prefer_oldest = false) ?(doc = true) 6 + ?(extra_targets = []) target = 6 7 let name = OpamPackage.name target in 7 8 let version = OpamPackage.version target in 8 9 (* Don't overwrite an existing constraint — e.g. the compiler ··· 19 20 let constraints = 20 21 OpamPackage.Name.Map.add name (`Eq, version) constraints 21 22 in 23 + (* Pin extra targets so the solver sees them *) 24 + let constraints = List.fold_left (fun acc et -> 25 + OpamPackage.Name.Map.add (OpamPackage.name et) 26 + (`Eq, OpamPackage.version et) acc 27 + ) constraints extra_targets in 22 28 let context = 23 29 Context.create ~prefer_oldest ~constraints ~pins ~env ~packages:pkgs 24 30 ~doc () ··· 63 69 in 64 70 names 65 71 in 66 - let roots = [ compiler_root; name ] @ extra_doc_roots in 72 + let extra_target_roots = List.map OpamPackage.name extra_targets in 73 + let roots = [ compiler_root; name ] 74 + @ extra_doc_roots @ extra_target_roots in 67 75 match Solver.solve context roots with 68 76 | Error e -> 69 77 let examined = Context.examined_packages context in ··· 133 141 (`Geq, OpamPackage.Version.of_string "4.08.0") constraints 134 142 135 143 let solve ~packages ~env ?constraints ?pins ?prefer_oldest 136 - ?(doc = true) ?ocaml_version target = 144 + ?(doc = true) ?(extra_targets = []) ?ocaml_version target = 137 145 let constraints = add_ocaml_constraint ?ocaml_version 138 146 (Option.value ~default:OpamPackage.Name.Map.empty constraints) in 139 147 match solve_internal ~packages ~env ~constraints ?pins 140 - ?prefer_oldest ~doc target with 148 + ?prefer_oldest ~doc ~extra_targets target with 141 149 | Ok (solution, _examined) -> Ok solution 142 150 | Error (msg, _examined) -> Error msg 143 151
+1
day11/solver/solve.mli
··· 11 11 ?pins:(OpamPackage.Version.t * OpamFile.OPAM.t) OpamPackage.Name.Map.t -> 12 12 ?prefer_oldest:bool -> 13 13 ?doc:bool -> 14 + ?extra_targets:OpamPackage.t list -> 14 15 ?ocaml_version:OpamPackage.t -> 15 16 OpamPackage.t -> 16 17 (Day11_graph.Graph.solution, string) result