Merge branch 'master' into update-CHANGES

This commit is contained in:
Rudi Grinberg 2018-07-09 16:11:16 +07:00 committed by GitHub
commit 7375380913
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 113 additions and 36 deletions

View File

@ -61,6 +61,24 @@ module Temp = struct
dir dir
end end
module Flags = struct
let extract_words = String.extract_words
let extract_comma_space_separated_words =
String.extract_comma_space_separated_words
let extract_blank_separated_words = String.extract_blank_separated_words
let write_lines fname s =
let path = Path.of_string fname in
Io.write_lines path s
let write_sexp fname s =
let path = Path.in_source fname in
let sexp = Usexp.List (List.map s ~f:(fun s -> Usexp.Quoted_string s)) in
Io.write_file path (Usexp.to_string sexp ~syntax:Dune)
end
module Find_in_path = struct module Find_in_path = struct
let path_sep = let path_sep =
if Sys.win32 then if Sys.win32 then
@ -485,18 +503,13 @@ module Pkg_config = struct
None None
end end
let write_flags fname s =
let path = Path.in_source fname in
let sexp = Usexp.List (List.map s ~f:(fun s -> Usexp.Quoted_string s)) in
Io.write_file path (Usexp.to_string sexp ~syntax:Dune)
let main ?(args=[]) ~name f = let main ?(args=[]) ~name f =
let ocamlc = ref ( let ocamlc = ref (
match Sys.getenv "DUNE_CONFIGURATOR" with match Sys.getenv "DUNE_CONFIGURATOR" with
| s -> Some s | s -> Some s
| exception Not_found -> | exception Not_found ->
die "Configurator scripts must be ran with jbuilder. \ die "Configurator scripts must be run with Dune. \
To manually run a script, use $ jbuilder exec." To manually run a script, use $ dune exec."
) in ) in
let verbose = ref false in let verbose = ref false in
let dest_dir = ref None in let dest_dir = ref None in

View File

@ -87,10 +87,32 @@ module Pkg_config : sig
val query : t -> package:string -> package_conf option val query : t -> package:string -> package_conf option
end with type configurator := t end with type configurator := t
val write_flags : string -> string list -> unit module Flags : sig
(** [write_flags fname s] write the list of strings [s] to the file
[fname] in an appropriate format so that it can used in jbuild val write_sexp : string -> string list -> unit
files with "(:include [fname])". *) (** [write_sexp fname s] writes the list of strings [s] to the file [fname] in
an appropriate format so that it can used in jbuild files with [(:include
[fname])]. *)
val write_lines : string -> string list -> unit
(** [write_lines fname s] writes the list of string [s] to the file [fname]
with one line per string so that it can be used in Dune action rules with
[%{read-lines:<path>}]. *)
val extract_comma_space_separated_words : string -> string list
(** [extract_comma_space_separated_words s] returns a list of words in
[s] that are separated by a newline, tab, space or comma character. *)
val extract_blank_separated_words : string -> string list
(** [extract_blank_separated_words s] returns a list of words in [s]
that are separated by a tab or space character. *)
val extract_words : string -> is_word_char:(char -> bool) -> string list
(** [extract_words s ~is_word_char] will split the string [s] into
a list of words. A valid word character is defined by the [is_word_char]
predicate returning true and anything else is considered a separator.
Any blank words are filtered out of the results. *)
end
(** Typical entry point for configurator programs *) (** Typical entry point for configurator programs *)
val main val main

View File

@ -30,6 +30,7 @@ module Macro = struct
| Read_strings | Read_strings
| Read_lines | Read_lines
| Path_no_dep | Path_no_dep
| Ocaml_config
end end
type 'a t = type 'a t =
@ -77,6 +78,7 @@ module Map = struct
; "findlib", renamed_in ~version:(1, 0) ~new_name:"lib" ; "findlib", renamed_in ~version:(1, 0) ~new_name:"lib"
; "path-no-dep", deleted_in ~version:(1, 0) Path_no_dep ; "path-no-dep", deleted_in ~version:(1, 0) Path_no_dep
; "ocaml-config", macro Ocaml_config
] ]
|> String.Map.of_list_exn |> String.Map.of_list_exn
@ -126,18 +128,7 @@ module Map = struct
; "profile" , string context.profile ; "profile" , string context.profile
] ]
in in
let ocaml_config = [ static_vars
List.map (Ocaml_config.to_list context.ocaml_config) ~f:(fun (k, v) ->
("ocaml-config:" ^ k,
match (v : Ocaml_config.Value.t) with
| Bool x -> string (string_of_bool x)
| Int x -> string (string_of_int x)
| String x -> string x
| Words x -> strings x
| Prog_and_args x -> strings (x.prog :: x.args)))
in
[ ocaml_config
; static_vars
; lowercased ; lowercased
; uppercased ; uppercased
; vars ; vars

View File

@ -22,6 +22,7 @@ module Macro : sig
| Read_strings | Read_strings
| Read_lines | Read_lines
| Path_no_dep | Path_no_dep
| Ocaml_config
end end
type 'a t = type 'a t =

View File

@ -47,6 +47,7 @@ type t =
; cxx_flags : string list ; cxx_flags : string list
; vars : Pform.Var.t Pform.Map.t ; vars : Pform.Var.t Pform.Map.t
; macros : Pform.Macro.t Pform.Map.t ; macros : Pform.Macro.t Pform.Map.t
; ocaml_config : Value.t list String.Map.t
; chdir : (Action.t, Action.t) Build.t ; chdir : (Action.t, Action.t) Build.t
; host : t option ; host : t option
; libs_by_package : (Package.t * Lib.Set.t) Package.Name.Map.t ; libs_by_package : (Package.t * Lib.Set.t) Package.Name.Map.t
@ -99,20 +100,36 @@ let expand_macro t ~syntax_version ~var =
Exn.code_error "expand_macro can't expand variables" Exn.code_error "expand_macro can't expand variables"
[ "var", String_with_vars.Var.sexp_of_t var ] [ "var", String_with_vars.Var.sexp_of_t var ]
let expand t ~syntax_version ~var =
match
match String_with_vars.Var.destruct var with
| Var _ -> Left (expand_vars t ~syntax_version ~var)
| Macro (_, _) -> Right (expand_macro t ~syntax_version ~var)
with
| Right None
| Left None -> None
| Right (Some x) -> Some (Right x)
| Left (Some x) -> Some (Left x)
let (expand_vars_string, expand_vars_path) = let (expand_vars_string, expand_vars_path) =
let expand t ~scope ~dir ?(extra_vars=String.Map.empty) s = let expand t ~scope ~dir ?(extra_vars=String.Map.empty) s =
String_with_vars.expand ~mode:Single ~dir s ~f:(fun var syntax_version -> String_with_vars.expand ~mode:Single ~dir s ~f:(fun var syntax_version ->
match expand_vars t ~syntax_version ~var with match expand t ~syntax_version ~var with
| None -> | None ->
String.Map.find extra_vars (String_with_vars.Var.full_name var) String.Map.find extra_vars (String_with_vars.Var.full_name var)
| Some v -> | Some (Left v) ->
begin match Pform.Var.to_value_no_deps_or_targets ~scope v with begin match Pform.Var.to_value_no_deps_or_targets ~scope v with
| Some _ as v -> v | Some _ as v -> v
| None -> | None ->
Loc.fail (String_with_vars.Var.loc var) Loc.fail (String_with_vars.Var.loc var)
"Variable %a is not allowed in this context" "Variable %a is not allowed in this context"
String_with_vars.Var.pp var String_with_vars.Var.pp var
end) end
| Some (Right Ocaml_config) ->
String.Map.find t.ocaml_config (String_with_vars.Var.name var)
| Some (Right _) ->
Loc.fail (String_with_vars.Var.loc var)
"This percent form isn't allowed in this position")
in in
let expand_vars t ~scope ~dir ?extra_vars s = let expand_vars t ~scope ~dir ?extra_vars s =
expand t ~scope ~dir ?extra_vars s expand t ~scope ~dir ?extra_vars s
@ -290,6 +307,19 @@ let create
~f:(fun s -> not (String.is_prefix s ~prefix:"-std=")) ~f:(fun s -> not (String.is_prefix s ~prefix:"-std="))
in in
let vars = Pform.Map.create_vars ~context ~cxx_flags in let vars = Pform.Map.create_vars ~context ~cxx_flags in
let ocaml_config =
let string s = [Value.String s] in
Ocaml_config.to_list context.ocaml_config
|> List.map ~f:(fun (k, v) ->
( k
, match (v : Ocaml_config.Value.t) with
| Bool x -> string (string_of_bool x)
| Int x -> string (string_of_int x)
| String x -> string x
| Words x -> Value.L.strings x
| Prog_and_args x -> Value.L.strings (x.prog :: x.args)))
|> String.Map.of_list_exn
in
let t = let t =
{ context { context
; host ; host
@ -305,6 +335,7 @@ let create
; cxx_flags ; cxx_flags
; vars ; vars
; macros = Pform.Map.macros ; macros = Pform.Map.macros
; ocaml_config
; chdir = Build.arr (fun (action : Action.t) -> ; chdir = Build.arr (fun (action : Action.t) ->
match action with match action with
| Chdir _ -> action | Chdir _ -> action
@ -545,11 +576,11 @@ module Action = struct
type resolved_forms = type resolved_forms =
{ (* Failed resolutions *) { (* Failed resolutions *)
mutable failures : fail list mutable failures : fail list
; (* All "name" for ${lib:name:...}/${lib-available:name} forms *) ; (* All "name" for %{lib:name:...}/%{lib-available:name} forms *)
mutable lib_deps : Build.lib_deps mutable lib_deps : Build.lib_deps
; (* Static deps from ${...} variables. For instance ${exe:...} *) ; (* Static deps from %{...} variables. For instance %{exe:...} *)
mutable sdeps : Path.Set.t mutable sdeps : Path.Set.t
; (* Dynamic deps from ${...} variables. For instance ${read:...} *) ; (* Dynamic deps from %{...} variables. For instance %{read:...} *)
mutable ddeps : (unit, Value.t list) Build.t String.Map.t mutable ddeps : (unit, Value.t list) Build.t String.Map.t
} }
@ -580,7 +611,7 @@ module Action = struct
let parse_lib_file ~loc s = let parse_lib_file ~loc s =
match String.lsplit2 s ~on:':' with match String.lsplit2 s ~on:':' with
| None -> | None ->
Loc.fail loc "invalid ${lib:...} form: %s" s Loc.fail loc "invalid %%{lib:...} form: %s" s
| Some x -> x | Some x -> x
let expand_step1 sctx ~dir ~dep_kind ~scope ~targets_written_by_user let expand_step1 sctx ~dir ~dep_kind ~scope ~targets_written_by_user
@ -597,6 +628,7 @@ module Action = struct
let key = String_with_vars.Var.full_name var in let key = String_with_vars.Var.full_name var in
begin match expand_macro sctx ~syntax_version ~var with begin match expand_macro sctx ~syntax_version ~var with
| Some Pform.Macro.Exe -> Some (path_exp (map_exe (Path.relative dir s))) | Some Pform.Macro.Exe -> Some (path_exp (map_exe (Path.relative dir s)))
| Some Ocaml_config -> String.Map.find sctx.ocaml_config s
| Some Dep -> Some (path_exp (Path.relative dir s)) | Some Dep -> Some (path_exp (Path.relative dir s))
| Some Bin -> begin | Some Bin -> begin
let sctx = host sctx in let sctx = host sctx in
@ -773,7 +805,7 @@ module Action = struct
It's likely that what we get here is what the user thinks It's likely that what we get here is what the user thinks
of as temporary files, even though they might conflict with of as temporary files, even though they might conflict with
actual targets. We need to tell jbuilder about such things, actual targets. We need to tell dune about such things,
so that it can report better errors. so that it can report better errors.
{[ {[
@ -798,7 +830,7 @@ module Action = struct
if Path.parent_exn target <> dir then if Path.parent_exn target <> dir then
Loc.fail loc Loc.fail loc
"This action has targets in a different directory than the current \ "This action has targets in a different directory than the current \
one, this is not allowed by Jbuilder at the moment:\n%s" one, this is not allowed by dune at the moment:\n%s"
(List.map targets ~f:(fun target -> (List.map targets ~f:(fun target ->
sprintf "- %s" (Utils.describe_target target)) sprintf "- %s" (Utils.describe_target target))
|> String.concat ~sep:"\n")); |> String.concat ~sep:"\n"));

View File

@ -436,6 +436,14 @@
test-cases/null-dep test-cases/null-dep
(progn (run %{exe:cram.exe} -test run.t) (diff? run.t run.t.corrected))))) (progn (run %{exe:cram.exe} -test run.t) (diff? run.t run.t.corrected)))))
(alias
(name ocaml-config-macro)
(deps (package dune) (source_tree test-cases/ocaml-config-macro))
(action
(chdir
test-cases/ocaml-config-macro
(progn (run %{exe:cram.exe} -test run.t) (diff? run.t run.t.corrected)))))
(alias (alias
(name ocaml-syntax) (name ocaml-syntax)
(deps (package dune) (source_tree test-cases/ocaml-syntax)) (deps (package dune) (source_tree test-cases/ocaml-syntax))
@ -698,6 +706,7 @@
(alias multiple-private-libs) (alias multiple-private-libs)
(alias no-installable-mode) (alias no-installable-mode)
(alias null-dep) (alias null-dep)
(alias ocaml-config-macro)
(alias ocaml-syntax) (alias ocaml-syntax)
(alias ocamldep-multi-stanzas) (alias ocamldep-multi-stanzas)
(alias odoc) (alias odoc)
@ -773,6 +782,7 @@
(alias misc) (alias misc)
(alias no-installable-mode) (alias no-installable-mode)
(alias null-dep) (alias null-dep)
(alias ocaml-config-macro)
(alias ocaml-syntax) (alias ocaml-syntax)
(alias ocamldep-multi-stanzas) (alias ocamldep-multi-stanzas)
(alias output-obj) (alias output-obj)

View File

@ -4,5 +4,5 @@ inappropariate place:
$ dune build $ dune build
Info: creating file dune-project with this contents: (lang dune 1.0) Info: creating file dune-project with this contents: (lang dune 1.0)
File "dune", line 1, characters 14-21: File "dune", line 1, characters 14-21:
Error: macros of the form %{name:..} cannot be expanded here Error: This percent form isn't allowed in this position
[1] [1]

View File

@ -0,0 +1,3 @@
(rule
(targets x)
(action (with-stdout-to %{targets} (echo %{ocaml-config:system}))))

View File

@ -0,0 +1 @@
(lang dune 1.0)

View File

@ -0,0 +1,4 @@
%{ocaml-config:...} macros should be available. we don't print anything because
the values are all platform specific.
$ dune build

View File

@ -21,19 +21,19 @@
(rule (rule
(targets static.exe) (targets static.exe)
(deps test.exe%{ext_obj} static.c) (deps test.exe%{ext_obj} static.c)
(action (run %{CC} -o %{targets} -I %{ocaml_where} -I . %{deps} (action (run %{cc} -o %{targets} -I %{ocaml_where} -I . %{deps}
%{ocaml-config:native_c_libraries}))) %{ocaml-config:native_c_libraries})))
(rule (rule
(targets static.bc) (targets static.bc)
(deps test.bc%{ext_obj} static.c) (deps test.bc%{ext_obj} static.c)
(action (run %{CC} -o %{targets} -I %{ocaml_where} -I . %{deps} (action (run %{cc} -o %{targets} -I %{ocaml_where} -I . %{deps}
%{ocaml-config:bytecomp_c_libraries}))) %{ocaml-config:bytecomp_c_libraries})))
(rule (rule
(targets dynamic.exe) (targets dynamic.exe)
(deps dynamic.c) (deps dynamic.c)
(action (run %{CC} -o %{targets} %{first-dep} %{ocaml-config:native_c_libraries}))) (action (run %{cc} -o %{targets} %{first-dep} %{ocaml-config:native_c_libraries})))
(alias (alias
(name runtest) (name runtest)