dune/src/ocaml_flags.ml

95 lines
2.2 KiB
OCaml

open Import
open Build.O
let default_ocamlc_flags = Utils.g
let default_ocamlopt_flags = Utils.g
let dev_mode_warnings =
"@a" ^
String.concat ~sep:""
(List.map ~f:(sprintf "-%d")
[ 4
; 29
; 40
; 41
; 42
; 44
; 45
; 48
; 58
; 59
; 60
])
let default_flags ~profile =
if profile = "dev" then
[ "-w"; dev_mode_warnings ^ !Clflags.warnings
; "-strict-sequence"
; "-strict-formats"
; "-short-paths"
; "-keep-locs"
]
else
[ "-w"; !Clflags.warnings ]
type t =
{ common : (unit, string list) Build.t
; specific : (unit, string list) Build.t Mode.Dict.t
}
let empty =
let build = Build.arr (fun () -> []) in
{ common = build
; specific = Mode.Dict.make_both build
}
let of_list l =
{ empty with common = Build.arr (fun () -> l) }
let default ~profile =
{ common = Build.return (default_flags ~profile)
; specific =
{ byte = Build.return (default_ocamlc_flags ())
; native = Build.return (default_ocamlopt_flags ())
}
}
let make ~flags ~ocamlc_flags ~ocamlopt_flags ~default ~eval =
let f name x standard =
Build.memoize name
(if Ordered_set_lang.Unexpanded.has_special_forms x then
eval x ~standard
else
eval x ~standard:(Build.return []))
in
{ common = f "common flags" flags default.common
; specific =
{ byte = f "ocamlc flags" ocamlc_flags default.specific.byte
; native = f "ocamlopt flags" ocamlopt_flags default.specific.native
}
}
let get t mode =
t.common
&&&
(Mode.Dict.get t.specific mode)
>>^ fun (common, specific) ->
common @ specific
let get_for_cm t ~cm_kind = get t (Mode.of_cm_kind cm_kind)
let append_common t flags = {t with common = t.common >>^ fun l -> l @ flags}
let prepend_common flags t = {t with common = t.common >>^ fun l -> flags @ l}
let common t = t.common
let dump t =
Build.fanout3 t.common t.specific.byte t.specific.native
>>^ fun (common, byte, native) ->
List.map ~f:Sexp.To_sexp.(pair string (list string))
[ "flags" , common
; "ocamlc_flags" , byte
; "ocamlopt_flags" , native
]