123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131(*---------------------------------------------------------------------------
Copyright (c) 2024 The b0 programmers. All rights reserved.
SPDX-License-Identifier: ISC
---------------------------------------------------------------------------*)openB0_std(* B0_build.t *)modulerecBuild_def:sigtypet={u:build_ctx;b:build_state}andbuild_ctx={current:Unit.toption;m:B0_memo.t;}andbuild_state={root_dir:Fpath.t;b0_dir:Fpath.t;build_dir:Fpath.t;shared_dir:Fpath.t;store:B0_store.t;must_build:Unit.Set.t;may_build:Unit.Set.t;mutablerequested:Unit.tString.Map.t;mutablewaiting:Unit.tB0_random_queue.t;}end=structtypet={u:build_ctx;b:build_state}andbuild_ctx={current:Unit.toption;m:B0_memo.t;}andbuild_state={root_dir:Fpath.t;b0_dir:Fpath.t;build_dir:Fpath.t;shared_dir:Fpath.t;store:B0_store.t;must_build:Unit.Set.t;may_build:Unit.Set.t;mutablerequested:Unit.tString.Map.t;mutablewaiting:Unit.tB0_random_queue.t;}end(* B0_unit.t *)andUnit_def:sigtypebuild_proc=Build_def.t->unitFut.tandt={def:B0_def.t;build_proc:build_proc;}includeB0_def.VALUEwithtypet:=tend=structtypebuild_proc=Build_def.t->unitFut.tandt={def:B0_def.t;build_proc:build_proc;}letdef_kind="unit"letdefu=u.defletpp_name_str=Fmt.codeendandUnit:sigincludeB0_def.Swithtypet=Unit_def.tend=B0_def.Make(Unit_def)typeb0_unit=Unit.ttypeb0_unit_set=Unit.Set.ttypeb0_build=Build_def.ttypeb0_env={b0_dir:Fpath.t;build:b0_build;built_tools:b0_unitString.Map.tLazy.t;cwd:Fpath.t;root_dir:Fpath.t;scope_dir:Fpath.t;build_env:Os.Env.t;driver_env:Os.Env.t;}typebuild_proc=Unit_def.build_procletunit_build_procu=u.Unit_def.build_procletunit_is_publicu=matchUnit.find_metaB0_meta.publicuwith|None->false|Someb->blettool_is_user_accessibleu=unit_is_publicu||Unit.in_root_scopeu(* These keys are defined here so that B0_env.t can use them. *)let()=B0_scope.open_lib~module':__MODULE__"unit"letexe_file:Fpath.tFut.tB0_meta.key=letdoc="Absolute file path to a built executable."inletpp_value=Fmt.any"<built value>"inB0_meta.Key.make"exe-file"~doc~pp_valuelettool_name=letdoc="Executable tool name without platform specific extension"inB0_meta.Key.make"tool-name"~doc~pp_value:Fmt.stringlet()=B0_scope.close()(* We also maintain a tool name index for built tools.
XXX this should be reviewed at some point. *)lettool_name_index:Unit.tlistString.Map.tref=refString.Map.emptyletadd_tool_nameu=matchUnit.find_metatool_nameuwith|None->()|Somen->tool_name_index:=String.Map.add_to_listnu!tool_name_indexlettool_name_mapunits=letwarn_dup_tooluseignn=Log.warn@@funm->m"@[<v>Tool %a defined both by unit %a and %a.@,\
Ignoring definition in unit %a.@]"Fmt.codenUnit.pp_nameuseUnit.pp_nameignUnit.pp_nameigninletwarn_no_exe_fileun=Log.warn@@funm->m"@[<v>Tool %a defined by unit %a does not specify a@,\
B0_meta.exe_file key. It will not be used in the build (if needed).@]"Fmt.codenUnit.pp_nameuinletadd_unituacc=ifnot(tool_is_user_accessibleu)thenaccelsematchB0_meta.findtool_name(Unit.metau)with|None->acc|Somet->matchString.Map.find_opttaccwith|Someu'->warn_dup_tooluu't;acc|None->ifB0_meta.memexe_file(Unit.metau)thenString.Map.addtuaccelse(warn_no_exe_fileut;acc)inUnit.Set.foldadd_unitunitsString.Map.emptyletunit_make?doc?metanbuild_proc=letdef=Unit.define?doc?metaninletu={Unit_def.def;build_proc}inUnit.addu;add_tool_nameu;u