diff --git a/doc/manual.org b/doc/manual.org index 95e9cb4a..d0201c83 100644 --- a/doc/manual.org +++ b/doc/manual.org @@ -376,6 +376,9 @@ run. - =(preprocess )= is the same as the =(preprocess ...)= field of [[library][libraries]] +- =(preprocessor_deps ())= is the same as the + =(preprocessor_deps ...)= field of [[library][libraries]] + - =flags=, =ocamlc_flags= and =ocamlopt_flags=. See the [[OCaml flags][section about specifying OCaml flags]] diff --git a/src/gen_rules.ml b/src/gen_rules.ml index 76064020..782cdbff 100644 --- a/src/gen_rules.ml +++ b/src/gen_rules.ml @@ -38,7 +38,7 @@ module Ocaml_flags = struct let get_for_cm t ~cm_kind = get t (Mode.of_cm_kind cm_kind) - let default = make (Sexp.Of_sexp.record Buildable.t (List [])) + let default = make (Sexp.Of_sexp.record Buildable.v1 (List [])) end let default_c_flags = g () diff --git a/src/jbuild_load.ml b/src/jbuild_load.ml index f54ade3a..d7dd689b 100644 --- a/src/jbuild_load.ml +++ b/src/jbuild_load.ml @@ -9,7 +9,7 @@ type conf = } let load ~dir ~visible_packages = - let stanzas = Sexp_load.many (Path.relative dir "jbuild" |> Path.to_string) Stanza.t in + let stanzas = Sexp_load.many (Path.relative dir "jbuild" |> Path.to_string) Stanza.vjs in let stanzas = Stanza.resolve_packages stanzas ~dir ~visible_packages in (dir, stanzas) diff --git a/src/jbuild_types.ml b/src/jbuild_types.ml index 44ea858d..2b323cdb 100644 --- a/src/jbuild_types.ml +++ b/src/jbuild_types.ml @@ -1,6 +1,13 @@ open Import open Sexp.Of_sexp +(* This file defines the jbuild types as well as the S-expression syntax for the various + supported version of the specification. + + [vN] is for the version [N] of the specification and [vjs] is for the rolling + [jane_street] version. When they are all the same, sexp parsers are just named [t]. +*) + type sexp = Sexp.t = Atom of string | List of sexp list let of_sexp_error = Sexp.of_sexp_error @@ -373,7 +380,7 @@ module Buildable = struct ; ocamlopt_flags : Ordered_set_lang.t } - let t = + let common = field "preprocess" Preprocess_map.t ~default:Preprocess_map.default >>= fun preprocess -> field "preprocessor_deps" (list Dep_conf.t) ~default:[] @@ -381,25 +388,11 @@ module Buildable = struct field "modules" (fun s -> Ordered_set_lang.(map (t s)) ~f:String.capitalize_ascii) ~default:Ordered_set_lang.standard >>= fun modules -> - field "extra_disabled_warnings" (list int) ~default:[] - >>= fun extra_disabled_warnings -> field "libraries" (list Lib_dep.t) ~default:[] >>= fun libraries -> field_osl "flags" >>= fun flags -> field_osl "ocamlc_flags" >>= fun ocamlc_flags -> field_osl "ocamlopt_flags" >>= fun ocamlopt_flags -> - let flags = - if Ordered_set_lang.is_standard flags && extra_disabled_warnings <> [] then - Ordered_set_lang.append flags - (Ordered_set_lang.t - (List [ Atom "-w" - ; Atom - (String.concat ~sep:"" - (List.map extra_disabled_warnings ~f:(sprintf "-%d"))) - ])) - else - flags - in return { preprocess ; preprocessor_deps @@ -409,6 +402,29 @@ module Buildable = struct ; ocamlc_flags ; ocamlopt_flags } + + let v1 = common + + let vjs = + common >>= fun t -> + field "extra_disabled_warnings" (list int) ~default:[] + >>= fun extra_disabled_warnings -> + let t = + if Ordered_set_lang.is_standard t.flags && extra_disabled_warnings <> [] then + let flags = + Ordered_set_lang.append t.flags + (Ordered_set_lang.t + (List [ Atom "-w" + ; Atom + (String.concat ~sep:"" + (List.map extra_disabled_warnings ~f:(sprintf "-%d"))) + ])) + in + { t with flags } + else + t + in + return t end module Library = struct @@ -449,10 +465,53 @@ module Library = struct ; buildable : Buildable.t } - let t = + let v1 = + record + (Buildable.v1 >>= fun buildable -> + field "name" library_name >>= fun name -> + field_o "public_name" string >>= fun public_name -> + field_o "synopsis" string >>= fun synopsis -> + field "install_c_headers" (list string) ~default:[] >>= fun install_c_headers -> + field "ppx_runtime_libraries" (list string) ~default:[] >>= fun ppx_runtime_libraries -> + field_oslu "c_flags" >>= fun c_flags -> + field_oslu "cxx_flags" >>= fun cxx_flags -> + field "c_names" (list string) ~default:[] >>= fun c_names -> + field "cxx_names" (list string) ~default:[] >>= fun cxx_names -> + field "library_flags" (list String_with_vars.t) ~default:[] >>= fun library_flags -> + field_oslu "c_library_flags" >>= fun c_library_flags -> + field_o "js_of_ocaml" Js_of_ocaml.t >>= fun js_of_ocaml -> + field "virtual_deps" (list string) ~default:[] >>= fun virtual_deps -> + field "modes" (list Mode.t) ~default:Mode.all >>= fun modes -> + field "kind" Kind.t ~default:Kind.Normal >>= fun kind -> + field "wrapped" bool ~default:true >>= fun wrapped -> + field_b "optional" >>= fun optional -> + return + { name + ; public_name + ; synopsis + ; install_c_headers + ; ppx_runtime_libraries + ; modes + ; kind + ; c_names + ; c_flags + ; cxx_names + ; cxx_flags + ; includes = [] + ; library_flags + ; c_library_flags + ; self_build_stubs_archive = None + ; js_of_ocaml + ; virtual_deps + ; wrapped + ; optional + ; buildable + }) + + let vjs = record (ignore_fields ["inline_tests"; "skip_from_default"; "lint"] >>= fun () -> - Buildable.t >>= fun buildable -> + Buildable.vjs >>= fun buildable -> field "name" library_name >>= fun name -> field_o "public_name" string >>= fun public_name -> field_o "synopsis" string >>= fun synopsis -> @@ -522,12 +581,29 @@ module Executables = struct ; buildable : Buildable.t } - let t = + let v1 = + record + (Buildable.v1 >>= fun buildable -> + field "names" (list string) >>= fun names -> + field_o "object_public_name" string >>= fun object_public_name -> + field_o "synopsis" string >>= fun synopsis -> + field "link_executables" bool ~default:true >>= fun link_executables -> + field "link_flags" (list string) ~default:[] >>= fun link_flags -> + return + { names + ; object_public_name + ; synopsis + ; link_executables + ; link_flags + ; buildable + }) + + let vjs = record (ignore_fields ["js_of_ocaml"; "only_shared_object"; "review_help"; "skip_from_default"] >>= fun () -> - Buildable.t >>= fun buildable -> + Buildable.vjs >>= fun buildable -> field "names" (list string) >>= fun names -> field_o "object_public_name" string >>= fun object_public_name -> field_o "synopsis" string >>= fun synopsis -> @@ -550,25 +626,32 @@ module Rule = struct ; action : User_action.Unexpanded.t } - let t = + let common = + field "targets" (list file_in_current_dir) >>= fun targets -> + field "deps" (list Dep_conf.t) >>= fun deps -> + field "action" User_action.Unexpanded.t >>= fun action -> + return { targets; deps; action } + + let v1 = record common + + let vjs = record (ignore_fields ["sandbox"] >>= fun () -> - field "targets" (list file_in_current_dir) >>= fun targets -> - field "deps" (list Dep_conf.t) >>= fun deps -> - field "action" User_action.Unexpanded.t >>= fun action -> - return { targets; deps; action }) + common) end module Ocamllex = struct type t = { names : string list } - let t sexp = { names = list string sexp } + let v1 sexp = { names = list string sexp } + let vjs = v1 end module Ocamlyacc = struct type t = { names : string list } - let t sexp = { names = list string sexp } + let v1 sexp = { names = list string sexp } + let vjs = v1 end module Provides = struct @@ -577,7 +660,7 @@ module Provides = struct ; file : string } - let t sexp = + let v1 sexp = match sexp with | Atom s -> { name = s @@ -592,6 +675,8 @@ module Provides = struct } | sexp -> of_sexp_error "[] or [ (file )] expected" sexp + + let vjs = v1 end module Install_conf = struct @@ -615,7 +700,7 @@ module Install_conf = struct ; package : string option } - let t = + let v1 = record (field "section" Install.Section.t >>= fun section -> field "files" (list file) >>= fun files -> @@ -625,6 +710,8 @@ module Install_conf = struct ; files ; package }) + + let vjs = v1 end module Alias_conf = struct @@ -634,17 +721,22 @@ module Alias_conf = struct ; action : User_action.Unexpanded.t option } - let t = + let common = + field "name" string >>= fun name -> + field "deps" (list Dep_conf.t) ~default:[] >>= fun deps -> + field_o "action" User_action.Unexpanded.t >>= fun action -> + return + { name + ; deps + ; action + } + + let v1 = record common + + let vjs = record (ignore_fields ["sandbox"] >>= fun () -> - field "name" string >>= fun name -> - field "deps" (list Dep_conf.t) ~default:[] >>= fun deps -> - field_o "action" User_action.Unexpanded.t >>= fun action -> - return - { name - ; deps - ; action - }) + common) end module Stanza = struct @@ -659,16 +751,28 @@ module Stanza = struct | Alias of Alias_conf.t | Other - let t = + let v1 = sum - [ cstr "library" [Library.t] (fun x -> Library x) - ; cstr "executables" [Executables.t] (fun x -> Executables x) - ; cstr "rule" [Rule.t] (fun x -> Rule x) - ; cstr "ocamllex" [Ocamllex.t] (fun x -> Ocamllex x) - ; cstr "ocamlyacc" [Ocamlyacc.t] (fun x -> Ocamlyacc x) - ; cstr "provides" [Provides.t] (fun x -> Provides x) - ; cstr "install" [Install_conf.t] (fun x -> Install x) - ; cstr "alias" [Alias_conf.t] (fun x -> Alias x) + [ cstr "library" [Library.v1] (fun x -> Library x) + ; cstr "executables" [Executables.v1] (fun x -> Executables x) + ; cstr "rule" [Rule.v1] (fun x -> Rule x) + ; cstr "ocamllex" [Ocamllex.v1] (fun x -> Ocamllex x) + ; cstr "ocamlyacc" [Ocamlyacc.v1] (fun x -> Ocamlyacc x) + ; cstr "provides" [Provides.v1] (fun x -> Provides x) + ; cstr "install" [Install_conf.v1] (fun x -> Install x) + ; cstr "alias" [Alias_conf.v1] (fun x -> Alias x) + ] + + let vjs = + sum + [ cstr "library" [Library.vjs] (fun x -> Library x) + ; cstr "executables" [Executables.vjs] (fun x -> Executables x) + ; cstr "rule" [Rule.vjs] (fun x -> Rule x) + ; cstr "ocamllex" [Ocamllex.vjs] (fun x -> Ocamllex x) + ; cstr "ocamlyacc" [Ocamlyacc.vjs] (fun x -> Ocamlyacc x) + ; cstr "provides" [Provides.vjs] (fun x -> Provides x) + ; cstr "install" [Install_conf.vjs] (fun x -> Install x) + ; cstr "alias" [Alias_conf.vjs] (fun x -> Alias x) ; cstr "enforce_style" [fun _ -> ()] (fun _ -> Other ) ; cstr "toplevel_expect_tests" [fun _ -> ()] (fun _ -> Other) ; cstr "unified_tests" [fun _ -> ()] (fun _ -> Other)