(* -*- 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 (tezos_protocol_%s.cmo tezos_protocol_%s_dummy_byte.ml)) (deps ((glob_files src/*.ml*) src/TEZOS_PROTOCOL)) (action (with-stdout-to ${path-no-dep:tezos_protocol_%s_dummy_byte.ml} (progn (chdir ${ROOT} (run ${bin:tezos-protocol-compiler-byte} -static -output-dep ${path-no-dep:.tezos_protocol_%s_byte.objs/tezos_protocol_%s} ${path-no-dep:src})) (run ln -s .tezos_protocol_%s_byte.objs/tezos_protocol_%s.cmo tezos_protocol_%s.cmo)))))) (rule ((targets (tezos_protocol_%s.o tezos_protocol_%s.cmx tezos_protocol_%s_dummy.ml)) (deps ((glob_files src/*.ml) (glob_files src/*.mli) src/TEZOS_PROTOCOL)) (action (with-stdout-to ${path-no-dep:tezos_protocol_%s_dummy.ml} (progn (chdir ${ROOT} (run ${bin:tezos-protocol-compiler} -static -output-dep ${path-no-dep:.tezos_protocol_%s.objs/tezos_protocol_%s} ${path-no-dep:src})) (run ln -s .tezos_protocol_%s.objs/tezos_protocol_%s.o tezos_protocol_%s.o) (run ln -s .tezos_protocol_%s.objs/tezos_protocol_%s.cmx tezos_protocol_%s.cmx)))))) (library ((name tezos_protocol_%s) (public_name tezos-protocol-%s) (library_flags (:standard -linkall %s/tezos_protocol_%s.cmx)) (flags (:standard -safe-string)) (wrapped false) (modes (native)) (modules (Tezos_protocol_%s_dummy)))) (library ((name tezos_protocol_%s_byte) (public_name tezos-protocol-%s.byte) (library_flags (:standard -linkall %s/tezos_protocol_%s.cmo)) (flags (:standard -safe-string)) (wrapped false) (modes (byte)) (modules (Tezos_protocol_%s_dummy_byte)))) (install ((section lib) (files (tezos_protocol_%s.cmx tezos_protocol_%s.cmi)) (package tezos-protocol-%s))) (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 version version version version version version version version version version version version version version version version version version version version version path version version version version path version version version version version version Format.(pp_print_list (fun ppf -> Format.fprintf ppf "%S")) sources