Move Path to Stdune

* This requires moving Fatal_error and Loc_error to Stdune.Exn as well

* Clflags.workspace_root can no longer be used in Path.to_absolute_filename. We
  just take a parameter instead for now.
This commit is contained in:
Rudi Grinberg 2018-04-24 19:22:41 +07:00
parent bfd0f2eada
commit 6aa1b84fee
29 changed files with 90 additions and 52 deletions

View File

@ -1,3 +1,5 @@
open Stdune
module Outputs = struct module Outputs = struct
type t = type t =
| Stdout | Stdout

View File

@ -1,5 +1,7 @@
(** OCaml binaries *) (** OCaml binaries *)
open Stdune
(** Character used to separate entries in [PATH] and similar (** Character used to separate entries in [PATH] and similar
environment variables *) environment variables *)
val path_sep : char val path_sep : char

View File

@ -1,5 +1,7 @@
(** Dependency path *) (** Dependency path *)
open Stdune
module Entry : sig module Entry : sig
type t = type t =
| Path of Path.t | Path of Path.t

View File

@ -1,4 +1,5 @@
exception Fatal_error of string open Stdune
exception Already_reported exception Already_reported
let err_buf = Buffer.create 128 let err_buf = Buffer.create 128
@ -13,4 +14,4 @@ let kerrf fmt ~f =
err_ppf fmt err_ppf fmt
let die fmt = let die fmt =
kerrf fmt ~f:(fun s -> raise (Fatal_error s)) kerrf fmt ~f:(fun s -> raise (Exn.Fatal_error s))

View File

@ -3,15 +3,6 @@
(* CR-soon diml: stop including this in [Import] *) (* CR-soon diml: stop including this in [Import] *)
(** This module is included in [Import] *) (** This module is included in [Import] *)
(* CR-soon diml:
- Rename to [User_error]
- change the [string] argument to [Loc.t option * string] and get rid of
[Loc.Error]. The two are a bit confusing
- change [string] to [Colors.Style.t Pp.t]
*)
(** A fatal error, that should be reported to the user in a nice way *)
exception Fatal_error of string
(* CR-soon diml: we won't need this once we can generate rules dynamically *) (* CR-soon diml: we won't need this once we can generate rules dynamically *)
(** Raised for errors that have already been reported to the user and shouldn't be (** Raised for errors that have already been reported to the user and shouldn't be
reported again. This might happen when trying to build a dependency that has already reported again. This might happen when trying to build a dependency that has already
@ -19,7 +10,7 @@ exception Fatal_error of string
exception Already_reported exception Already_reported
(* CR-soon diml: Rename to [user_errorf]. *) (* CR-soon diml: Rename to [user_errorf]. *)
(** Raise a [Fatal_error] exception *) (** Raise a [Exn.Fatal_error] exception *)
val die : ('a, Format.formatter, unit, 'b) format4 -> 'a val die : ('a, Format.formatter, unit, 'b) format4 -> 'a
(**/**) (**/**)

View File

@ -1,3 +1,5 @@
open Stdune
module type Params = sig module type Params = sig
val sctx : Super_context.t val sctx : Super_context.t
end end

View File

@ -136,7 +136,7 @@ end
List.concat List.concat
[ [ "-I"; "+compiler-libs" ] [ [ "-I"; "+compiler-libs" ]
; cmas ; cmas
; [ Path.to_absolute_filename wrapper ] ; [ Path.to_absolute_filename wrapper ~root:!Clflags.workspace_root ]
] ]
in in
(* CR-someday jdimino: if we want to allow plugins to use findlib: (* CR-someday jdimino: if we want to allow plugins to use findlib:

View File

@ -1,4 +1,4 @@
open Jbuild open Stdune
module Jbuilds : sig module Jbuilds : sig
type t type t
@ -6,14 +6,14 @@ module Jbuilds : sig
val eval val eval
: t : t
-> context:Context.t -> context:Context.t
-> (Path.t * Scope_info.t * Stanzas.t) list Fiber.t -> (Path.t * Jbuild.Scope_info.t * Jbuild.Stanzas.t) list Fiber.t
end end
type conf = type conf =
{ file_tree : File_tree.t { file_tree : File_tree.t
; jbuilds : Jbuilds.t ; jbuilds : Jbuilds.t
; packages : Package.t Package.Name.Map.t ; packages : Package.t Package.Name.Map.t
; scopes : Scope_info.t list ; scopes : Jbuild.Scope_info.t list
} }
val load val load

View File

@ -32,16 +32,14 @@ let of_lexbuf lb =
; stop = Lexing.lexeme_end_p lb ; stop = Lexing.lexeme_end_p lb
} }
exception Error of t * string
let exnf t fmt = let exnf t fmt =
Format.pp_print_as err_ppf 7 ""; (* "Error: " *) Format.pp_print_as err_ppf 7 ""; (* "Error: " *)
kerrf fmt ~f:(fun s -> Error (t, s)) kerrf fmt ~f:(fun s -> Exn.Loc_error (t, s))
let fail t fmt = let fail t fmt =
Format.pp_print_as err_ppf 7 ""; (* "Error: " *) Format.pp_print_as err_ppf 7 ""; (* "Error: " *)
kerrf fmt ~f:(fun s -> kerrf fmt ~f:(fun s ->
raise (Error (t, s))) raise (Exn.Loc_error (t, s)))
let fail_lex lb fmt = let fail_lex lb fmt =
fail (of_lexbuf lb) fmt fail (of_lexbuf lb) fmt

View File

@ -7,8 +7,6 @@ val sexp_of_t : t -> Usexp.t
val of_lexbuf : Lexing.lexbuf -> t val of_lexbuf : Lexing.lexbuf -> t
exception Error of t * string
val exnf : t -> ('a, Format.formatter, unit, exn) format4 -> 'a val exnf : t -> ('a, Format.formatter, unit, exn) format4 -> 'a
val fail : t -> ('a, Format.formatter, unit, 'b ) format4 -> 'a val fail : t -> ('a, Format.formatter, unit, 'b ) format4 -> 'a
val fail_lex : Lexing.lexbuf -> ('a, Format.formatter, unit, 'b ) format4 -> 'a val fail_lex : Lexing.lexbuf -> ('a, Format.formatter, unit, 'b ) format4 -> 'a

View File

@ -1,5 +1,7 @@
(** Menhir rules *) (** Menhir rules *)
open Stdune
(** Generate the rules for a [(menhir ...)] stanza. Return the list of (** Generate the rules for a [(menhir ...)] stanza. Return the list of
targets that are generated by these rules. This list of targets is targets that are generated by these rules. This list of targets is
used by the code that computes the list of modules in the used by the code that computes the list of modules in the

View File

@ -70,7 +70,7 @@ let ppx_flags sctx ~dir:_ ~scope ~src_dir:_ { preprocess; libname; _ } =
| Pps { pps; flags } -> | Pps { pps; flags } ->
let exe = Preprocessing.get_ppx_driver sctx ~scope pps in let exe = Preprocessing.get_ppx_driver sctx ~scope pps in
let command = let command =
List.map (Path.to_absolute_filename exe List.map (Path.to_absolute_filename exe ~root:!Clflags.workspace_root
:: "--as-ppx" :: "--as-ppx"
:: Preprocessing.cookie_library_name libname :: Preprocessing.cookie_library_name libname
@ flags) @ flags)

View File

@ -1,5 +1,7 @@
(** Checks modules partitioning inside a directory *) (** Checks modules partitioning inside a directory *)
open Stdune
type t type t
val create val create

View File

@ -1,5 +1,7 @@
(** OCaml flags *) (** OCaml flags *)
open Stdune
type t type t
val make val make

View File

@ -1,5 +1,7 @@
(** ocamldep management *) (** ocamldep management *)
open Stdune
module Dep_graph : sig module Dep_graph : sig
type t type t

View File

@ -1,3 +1,4 @@
open Stdune
module Name = struct module Name = struct
include Interned.Make() include Interned.Make()

View File

@ -1,5 +1,7 @@
(** Information about a package defined in the workspace *) (** Information about a package defined in the workspace *)
open Stdune
module Name : sig module Name : sig
type t type t

View File

@ -1,2 +1,4 @@
open Stdune
(** Diff two files that are expected not to match. *) (** Diff two files that are expected not to match. *)
val print : Path.t -> Path.t -> _ Fiber.t val print : Path.t -> Path.t -> _ Fiber.t

View File

@ -25,7 +25,7 @@ let report_with_backtrace exn =
| Some p -> p | Some p -> p
| None -> | None ->
match exn with match exn with
| Loc.Error (loc, msg) -> | Exn.Loc_error (loc, msg) ->
let loc = let loc =
{ loc with { loc with
start = { loc.start with pos_fname = !map_fname loc.start.pos_fname } start = { loc.start with pos_fname = !map_fname loc.start.pos_fname }
@ -55,7 +55,7 @@ let report_with_backtrace exn =
loc = Some loc loc = Some loc
; pp = fun ppf -> Format.fprintf ppf "@{<error>Error@}: %s\n" msg ; pp = fun ppf -> Format.fprintf ppf "@{<error>Error@}: %s\n" msg
} }
| Fatal_error msg -> | Exn.Fatal_error msg ->
{ p with pp = fun ppf -> { p with pp = fun ppf ->
if msg.[String.length msg - 1] = '\n' then if msg.[String.length msg - 1] = '\n' then
Format.fprintf ppf "%s" msg Format.fprintf ppf "%s" msg

View File

@ -1,5 +1,7 @@
(** Scopes *) (** Scopes *)
open Stdune
(** Representation of a Scope. It contain a library database for all (** Representation of a Scope. It contain a library database for all
the private libraries in the scope. *) the private libraries in the scope. *)
type t type t

View File

@ -2,10 +2,21 @@ type t = exn
exception Code_error of Usexp.t exception Code_error of Usexp.t
exception Fatal_error of string
exception Loc_error of Usexp.Loc.t * string
external raise : exn -> _ = "%raise" external raise : exn -> _ = "%raise"
external raise_notrace : exn -> _ = "%raise_notrace" external raise_notrace : exn -> _ = "%raise_notrace"
external reraise : exn -> _ = "%reraise" external reraise : exn -> _ = "%reraise"
let fatalf ?loc fmt =
Format.ksprintf (fun s ->
match loc with
| None -> raise (Fatal_error s)
| Some loc -> raise (Loc_error (loc, s))
) fmt
let protectx x ~f ~finally = let protectx x ~f ~finally =
match f x with match f x with
| y -> finally x; y | y -> finally x; y

View File

@ -4,6 +4,23 @@
shouldn't try to be developer friendly rather than user friendly. *) shouldn't try to be developer friendly rather than user friendly. *)
exception Code_error of Usexp.t exception Code_error of Usexp.t
(* CR-soon diml:
- Rename to [User_error]
- change the [string] argument to [Loc.t option * string] and get rid of
[Loc.Error]. The two are a bit confusing
- change [string] to [Colors.Style.t Pp.t]
*)
(** A fatal error, that should be reported to the user in a nice way *)
exception Fatal_error of string
exception Loc_error of Usexp.Loc.t * string
val fatalf
: ?loc:Usexp.Loc.t
-> ('a, unit, string, string, string, 'b) format6
-> 'a
val code_error : string -> (string * Usexp.t) list -> _ val code_error : string -> (string * Usexp.t) list -> _
type t = exn type t = exn

View File

@ -1,5 +1,3 @@
open Stdune
let explode_path = let explode_path =
let rec loop path acc = let rec loop path acc =
let dir = Filename.dirname path in let dir = Filename.dirname path in
@ -96,11 +94,11 @@ module Local = struct
let relative ?error_loc t path = let relative ?error_loc t path =
let rec loop t components = let rec loop t components =
match components with match components with
| [] -> Ok t | [] -> Result.Ok t
| "." :: rest -> loop t rest | "." :: rest -> loop t rest
| ".." :: rest -> | ".." :: rest ->
begin match t with begin match t with
| "" -> Error () | "" -> Result.Error ()
| t -> loop (parent t) rest | t -> loop (parent t) rest
end end
| fn :: rest -> | fn :: rest ->
@ -109,9 +107,9 @@ module Local = struct
| _ -> loop (t ^ "/" ^ fn) rest | _ -> loop (t ^ "/" ^ fn) rest
in in
match loop t (explode_path path) with match loop t (explode_path path) with
| Ok t -> t | Result.Ok t -> t
| Error () -> | Error () ->
Loc.fail_opt error_loc "path outside the workspace: %s from %s" path Exn.fatalf ?loc:error_loc "path outside the workspace: %s from %s" path
(to_string t) (to_string t)
let is_canonicalized = let is_canonicalized =
@ -280,9 +278,8 @@ let absolute fn =
else else
fn fn
let to_absolute_filename t = let to_absolute_filename t ~root =
if is_local t then begin if is_local t then begin
let root = !Clflags.workspace_root in
assert (not (Filename.is_relative root)); assert (not (Filename.is_relative root));
Filename.concat root (to_string t) Filename.concat root (to_string t)
end else end else

View File

@ -1,5 +1,3 @@
open Import
(** In the current workspace (anything under the current project root) *) (** In the current workspace (anything under the current project root) *)
module Local : sig module Local : sig
type t type t
@ -50,7 +48,7 @@ module Map : Map.S with type key = t
val kind : t -> Kind.t val kind : t -> Kind.t
val of_string : ?error_loc:Loc.t -> string -> t val of_string : ?error_loc:Usexp.Loc.t -> string -> t
val to_string : t -> string val to_string : t -> string
(** [to_string_maybe_quoted t] is [maybe_quoted (to_string t)] *) (** [to_string_maybe_quoted t] is [maybe_quoted (to_string t)] *)
@ -61,15 +59,15 @@ val is_root : t -> bool
val is_local : t -> bool val is_local : t -> bool
val relative : ?error_loc:Loc.t -> t -> string -> t val relative : ?error_loc:Usexp.Loc.t -> t -> string -> t
(** Create an external path. If the argument is relative, assume it is (** Create an external path. If the argument is relative, assume it is
relative to the initial directory jbuilder was launched in. *) relative to the initial directory jbuilder was launched in. *)
val absolute : string -> t val absolute : string -> t
(** Convert a path to an absolute filename. Must be called after the (** Convert a path to an absolute filename. Must be called after the workspace
workspace root has been set. *) root has been set. [root] is the root directory of local paths *)
val to_absolute_filename : t -> string val to_absolute_filename : t -> root:string -> string
val reach : t -> from:t -> string val reach : t -> from:t -> string
val reach_for_running : t -> from:t -> string val reach_for_running : t -> from:t -> string
@ -147,4 +145,4 @@ val extension : t -> string
*) *)
val drop_prefix : t -> prefix:t -> string option val drop_prefix : t -> prefix:t -> string option
val pp : t Fmt.t val pp : Format.formatter -> t -> unit

View File

@ -19,6 +19,7 @@ module Staged = Staged
module String = String module String = String
module Char = Char module Char = Char
module Sexp = Sexp module Sexp = Sexp
module Path = Path
external reraise : exn -> _ = "%reraise" external reraise : exn -> _ = "%reraise"

View File

@ -11,7 +11,8 @@ let pp_ml fmt include_dirs =
let pp_include fmt = let pp_include fmt =
let pp_sep fmt () = Format.fprintf fmt "@ ; " in let pp_sep fmt () = Format.fprintf fmt "@ ; " in
Format.pp_print_list ~pp_sep (fun fmt p -> Format.pp_print_list ~pp_sep (fun fmt p ->
Format.fprintf fmt "%S" (Path.to_absolute_filename p) Format.fprintf fmt "%S" (Path.to_absolute_filename p
~root:!Clflags.workspace_root)
) fmt ) fmt
in in
Format.fprintf fmt "@[<v 2>Clflags.include_dirs :=@ [ %a@ ]@];@." Format.fprintf fmt "@[<v 2>Clflags.include_dirs :=@ [ %a@ ]@];@."

View File

@ -1,5 +1,7 @@
(** Utop rules *) (** Utop rules *)
open Stdune
val utop_exe : Path.t -> Path.t val utop_exe : Path.t -> Path.t
(** Return the path of the utop bytecode binary inside a directory where (** Return the path of the utop bytecode binary inside a directory where
some libraries are defined. *) some libraries are defined. *)

View File

@ -12,7 +12,7 @@ let infer (a : Action.t) =
(List.map (Path.Set.to_list x.deps) ~f:Path.to_string, (List.map (Path.Set.to_list x.deps) ~f:Path.to_string,
List.map (Path.Set.to_list x.targets) ~f:Path.to_string) List.map (Path.Set.to_list x.targets) ~f:Path.to_string)
[%%expect{| [%%expect{|
val p : ?error_loc:Jbuilder.Loc.t -> string -> Jbuilder.Path.t = <fun> val p : ?error_loc:Usexp.Loc.t -> string -> Jbuilder.Import.Path.t = <fun>
val infer : Jbuilder.Action.t -> string list * string list = <fun> val infer : Jbuilder.Action.t -> string list * string list = <fun>
|}] |}]

View File

@ -8,44 +8,44 @@ let r = Path.(relative root);;
Path.(let p = relative root "foo" in descendant p ~of_:p) Path.(let p = relative root "foo" in descendant p ~of_:p)
[%%expect{| [%%expect{|
val r : string -> Jbuilder.Path.t = <fun> val r : string -> Jbuilder.Import.Path.t = <fun>
- : Jbuilder.Path.t option = Some foo - : Jbuilder.Import.Path.t option = Some foo
|}] |}]
(* different strings but same length *) (* different strings but same length *)
Path.(descendant (relative root "foo") ~of_:(relative root "bar")) Path.(descendant (relative root "foo") ~of_:(relative root "bar"))
[%%expect{| [%%expect{|
- : Jbuilder.Path.t option = None - : Jbuilder.Import.Path.t option = None
|}] |}]
Path.(descendant (r "foo") ~of_:(r "foo/")) Path.(descendant (r "foo") ~of_:(r "foo/"))
[%%expect{| [%%expect{|
- : Jbuilder.Path.t option = Some foo - : Jbuilder.Import.Path.t option = Some foo
|}] |}]
Path.(descendant (r "foo/") ~of_:(r "foo")) Path.(descendant (r "foo/") ~of_:(r "foo"))
[%%expect{| [%%expect{|
- : Jbuilder.Path.t option = Some foo - : Jbuilder.Import.Path.t option = Some foo
|}] |}]
Path.(descendant (r "foo/bar") ~of_:(r "foo")) Path.(descendant (r "foo/bar") ~of_:(r "foo"))
[%%expect{| [%%expect{|
- : Jbuilder.Path.t option = Some bar - : Jbuilder.Import.Path.t option = Some bar
|}] |}]
Path.(descendant Path.root ~of_:(r "foo")) Path.(descendant Path.root ~of_:(r "foo"))
[%%expect{| [%%expect{|
- : Jbuilder.Path.t option = None - : Jbuilder.Import.Path.t option = None
|}] |}]
Path.(descendant Path.root ~of_:Path.root) Path.(descendant Path.root ~of_:Path.root)
[%%expect{| [%%expect{|
- : Jbuilder.Path.t option = Some . - : Jbuilder.Import.Path.t option = Some .
|}] |}]
Path.(descendant (r "foo") ~of_:Path.root) Path.(descendant (r "foo") ~of_:Path.root)
[%%expect{| [%%expect{|
- : Jbuilder.Path.t option = Some foo - : Jbuilder.Import.Path.t option = Some foo
|}] |}]
Path.explode (Path.of_string "a/b/c"); Path.explode (Path.of_string "a/b/c");