diff --git a/manifest/main.ml b/manifest/main.ml index ca7cac225f7532274fd51e3149f68fbfad2d1dff..196e7e94da406b2ce587e61d5c65b63bf70221dd 100644 --- a/manifest/main.ml +++ b/manifest/main.ml @@ -3722,7 +3722,7 @@ end = struct in () - let make ~name = + let make ~name ~status = let name_underscore = Name.name_underscore name in let name_dash = Name.name_dash name in let number = Name.number name in @@ -3980,6 +3980,17 @@ module Protocol = Protocol ~modules:["Registerer"] ~linkall:true ~flags:(Flags.standard ~disable_warnings ()) + ~release_status: + (match (number, status) with + | V _, (Active | Frozen | Overridden) -> + (* Contrary to client libs and protocol plugin registerers, + embedded protocols are useful even when the protocol was overridden. *) + Released + | V _, Not_mainnet | (Alpha | Other), _ -> + (* Ideally we would not release the opam packages but this would require + removing the dependencies when releasing, both from .opam files + and dune files. *) + Auto_opam) ~deps:[main; octez_protocol_updater; octez_protocol_environment] ~dune: Dune. @@ -4009,7 +4020,9 @@ module Protocol = Protocol let genesis = let name = Name.other "genesis" in - let {Lib_protocol.main; embedded} = Lib_protocol.make ~name in + let {Lib_protocol.main; embedded} = + Lib_protocol.make ~name ~status:Not_mainnet + in let client = public_lib (sf "tezos-client-%s" (Name.name_dash name)) @@ -4033,12 +4046,16 @@ module Protocol = Protocol let demo_noops = let name = Name.other "demo-noops" in - let {Lib_protocol.main; embedded} = Lib_protocol.make ~name in + let {Lib_protocol.main; embedded} = + Lib_protocol.make ~name ~status:Not_mainnet + in register @@ make ~name ~status:Not_mainnet ~main ~embedded () let _demo_counter = let name = Name.other "demo-counter" in - let {Lib_protocol.main; embedded} = Lib_protocol.make ~name in + let {Lib_protocol.main; embedded} = + Lib_protocol.make ~name ~status:Not_mainnet + in let client = public_lib (sf "tezos-client-%s" (Name.name_dash name)) @@ -4073,11 +4090,30 @@ module Protocol = Protocol | Frozen | Active | Not_mainnet -> true | Overridden -> false in + let executable_release_status = + match (number, status) with + | V _, (Active | Frozen) -> Released + | V _, (Overridden | Not_mainnet) -> Unreleased + | Alpha, _ -> Experimental + | Other, _ -> Unreleased + in + let optional_library_release_status = + match (number, status) with + | V _, (Active | Frozen) -> + (* Put explicit dependency in meta-package octez.opam to force the optional + dependency to be installed. *) + Released + | V _, (Overridden | Not_mainnet) | (Alpha | Other), _ -> + (* Ideally we would not release the opam packages but this would require + removing the dependencies when releasing, both from .opam files + and dune files. *) + Auto_opam + in let opt_map l f = Option.map f l in let both o1 o2 = match (o1, o2) with Some x, Some y -> Some (x, y) | _, _ -> None in - let {Lib_protocol.main; embedded} = Lib_protocol.make ~name in + let {Lib_protocol.main; embedded} = Lib_protocol.make ~name ~status in let parameters = only_if (N.(number >= 011) && not_overridden) @@ fun () -> public_lib @@ -4151,6 +4187,7 @@ module Protocol = Protocol (sf "tezos-protocol-plugin-%s-registerer" name_dash) ~path:(path // "lib_plugin") ~synopsis:"Tezos/Protocol: protocol plugin registerer" + ~release_status:optional_library_release_status ~deps: [ octez_base |> open_ ~m:"TzPervasives" @@ -4168,6 +4205,7 @@ module Protocol = Protocol (sf "tezos-client-%s" name_dash) ~path:(path // "lib_client") ~synopsis:"Tezos/Protocol: protocol specific library for `tezos-client`" + ~release_status:optional_library_release_status ~deps: [ octez_base |> open_ ~m:"TzPervasives" @@ -4540,12 +4578,6 @@ module Protocol = Protocol else "Baking_commands_registration"); ] in - let release_status = - match number with - | V _ -> Released - | Alpha -> Experimental - | Other -> Unreleased - in let daemon daemon = only_if active @@ fun () -> public_exe @@ -4553,7 +4585,7 @@ module Protocol = Protocol ~internal_name:(sf "main_%s_%s" daemon name_underscore) ~path:(path // sf "bin_%s" daemon) ~synopsis:(sf "Tezos/Protocol: %s binary" daemon) - ~release_status + ~release_status:executable_release_status ~deps: [ octez_base |> open_ ~m:"TzPervasives" @@ -4635,7 +4667,7 @@ module Protocol = Protocol ~internal_name:(sf "main_sc_rollup_client_%s" name_underscore) ~path:(path // "bin_sc_rollup_client") ~synopsis:"Tezos/Protocol: `octez-sc-rollup-client-alpha` client binary" - ~release_status + ~release_status:executable_release_status ~deps: [ octez_base |> open_ ~m:"TzPervasives" @@ -4660,7 +4692,7 @@ module Protocol = Protocol ~internal_name:(sf "main_sc_rollup_node_%s" name_underscore) ~path:(path // "bin_sc_rollup_node") ~synopsis:"Tezos/Protocol: Smart Contract Rollup node binary" - ~release_status + ~release_status:executable_release_status ~deps: [ octez_base |> open_ ~m:"TzPervasives" @@ -4737,7 +4769,7 @@ module Protocol = Protocol ~internal_name:(sf "main_tx_rollup_client_%s" name_underscore) ~path:(path // "bin_tx_rollup_client") ~synopsis:"Tezos/Protocol: `octez-tx-rollup-client-alpha` client binary" - ~release_status + ~release_status:executable_release_status ~deps: [ octez_base |> open_ ~m:"TzPervasives" @@ -4759,7 +4791,7 @@ module Protocol = Protocol ~internal_name:(sf "main_tx_rollup_node_%s" name_underscore) ~path:(path // "bin_tx_rollup_node") ~synopsis:"Tezos/Protocol: Transaction Rollup node binary" - ~release_status + ~release_status:executable_release_status ~deps: [ octez_base |> open_ ~m:"TzPervasives" @@ -5701,6 +5733,7 @@ let _octez_dal_node = ~path:"src/bin_dal_node" ~internal_name:"main_dal" ~synopsis:"Tezos: `octez-dal-node` binary" + ~release_status:Experimental ~deps: ([ octez_base |> open_ ~m:"TzPervasives"; @@ -5792,7 +5825,15 @@ let () = in test "main" ~alias:"" ~path:"tezt/tests" ~opam:"" ~deps:(deps @ test_libs) in - generate ~make_tezt_exe ~default_profile:"octez-deps" + generate + ~make_tezt_exe + ~default_profile:"octez-deps" + ~add_to_meta_package: + [ + (* [ledgerwallet_tezos] is an optional dependency, but we want + [opam install octez] to always install it. *) + ledgerwallet_tezos; + ] (* Generate a dunw-workspace file at the root of the repo *) let () = diff --git a/manifest/manifest.ml b/manifest/manifest.ml index d92c9856797947b40607a9917947d1347829b682..c5e5d59a4ecd86a7c466c35533cdb35bca53c83e 100644 --- a/manifest/manifest.ml +++ b/manifest/manifest.ml @@ -2629,6 +2629,56 @@ let generate_opam ?release for_package (internals : Target.internal list) : x_opam_monorepo_opam_provided; } +let generate_opam_meta_package opam_release_graph add_to_meta_package : Opam.t = + let depends1 : Opam.dependency list = + Fun.flip List.concat_map add_to_meta_package @@ fun target -> + match target with + | None -> [] + | Some target -> + as_opam_dependency + ~for_release:true + ~for_conflicts:false + ~for_package:"octez" + ~with_test:Never + ~optional:false + target + in + (* Include all packages that are explicitly released. *) + let depends2 = + Fun.flip List.filter_map (String_map.bindings opam_release_graph) + @@ fun (package, node) -> + match node.release_status with + | Explicitly_unreleased _ | Auto | Transitively_released _ -> + (* No need to put transitively released packages explicitly in the meta-package. + They are, by definition, transitive dependencies of explicitly released + opam packages, which we do put in the meta-package. *) + None + | Explicitly_released _ -> + Some + { + Opam.package; + version = Exactly Version; + with_test = Never; + optional = false; + } + in + { + maintainer = "contact@tezos.com"; + authors = ["Tezos devteam"]; + homepage = "https://www.tezos.com/"; + doc = "https://tezos.gitlab.io"; + bug_reports = "https://gitlab.com/tezos/tezos/issues"; + dev_repo = "git+https://gitlab.com/tezos/tezos.git"; + licenses = ["MIT"]; + depends = depends1 @ depends2; + conflicts = []; + build = []; + synopsis = "Main virtual package for Octez, an implementation of Tezos"; + url = None; + description = None; + x_opam_monorepo_opam_provided = []; + } + let generate_opam_files () = (* We store all opam files in the predefined directory /opam. That way, `opam pin` can work out of the box. *) @@ -2638,15 +2688,30 @@ let generate_opam_files () = pp_do_not_edit ~comment_start:"#" fmt () ; Opam.pp fmt opam -let generate_opam_files_for_release packages_dir release = - Target.iter_internal_by_opam @@ fun package internal_pkgs -> - let opam_filename = - packages_dir // package // (package ^ "." ^ release.version) // "opam" +let generate_opam_files_for_release packages_dir opam_release_graph + add_to_meta_package release = + let write_opam package opam = + let opam_filename = + packages_dir // package // (package ^ "." ^ release.version) // "opam" + in + (* We don't use [write] here because we don't want these opam files + to be considered by the [check_for_non_generated_files] check *) + write_raw opam_filename @@ fun fmt -> Opam.pp fmt opam in - let opam = generate_opam ~release package internal_pkgs in - (* We don't use [write] here because we don't want these opam files - to be considered by the [check_for_non_generated_files] check *) - write_raw opam_filename @@ fun fmt -> Opam.pp fmt opam + ( Target.iter_internal_by_opam @@ fun package internal_pkgs -> + match String_map.find_opt package opam_release_graph with + | None -> + (* Graph contains all internal packages. *) + assert false + | Some node -> ( + match node.release_status with + | Explicitly_unreleased _ | Auto -> () + | Explicitly_released _ | Transitively_released _ -> + write_opam package (generate_opam ~release package internal_pkgs)) + ) ; + write_opam + "octez" + (generate_opam_meta_package opam_release_graph add_to_meta_package) (* Bumping the dune lang version can result in different dune stanza semantic and could require changes to the generation logic. *) @@ -3261,7 +3326,7 @@ let generate_profiles ~default_profile = in String_map.iter generate_profile merged -let generate ~make_tezt_exe ~default_profile = +let generate ~make_tezt_exe ~default_profile ~add_to_meta_package = Printexc.record_backtrace true ; try register_tezt_targets ~make_tezt_exe ; @@ -3275,7 +3340,12 @@ let generate ~make_tezt_exe ~default_profile = generate_opam_ci opam_release_graph ; generate_binaries_for_release () ; generate_profiles ~default_profile ; - Option.iter (generate_opam_files_for_release packages_dir) release + Option.iter + (generate_opam_files_for_release + packages_dir + opam_release_graph + add_to_meta_package) + release with exn -> Printexc.print_backtrace stderr ; prerr_endline ("Error: " ^ Printexc.to_string exn) ; diff --git a/manifest/manifest.mli b/manifest/manifest.mli index 24f95d9042a21cabd026056342c4e9de2039dd2b..405a90988897e3d29b9216e9092d108fe9d42360 100644 --- a/manifest/manifest.mli +++ b/manifest/manifest.mli @@ -1111,7 +1111,10 @@ val name_for_errors : target -> string were declared without [?profile]. See the documentation of the [?profile] argument of type ['a maker]. *) val generate : - make_tezt_exe:(target list -> target) -> default_profile:string -> unit + make_tezt_exe:(target list -> target) -> + default_profile:string -> + add_to_meta_package:target list -> + unit (** Run various checks.