diff --git a/src/gen_rules.ml b/src/gen_rules.ml index 7f1dbe68..efc39d91 100644 --- a/src/gen_rules.ml +++ b/src/gen_rules.ml @@ -569,7 +569,7 @@ module Gen(P : Params) = struct let ppx_drivers = Hashtbl.create 32 - let build_ppx_driver ~dir ~dep_kind ~target pp_names = + let build_ppx_driver ~dir ~dep_kind ~target ~main pp_names = let mode = Mode.best in let compiler = Option.value_exn (Mode.compiler mode) in let libs = @@ -581,9 +581,21 @@ module Gen(P : Params) = struct Build.dyn_paths (Build.arr (Lib.archive_files ~mode ~ext_lib:ctx.ext_lib)) >>> Build.run (Dep compiler) - [ A "-o"; Target target - ; Dyn (Lib.link_flags ~mode) - ]); + (A "-o" :: Target target + :: Dyn (Lib.link_flags ~mode) + :: match main with + | None -> [] + | Some x -> [Dep x])); + Option.iter main ~f:(fun fn -> + add_rule + (Build.action ~targets:[fn] (Write_file (fn, {|(* 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 +|})))); libs let ppx_dir = Path.of_string (sprintf "_build/.ppx/%s" ctx.name) @@ -594,9 +606,11 @@ module Gen(P : Params) = struct match Hashtbl.find ppx_drivers key with | Some x -> x | None -> - let exe = Path.relative ppx_dir (sprintf "%s/ppx.exe" key) in + let ppx_dir = Path.relative ppx_dir key in + let exe = Path.relative ppx_dir "ppx.exe" in + let main = Path.relative ppx_dir "jbuilder_ppx_main.ml" in let libs = - build_ppx_driver names ~dir ~dep_kind ~target:exe + build_ppx_driver names ~dir ~dep_kind ~target:exe ~main:(Some main) in Hashtbl.add ppx_drivers ~key ~data:(exe, libs); (exe, libs) @@ -1192,6 +1206,7 @@ module Gen(P : Params) = struct ~dir ~dep_kind ~target:(Path.relative dir "as-ppx.exe") + ~main:None : (unit, Lib.t list) Build.t) end;