123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161(*
* Copyright (c) 2013-2020 Thomas Gazagnaire <thomas@gazagnaire.org>
* Copyright (c) 2013-2020 Anil Madhavapeddy <anil@recoil.org>
* Copyright (c) 2015-2020 Gabriel Radanne <drupyog@zoho.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*)typet={depext:bool;build_dir:Fpath.t;builder_name:string;unikernel_opam_name:Misc.Name.Opam.t;extra_repo:(string*string)list;public_name:string;}letv?(extra_repo=[])~build_dir~builder_name~depext~public_nameunikernel_opam_name={depext;build_dir;builder_name;unikernel_opam_name;extra_repo;public_name;}letdepext_rules={|
depext-lockfile: $(MIRAGE_DIR)/$(UNIKERNEL_NAME).opam.locked
echo " ↳ install external dependencies for monorepo"
env OPAMVAR_monorepo="opam-monorepo" $(OPAM) monorepo depext -y -l $<
|}letopam_repo_add_ruleextra=letbuf=Buffer.create0x100inletppf=Format.formatter_of_bufferbufinFmt.pfppf{|repo-add:
@@printf "\033[2musing overlay repository mirage: %a \033[0m\n"
|}Fmt.(brackets(list~sep:(any", ")(usingfststring)))extra;List.iter(fun(name,repo)->Fmt.pfppf"\t$(OPAM) repo add %s %s || $(OPAM) repo set-url %s %s\n"namereponamerepo)extra;Buffer.contentsbufletopam_repo_remove_ruleextra=letbuf=Buffer.create0x100inletppf=Format.formatter_of_bufferbufinFmt.pfppf{|repo-rm:
@@printf "\033[2mremoving overlay repository %a\033[0m\n"
|}Fmt.(brackets(list~sep:(any", ")(usingfststring)))extra;List.iter(fun(name,repo)->Fmt.pfppf"\t$(OPAM) repo remove %s %s\n"namerepo)extra;Buffer.contentsbufletpp_extra_rulesppft=letrules,targets=matcht.depextwith|true->([depext_rules],["depext-lockfile"])|false->([],[])inletrules,targets=matcht.extra_repowith|_::_asextra->(opam_repo_add_ruleextra::opam_repo_remove_ruleextra::rules,"repo-add"::"repo-rm"::targets)|[]->(rules,targets)inmatchruleswith|[]->()|_->Fmt.pfppf" %a\n\n"(Fmt.list~sep:(funppf()->Fmt.pfppf" ")Fmt.string)targets;Fmt.pfppf"%a"(Fmt.list~sep:(funppf()->Fmt.pfppf"\n\n")Fmt.string)rulesletppppft=letmirage_dir=Fpath.(t.build_dir/t.builder_name)inletpp_depext_lockfileppf=function|true->Fmt.stringppf"\n\t@$(MAKE) -s depext-lockfile"|false->()andpp_no_depextppf=function|true->()|false->Fmt.stringppf" --no-depexts"andpp_add_repoppf=function|_::_->Fmt.stringppf"\n\t@$(MAKE) -s repo-add"|[]->()andpp_or_remove_repoppf=function|_::_->Fmt.stringppf"; (ret=$$?; $(MAKE) -s repo-rm && exit $$ret)"|[]->()inFmt.pfppf{|-include Makefile.user
BUILD_DIR = %a
MIRAGE_DIR = %a
UNIKERNEL_NAME = %s
OPAM = opam
all::
@@$(MAKE) --no-print-directory depends
@@$(MAKE) --no-print-directory build
.PHONY: all lock install-switch pull clean depend depends build%a
$(MIRAGE_DIR)/$(UNIKERNEL_NAME).opam.locked: $(MIRAGE_DIR)/$(UNIKERNEL_NAME).opam%a
@@echo " ↳ generate lockfile for monorepo dependencies"
@@env OPAMVAR_monorepo="opam-monorepo" $(OPAM) monorepo lock --require-cross-compile --build-only $(UNIKERNEL_NAME) -l $@@ --ocaml-version $(shell ocamlc --version)%a
lock::
@@$(MAKE) -B $(MIRAGE_DIR)/$(UNIKERNEL_NAME).opam.locked
@@echo "The lock file has been generated. Run 'make pull' to retrieve the sources, or 'make install-switch' to install the host dependencies."
pull:: $(MIRAGE_DIR)/$(UNIKERNEL_NAME).opam.locked
@@echo " ↳ fetch monorepo dependencies in the duniverse folder"
@@env OPAMVAR_monorepo="opam-monorepo" $(OPAM) monorepo pull -l $< -r $(abspath $(BUILD_DIR))
@@echo "The sources have been pulled to the duniverse folder. Run 'make build' to build the unikernel."
install-switch:: $(MIRAGE_DIR)/$(UNIKERNEL_NAME).opam
@@echo " ↳ opam install switch dependencies"
@@$(OPAM) install $< --deps-only --yes%a%a
@@echo "The dependencies have been installed. Run 'make build' to build the unikernel."
depends depend::
@@$(MAKE) --no-print-directory lock
@@$(MAKE) --no-print-directory install-switch
@@$(MAKE) --no-print-directory pull
build::
dune build --profile release --root . $(BUILD_DIR)dist
@@echo "Your unikernel binary is now ready in $(BUILD_DIR)dist/%s"
@@echo "Execute the binary using solo5-hvt, solo5-spt, xl, ..."
clean::
mirage clean
|}Fpath.ppt.build_dirFpath.ppmirage_dir(Misc.Name.Opam.to_stringt.unikernel_opam_name)pp_extra_rulestpp_add_repot.extra_repopp_or_remove_repot.extra_repopp_no_depextt.depextpp_depext_lockfilet.depextt.public_name