Switch to ocaml-migrate-parsetree.driver-main

This commit is contained in:
Jeremie Dimino 2017-03-06 10:22:00 +00:00
parent 9423e5ae74
commit 35ac2e84ed
3 changed files with 44 additions and 25 deletions

View File

@ -168,6 +168,8 @@ module Gen(P : Params) = struct
create findlib P.internal_libraries create findlib P.internal_libraries
~dirs_with_dot_opam_files:P.dirs_with_dot_opam_files ~dirs_with_dot_opam_files:P.dirs_with_dot_opam_files
let find ~from name = find t ~from name
module Libs_vfile = module Libs_vfile =
Vfile_kind.Make_full Vfile_kind.Make_full
(struct type t = Lib.t list end) (struct type t = Lib.t list end)
@ -178,7 +180,7 @@ module Gen(P : Params) = struct
(struct (struct
open Sexp.Of_sexp open Sexp.Of_sexp
let t dir sexp = let t dir sexp =
List.map (list string sexp) ~f:(Lib_db.find t ~from:dir) List.map (list string sexp) ~f:(Lib_db.find_exn t ~from:dir)
end) end)
let vrequires ~dir ~item = let vrequires ~dir ~item =
@ -567,43 +569,55 @@ module Gen(P : Params) = struct
let ppx_drivers = Hashtbl.create 32 let ppx_drivers = Hashtbl.create 32
let build_ppx_driver ~dir ~dep_kind ~target ~main pp_names ~driver = let migrate_driver_main = "ocaml-migrate-parsetree.driver-main"
let build_ppx_driver ~dir ~dep_kind ~target pp_names ~driver =
let mode = Mode.best in let mode = Mode.best in
let compiler = Option.value_exn (Mode.compiler mode) in let compiler = Option.value_exn (Mode.compiler mode) in
let pp_names = pp_names @ [migrate_driver_main] in
let libs = let libs =
Lib_db.closure ~dir ~dep_kind (List.map pp_names ~f:Lib_dep.direct) Lib_db.closure ~dir ~dep_kind (List.map pp_names ~f:Lib_dep.direct)
in in
let libs = let libs =
(* Put the driver back at the end *) (* Put the driver back at the end, just before migrate_driver_main *)
match driver with match driver with
| None -> libs | None -> libs
| Some driver -> | Some driver ->
libs >>^ fun libs -> libs >>^ fun libs ->
let libs, driver = let is_driver name = name = driver || name = migrate_driver_main in
let libs, drivers =
List.partition_map libs ~f:(fun lib -> List.partition_map libs ~f:(fun lib ->
if (match lib with if (match lib with
| External pkg -> pkg.name = driver | External pkg -> is_driver pkg.name
| Internal (_, lib) -> | Internal (_, lib) ->
lib.name = driver || is_driver lib.name ||
match lib.public with match lib.public with
| None -> false | None -> false
| Some { name; _ } -> name = driver) | Some { name; _ } -> is_driver name)
then then
Inr lib Inr lib
else else
Inl lib) Inl lib)
in in
libs @ driver libs @ drivers
in
(* Provide a better error for migrate_driver_main given that this is an implicit
dependency *)
let libs =
match Lib_db.find ~from:dir migrate_driver_main with
| None ->
Build.fail { fail = fun () ->
die "@{<error>Error@}: I couldn't find '%s'.\n\
I need this library in order to use ppx rewriters.\n\
See the manual for details.\n\
Hint: opam install ocaml-migrate-parsetree"
migrate_driver_main
}
>>>
libs
| Some _ ->
libs
in in
add_rule
(Build.action ~targets:[main] (Write_file (main, {|(* File generated by jbuilder *)
let () =
Printf.eprintf "%s: driver missing!
If you see this message, it means that you are missing a ppx driver at the
end of your list of preprocessors. Consult the manual for more details."
Sys.argv.(0);
exit 1
|})));
add_rule add_rule
(libs (libs
>>> >>>
@ -612,7 +626,7 @@ end of your list of preprocessors. Consult the manual for more details."
Build.run (Dep compiler) Build.run (Dep compiler)
[ A "-o" ; Target target [ A "-o" ; Target target
; Dyn (Lib.link_flags ~mode) ; Dyn (Lib.link_flags ~mode)
; Dep main ]); ]);
libs libs
let ppx_dir = Path.of_string (sprintf "_build/.ppx/%s" ctx.name) let ppx_dir = Path.of_string (sprintf "_build/.ppx/%s" ctx.name)
@ -634,9 +648,8 @@ end of your list of preprocessors. Consult the manual for more details."
| None -> | None ->
let ppx_dir = Path.relative ppx_dir key in let ppx_dir = Path.relative ppx_dir key in
let exe = Path.relative ppx_dir "ppx.exe" in let exe = Path.relative ppx_dir "ppx.exe" in
let main = Path.relative ppx_dir "jbuilder_ppx_main.ml" in
let libs = let libs =
build_ppx_driver names ~dir ~dep_kind ~target:exe ~main ~driver build_ppx_driver names ~dir ~dep_kind ~target:exe ~driver
in in
Hashtbl.add ppx_drivers ~key ~data:(exe, libs); Hashtbl.add ppx_drivers ~key ~data:(exe, libs);
(exe, libs) (exe, libs)

View File

@ -24,7 +24,7 @@ let find_by_internal_name t ~from name =
let scope = internal_name_scope t ~dir:from in let scope = internal_name_scope t ~dir:from in
String_map.find name !scope String_map.find name !scope
let find t ~from name = let find_exn t ~from name =
match find_by_internal_name t ~from name with match find_by_internal_name t ~from name with
| Some x -> Lib.Internal x | Some x -> Lib.Internal x
| None -> | None ->
@ -32,6 +32,11 @@ let find t ~from name =
~f:(fun name -> ~f:(fun name ->
External (Findlib.find_exn t.findlib name)) External (Findlib.find_exn t.findlib name))
let find t ~from name =
match find_exn t ~from name with
| exception _ -> None
| x -> Some x
let find_internal t ~from name = let find_internal t ~from name =
match find_by_internal_name t ~from name with match find_by_internal_name t ~from name with
| Some _ as some -> some | Some _ as some -> some
@ -111,18 +116,18 @@ let interpret_lib_deps t ~dir lib_deps =
let libs, failures = let libs, failures =
List.partition_map lib_deps ~f:(function List.partition_map lib_deps ~f:(function
| Lib_dep.Direct name -> begin | Lib_dep.Direct name -> begin
match find t ~from:dir name with match find_exn t ~from:dir name with
| x -> Inl [x] | x -> Inl [x]
| exception e -> | exception e ->
(* Call [find] again to get a proper backtrace *) (* Call [find] again to get a proper backtrace *)
Inr { fail = fun () -> ignore (find t ~from:dir name : Lib.t); raise e } Inr { fail = fun () -> ignore (find_exn t ~from:dir name : Lib.t); raise e }
end end
| Select { result_fn; choices } -> | Select { result_fn; choices } ->
match match
List.find_map choices ~f:(fun { lits; _ } -> List.find_map choices ~f:(fun { lits; _ } ->
match match
List.filter_map lits ~f:(function List.filter_map lits ~f:(function
| Pos s -> Some (find t ~from:dir s) | Pos s -> Some (find_exn t ~from:dir s)
| Neg s -> | Neg s ->
if lib_is_installable t ~from:dir s then if lib_is_installable t ~from:dir s then
raise Exit raise Exit

View File

@ -10,7 +10,8 @@ val create
-> (Path.t * Jbuild_types.Library.t) list -> (Path.t * Jbuild_types.Library.t) list
-> t -> t
val find : t -> from:Path.t -> string -> Lib.t val find : t -> from:Path.t -> string -> Lib.t option
val find_exn : t -> from:Path.t -> string -> Lib.t
val internal_libs_without_non_installable_optional_ones : t -> Lib.Internal.t list val internal_libs_without_non_installable_optional_ones : t -> Lib.Internal.t list