(* -*- tuareg -*- *) (* Build a functorized version of the protocol with the `tezos-protocol-compiler` This is bit hackish... AFAIK the current version of jbuilder (1.0+beta16) does not allow to compile with a custom `rule` the `(modules)` of a library. A trick is to provide the `.cmx` through the `(library_flags)` and to generate a empty `.ml` to correctly handle the dependencies... *) #require "unix" let prefix = "proto_" let dirname = Filename.basename @@ Filename.dirname @@ Sys.getcwd () let predefined_version = None (* to be substituted in opam packages *) let version = match predefined_version with | Some version -> version | None -> let x = String.length prefix in let n = String.length dirname in if not (n >= x && String.sub dirname 0 x = prefix) then failwith "unexpected directory name" ; String.sub dirname x (n - x) let path = match predefined_version with | None -> "src/proto_" ^ version ^ "/lib_protocol" | Some _ -> "." let sources = let d = Unix.opendir "src" in let rec loop acc = match Unix.readdir d with | exception End_of_file -> Unix.closedir d ; acc | file -> let acc = if Filename.check_suffix file ".mli" || Filename.check_suffix file ".ml" then ("src/" ^ file) :: acc else acc in loop acc in loop [] let () = Format.kasprintf Jbuild_plugin.V1.send {| (jbuild_version 1) (rule ((targets (functor.ml)) (deps ((glob_files src/*.ml*) src/TEZOS_PROTOCOL)) (action (with-stdout-to ${path-no-dep:functor.ml} (chdir ${ROOT} (run ${bin:tezos-protocol-compiler.tezos-protocol-packer} ${path-no-dep:src})))))) (library ((name tezos_protocol_%s) (public_name tezos-protocol-%s) (libraries (tezos-protocol-environment-sigs)) (flags (-w "+a-4-6-7-9-29-40..42-44-45-48" -warn-error "-a+8" -safe-string -nopervasives)) (modules (Functor)))) (alias ((name runtest_sandbox) (deps (tezos_protocol_%s.cmx)))) (alias ((name runtest_indent) (deps (@[%a@])) (action (run bash ${libexec:tezos-stdlib:test-ocp-indent.sh} ${^})))) |} version version version Format.(pp_print_list (fun ppf -> Format.fprintf ppf "%S")) sources