diff --git a/manifest/main.ml b/manifest/main.ml index b8bf2ddc4165335ef65630c1fcb5f60c673e651e..6f89ad280aaf6306b35a66d3b417de7b18458d98 100644 --- a/manifest/main.ml +++ b/manifest/main.ml @@ -3849,7 +3849,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 @@ -4107,6 +4107,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. @@ -4136,7 +4147,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)) @@ -4160,12 +4173,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)) @@ -4200,11 +4217,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 @@ -4278,6 +4314,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" @@ -4295,6 +4332,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" @@ -4667,12 +4705,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 @@ -4680,7 +4712,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" @@ -4763,7 +4795,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" @@ -4788,7 +4820,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_ |> open_ ~m:"TzPervasives" @@ -4833,7 +4865,18 @@ module Protocol = Protocol ~path:(path // "bin_wasm_repl") ~opam:"octez-wasm-repl" ~synopsis:"Tezos/Protocol: REPL for the scoru-wasm functionality" - ~release_status:Unreleased + ~release_status: + (match number with + | Alpha -> + (* It's currently unclear whether it'll be ready for protocol M. + Change this to [Released] if you want the next major version to + come with this executable. *) + Experimental + | _ -> + (* There is no need for more than one octez-wasm-repl executable. + It should in fact be moved outside of proto_alpha, + into its own directory like src/bin_wasm_repl. *) + Unreleased) ~deps: [ octez_base |> open_ ~m:"TzPervasives"; @@ -4897,7 +4940,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" @@ -4919,7 +4962,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" @@ -5894,6 +5937,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"; @@ -5984,7 +6028,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 4834ee42c82f28a9133e4714608672bbdd8bed92..d59410075811dad42ba6a376d7b53cdfa11b2cde 100644 --- a/manifest/manifest.ml +++ b/manifest/manifest.ml @@ -2633,6 +2633,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. *) @@ -2642,15 +2692,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. *) @@ -3262,7 +3327,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 ; @@ -3276,7 +3341,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 d89309ea51d1b5cf856547f2b70516f434b54dff..55e4f90c3bd419102268d410684a68d6a1e3bdba 100644 --- a/manifest/manifest.mli +++ b/manifest/manifest.mli @@ -1113,7 +1113,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.