Skip to content

Commit ff31b91

Browse files
committed
refactor: ocamlobjinfo can parse more than one file
Signed-off-by: Rudi Grinberg <[email protected]>
1 parent 26ebc6d commit ff31b91

File tree

4 files changed

+191
-150
lines changed

4 files changed

+191
-150
lines changed

src/dune_rules/dep_rules.ml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ let ooi_deps
3636
let ctx = Super_context.context sctx in
3737
Context.ocaml ctx
3838
in
39-
Ocamlobjinfo.rules ocaml ~sandbox ~dir ~unit
39+
Ocamlobjinfo.rules ocaml ~sandbox ~dir ~units:[ unit ]
40+
|> Action_builder.map ~f:(function
41+
| [ x ] -> x
42+
| [] | _ :: _ -> assert false)
4043
in
4144
let add_rule = Super_context.add_rule sctx ~dir in
4245
let read =

src/dune_rules/ocamlobjinfo.mli

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ val rules
1010
: Ocaml_toolchain.t
1111
-> dir:Path.Build.t
1212
-> sandbox:Sandbox_config.t option
13-
-> unit:Path.t
14-
-> t Action_builder.t
13+
-> units:Path.t list
14+
-> t list Action_builder.t
1515

1616
(** For testing only *)
17-
val parse : string -> t
17+
val parse : string -> t list

src/dune_rules/ocamlobjinfo.mll

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,25 @@ let ws = [' ' '\t']+
2222
let hash = ['0'-'9' 'a'-'z' '-']+
2323
let name = ['A'-'Z'] ['A'-'Z' 'a'-'z' '0'-'9' '_']*
2424

25-
rule ocamlobjinfo acc = parse
26-
| "Interfaces imported:" newline { intfs acc lexbuf }
27-
| "Implementations imported:" newline { impls acc lexbuf }
28-
| _ { ocamlobjinfo acc lexbuf }
29-
| eof { acc }
30-
and intfs acc = parse
31-
| ws hash ws (name as name) newline { intfs (add_intf acc name) lexbuf }
32-
| "Implementations imported:" newline { impls acc lexbuf }
33-
| _ | eof { acc }
34-
and impls acc = parse
35-
| ws hash ws (name as name) newline { impls (add_impl acc name) lexbuf }
36-
| _ | eof { acc }
25+
rule ocamlobjinfo acc_units acc = parse
26+
| "Interfaces imported:" newline { intfs acc_units acc lexbuf }
27+
| "Implementations imported:" newline { impls acc_units acc lexbuf }
28+
| _ { ocamlobjinfo acc_units acc lexbuf }
29+
| eof { acc :: acc_units }
30+
and intfs acc_units acc = parse
31+
| ws hash ws (name as name) newline { intfs acc_units (add_intf acc name) lexbuf }
32+
| "Implementations imported:" newline { impls acc_units acc lexbuf }
33+
| "File " [^ '\n']+ newline { ocamlobjinfo (acc :: acc_units) empty lexbuf }
34+
| _ | eof { acc :: acc_units }
35+
and impls acc_units acc = parse
36+
| ws hash ws (name as name) newline { impls acc_units (add_impl acc name) lexbuf }
37+
| "File " [^ '\n']+ newline { ocamlobjinfo (acc :: acc_units) empty lexbuf }
38+
| _ | eof { acc :: acc_units }
3739

3840
{
39-
let parse s = ocamlobjinfo empty (Lexing.from_string s)
41+
let parse s = Lexing.from_string s |> ocamlobjinfo [] empty |> List.rev
4042

41-
let rules (ocaml : Ocaml_toolchain.t) ~dir ~sandbox ~unit =
43+
let rules (ocaml : Ocaml_toolchain.t) ~dir ~sandbox ~units =
4244
let no_approx =
4345
if Ocaml.Version.ooi_supports_no_approx ocaml.version then
4446
[Command.Args.A "-no-approx"]
@@ -52,7 +54,9 @@ let rules (ocaml : Ocaml_toolchain.t) ~dir ~sandbox ~unit =
5254
[]
5355
in
5456
let observing_facts =
55-
Dep.Facts.singleton (Dep.file unit) (Dep.Fact.nothing)
57+
List.map units ~f:(fun unit ->
58+
Dep.Facts.singleton (Dep.file unit) (Dep.Fact.nothing))
59+
|> Dep.Facts.union_all
5660
in
5761
let open Action_builder.O in
5862
let* action =
@@ -61,7 +65,7 @@ let rules (ocaml : Ocaml_toolchain.t) ~dir ~sandbox ~unit =
6165
(List.concat
6266
[ no_approx
6367
; no_code
64-
; [ Dep unit ]
68+
; [ Deps units ]
6569
])
6670
in
6771
(Dune_engine.Build_system.execute_action_stdout

test/expect-tests/ocamlobjinfo_tests.ml

Lines changed: 164 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -6,146 +6,180 @@ let () = init ()
66

77
let fixture =
88
{ocamlobjinfo|
9-
File _build/install/default/lib/dune/_stdune/stdune__Env.cmx
10-
Name: Stdune__Env
11-
CRC of implementation: b678d7aae434ca3158721e3a37a15776
12-
Globals defined:
13-
Stdune__Env
9+
File _boot/stdune__Env.cmi
10+
Unit name: Stdune__Env
1411
Interfaces imported:
15-
053326e853ce10e1fadf8d891f08f891 Unix
16-
596c497318b5c3057b47b9d6747ef5d1 Uchar
17-
3fe6d98e0634486be22d9de07aa0709a Sys
18-
6339e2b71e8c583a81e808954faf6818 StringLabels
19-
953d4ea121ff79e9719730997e04436d Stdune__String
20-
744ae4e7c80910dd9302bf207d11274f Stdune__Sexp_intf
21-
3a8d88a2c7628492ca76328610a53b04 Stdune__Sexp
22-
788120b20799b5148dc44c2effd9db08 Stdune__Set_intf
23-
764302df6c51161e13ccc4553710003d Stdune__Set
24-
7577d25061f730d87e8e0ab574216d9c Stdune__Result
25-
4d34756156087d6e6530be0d3275bde4 Stdune__Path
26-
e8eebf0307152a528b7d97ebdf37d1dc Stdune__Ordering
27-
1fb9ae8c1fb73c55a857f02869cfbeab Stdune__Map_intf
28-
96daa1ecff8c9bc6c5aadf39201c2f0d Stdune__Map
29-
5b332ee2108ade34f2abc1448318c5a0 Stdune__Loc
30-
721c54b94b8c3b89fffc8587041c241a Stdune__List
31-
0c6e26bc5bc285a87ab7304ee5f3bf0a Stdune__Hashtbl_intf
32-
8df5a38cb2f28d4cf23f6cd8a6c4c923 Stdune__Hashtbl
33-
0ff241a400cabb742a8d681c7132c350 Stdune__Hashable
34-
b438dbe8d4c60ca1bb06d04c7bc95652 Stdune__Exn
35-
a1b4f657ccceb16196f104a53a0e199a Stdune__Env
36-
7643682d2d95acbcf8834a351a1e2779 Stdune__Either
37-
826226f09894dc48694a431d13b9e541 Stdune__Comparator
38-
69861cabc5a73becd98269ce298eaa59 Stdune__Bin
39-
cbf0ce887ccceaff96f4a22a8f057799 Stdune__Array
40-
37cf8dd4fc4be5636ff9f78604107f8b Stdune__
41-
28a12def19edf36c317c30fafcc03d6d Set
42-
e5dfd0ca6436c8abad976fc9e914999a Printf
43-
1b461321ebcc8e419f24eb531c5ac7ac Printexc
44-
9b04ecdc97e5102c1d342892ef7ad9a2 Pervasives
45-
db5fc31b815ab3040d5a9940a91712c4 MoreLabels
46-
8b8de381501aa7862270c15619322ee7 Map
47-
f4e829075d9d0bb7de979cfc49c2600b ListLabels
48-
0971650cdf1fa8e506e733e9a5da2628 Lexing
49-
0a88e320f172d3413ba0d5e0f9c70ccd Hashtbl
50-
1a17539924469551f027475153d4d3b5 Format
51-
a4afff2bf4082efda68a6a65cf31f8e2 Stdlib__Result_compat
52-
de733b926f4af640c957c8129aba4139 Stdlib__Result
53-
ba19641102c1711bdb2476bb8b8dbe32 Stdlib__
54-
7b10d1bd2d88af9c1da841149c988d94 Stdlib
55-
cd4856c93f21942683ce190142e88396 Complex
56-
79ae8c0eb753af6b441fe05456c7970b CamlinternalFormatBasics
57-
4ff98b0650eef9c38ee9c9930e0c3e9b CamlinternalBigarray
58-
9c9b3639d23d7746c571cdf04646eb29 Buffer
59-
c4974e11dd7c941c002b826edc727de8 ArrayLabels
60-
Implementations imported:
61-
e28bcdad48b0cb1739e47106149016cb Unix
62-
3c11d6a8ae012d6541b58cecff4809d5 Sys
63-
-------------------------------- Stdune__String
64-
-------------------------------- Stdune__Sexp
65-
-------------------------------- Stdune__Set
66-
-------------------------------- Stdune__Map
67-
-------------------------------- Stdune__List
68-
-------------------------------- Stdune__Exn
69-
-------------------------------- Stdune__Bin
70-
-------------------------------- Stdune__Array
71-
a3cdcb16ec3b460d51a685302e993c0b Printf
72-
Clambda approximation:
73-
_
74-
Currying functions: 3 2
75-
Apply functions: 3 2
76-
Send functions:
12+
bd468c1984f53f5b1d3dadf52a621031 Stdune__Env
13+
ba308f46e67d900971a536229f7f4173 Stdune__String
14+
421e81602ba8b4117354ae965fbcdb9b Stdune__Set_intf
15+
e71746f44d47934ce121640bcb2f82d1 Stdune__Seq
16+
d5f56ce66eefdb02b6328534c965b2a4 Stdune__Result
17+
06eac0380458db0b6b9dbf534491bb7d Stdune__Map_intf
18+
143081f49dab6fc606ae7041a2bb6ab1 Stdune__Hashtbl_intf
19+
30c8429b4c4dacb8b40f9032dfc90a7c Stdune__Hashtbl
20+
2f561d28974f1c76974b217015d894ff Stdune__Hashable
21+
f01519520ce7398ca472c40bcdd37916 Stdune__Either
22+
26c7c23a3f08949c9234b39a8456e0c4 Stdune__Dune_either
23+
6c4aad0453a73862d11f3e5a6484eb83 Stdune__Comparator
24+
78d20a1f0a585a77c0b794e2576c5ce1 Stdune__Comparable_intf
25+
95b5a54d9e83e8c31cf45102cda75e48 Stdune__
26+
e99839b765b60b06e594103d43eb2fc3 Stdlib__Uchar
27+
3bc9847742f040684ab499418b7edf05 Stdlib__StringLabels
28+
22ab37e5d785c94907a48029f32d8e8b Stdlib__Seq
29+
41f1535996cca328bb845b07f8302854 Stdlib__Format
30+
46032d55ce31c121a36c0c831eb303d0 Stdlib__Either
31+
22513dfb5b42771d934b5ab03c3e52e2 Stdlib__Domain
32+
fb4e94053b07bc3831961cf2dd4bfa5f Stdlib__Buffer
33+
b7726274865ffd07290ef11351fb84fe Stdlib
34+
3d06cb761b7b5c8b1688884de82f6f44 Pp
35+
95df35f1ae12a6752513bc2d6dd1e2aa Ordering
36+
40da7899f44eca869bcd9216c9f03eb3 Dyn
37+
863a7f5288599b181f046f0f55277b0f CamlinternalFormatBasics
38+
File _build/default/otherlibs/stdune/src/.stdune.objs/byte/stdune__Env.cmo
39+
Unit name: Stdune__Env
40+
Interfaces imported:
41+
03e897aee435213573adf13c80fcb505 Unix
42+
a37d011736ba15fcb93e301d6e9668d2 Stdune__String
43+
b51e9564a437f5dab85ecd7dbeb5fe9e Stdune__Set_intf
44+
5fa01009dd8a8dc4b5aa020829607a29 Stdune__Seq
45+
c4077e4346d1333fb5a5d86cb1b29d00 Stdune__Result
46+
533fd86efff7f4531b0b06618b7035fc Stdune__Poly
47+
fb775f8b752e8168d73ada4c504f02b6 Stdune__Map_intf
48+
fae59d6691dc238fd60bd45af4965361 Stdune__Map
49+
73b7f60f54e3ce7915dc84d6e67ed356 Stdune__Loc0
50+
e17e834cc6ebc2c4dd1c00550d905672 Stdune__List
51+
dacde49bf9f97ac658c92aed71b8c785 Stdune__Lexbuf
52+
c1d2054a047001a99870331b34bcabfb Stdune__Hashtbl_intf
53+
2355b12e6f04e2effaeed7fcf7788457 Stdune__Hashtbl
54+
f78523139161a07f69c9bb172c66d2d6 Stdune__Hashable
55+
e658ad11f9a5db6440d11c79d9c50742 Stdune__Env
56+
9fd88bd5b1dfb61f9d7713cda581d288 Stdune__Either
57+
c6c90e99c836610dda40af3b03120714 Stdune__Dune_either
58+
99b7fcf93dc56dcc938e4886b46ce3b3 Stdune__Comparator
59+
4ab9970cf012f4719f898657f92b5780 Stdune__Comparable_intf
60+
ed5bf8d301e6efbb9bb75d08e9fda6ed Stdune__Comparable
61+
b280176bcf92e00bb31e82e836b79478 Stdune__Code_error
62+
2fdcab3c50cae1145cd9ad5a42fef2b0 Stdune__Array
63+
56b745aad68436e15c04a81a49a64bc2 Stdune__
64+
e99839b765b60b06e594103d43eb2fc3 Stdlib__Uchar
65+
37ffc17421e2ae344263e703f9b97a7f Stdlib__Sys
66+
3bc9847742f040684ab499418b7edf05 Stdlib__StringLabels
67+
22ab37e5d785c94907a48029f32d8e8b Stdlib__Seq
68+
48aae94bed7b9364737dec491dd5504f Stdlib__Printf
69+
2b62d36b226e41c97dbde849f2884dd5 Stdlib__ListLabels
70+
79bfb1f841143482726839838f8b6560 Stdlib__Lexing
71+
41f1535996cca328bb845b07f8302854 Stdlib__Format
72+
46032d55ce31c121a36c0c831eb303d0 Stdlib__Either
73+
22513dfb5b42771d934b5ab03c3e52e2 Stdlib__Domain
74+
d3484881d7abcc6fad213e2616c0406e Stdlib__Complex
75+
fb4e94053b07bc3831961cf2dd4bfa5f Stdlib__Buffer
76+
5bd8a0c0af94a79b082f9c2fdd62d630 Stdlib__Bigarray
77+
c754c627bac3f2948b8da959a4caa4e5 Stdlib__ArrayLabels
78+
b7726274865ffd07290ef11351fb84fe Stdlib
79+
b0a9d2486ded60332f67def162ad115a Pp
80+
74e26938103410d4bef478dee9a67659 Ordering
81+
b6bda25e76f7a0790682d620ddd2e240 Dyn
82+
863a7f5288599b181f046f0f55277b0f CamlinternalFormatBasics
83+
Required globals:
84+
Dyn
85+
Stdlib__Printf
86+
Stdlib__Sys
87+
Stdune__Array
88+
Stdune__Code_error
89+
Stdune__Comparable
90+
Stdune__List
91+
Stdune__Poly
92+
Stdune__String
93+
Unix
94+
Uses unsafe features: no
7795
Force link: no
7896
|ocamlobjinfo}
7997
;;
8098

81-
let parse s = Ocamlobjinfo.parse s |> Ocamlobjinfo.to_dyn |> print_dyn
99+
let parse s = Ocamlobjinfo.parse s |> Dyn.list Ocamlobjinfo.to_dyn |> print_dyn
82100

83101
let%expect_test _ =
84102
parse fixture;
85103
[%expect
86104
{|
87-
{ impl =
88-
set
89-
{ "printf"
90-
; "stdune__Array"
91-
; "stdune__Bin"
92-
; "stdune__Exn"
93-
; "stdune__List"
94-
; "stdune__Map"
95-
; "stdune__Set"
96-
; "stdune__Sexp"
97-
; "stdune__String"
98-
; "sys"
99-
; "unix"
105+
[ { impl = set {}
106+
; intf =
107+
set
108+
{ "camlinternalFormatBasics"
109+
; "dyn"
110+
; "ordering"
111+
; "pp"
112+
; "stdlib"
113+
; "stdlib__Buffer"
114+
; "stdlib__Domain"
115+
; "stdlib__Either"
116+
; "stdlib__Format"
117+
; "stdlib__Seq"
118+
; "stdlib__StringLabels"
119+
; "stdlib__Uchar"
120+
; "stdune__"
121+
; "stdune__Comparable_intf"
122+
; "stdune__Comparator"
123+
; "stdune__Dune_either"
124+
; "stdune__Either"
125+
; "stdune__Env"
126+
; "stdune__Hashable"
127+
; "stdune__Hashtbl"
128+
; "stdune__Hashtbl_intf"
129+
; "stdune__Map_intf"
130+
; "stdune__Result"
131+
; "stdune__Seq"
132+
; "stdune__Set_intf"
133+
; "stdune__String"
134+
}
100135
}
101-
; intf =
102-
set
103-
{ "arrayLabels"
104-
; "buffer"
105-
; "camlinternalBigarray"
106-
; "camlinternalFormatBasics"
107-
; "complex"
108-
; "format"
109-
; "hashtbl"
110-
; "lexing"
111-
; "listLabels"
112-
; "map"
113-
; "moreLabels"
114-
; "pervasives"
115-
; "printexc"
116-
; "printf"
117-
; "set"
118-
; "stdlib"
119-
; "stdlib__"
120-
; "stdlib__Result"
121-
; "stdlib__Result_compat"
122-
; "stdune__"
123-
; "stdune__Array"
124-
; "stdune__Bin"
125-
; "stdune__Comparator"
126-
; "stdune__Either"
127-
; "stdune__Env"
128-
; "stdune__Exn"
129-
; "stdune__Hashable"
130-
; "stdune__Hashtbl"
131-
; "stdune__Hashtbl_intf"
132-
; "stdune__List"
133-
; "stdune__Loc"
134-
; "stdune__Map"
135-
; "stdune__Map_intf"
136-
; "stdune__Ordering"
137-
; "stdune__Path"
138-
; "stdune__Result"
139-
; "stdune__Set"
140-
; "stdune__Set_intf"
141-
; "stdune__Sexp"
142-
; "stdune__Sexp_intf"
143-
; "stdune__String"
144-
; "stringLabels"
145-
; "sys"
146-
; "uchar"
147-
; "unix"
136+
; { impl = set {}
137+
; intf =
138+
set
139+
{ "camlinternalFormatBasics"
140+
; "dyn"
141+
; "ordering"
142+
; "pp"
143+
; "stdlib"
144+
; "stdlib__ArrayLabels"
145+
; "stdlib__Bigarray"
146+
; "stdlib__Buffer"
147+
; "stdlib__Complex"
148+
; "stdlib__Domain"
149+
; "stdlib__Either"
150+
; "stdlib__Format"
151+
; "stdlib__Lexing"
152+
; "stdlib__ListLabels"
153+
; "stdlib__Printf"
154+
; "stdlib__Seq"
155+
; "stdlib__StringLabels"
156+
; "stdlib__Sys"
157+
; "stdlib__Uchar"
158+
; "stdune__"
159+
; "stdune__Array"
160+
; "stdune__Code_error"
161+
; "stdune__Comparable"
162+
; "stdune__Comparable_intf"
163+
; "stdune__Comparator"
164+
; "stdune__Dune_either"
165+
; "stdune__Either"
166+
; "stdune__Env"
167+
; "stdune__Hashable"
168+
; "stdune__Hashtbl"
169+
; "stdune__Hashtbl_intf"
170+
; "stdune__Lexbuf"
171+
; "stdune__List"
172+
; "stdune__Loc0"
173+
; "stdune__Map"
174+
; "stdune__Map_intf"
175+
; "stdune__Poly"
176+
; "stdune__Result"
177+
; "stdune__Seq"
178+
; "stdune__Set_intf"
179+
; "stdune__String"
180+
; "unix"
181+
}
148182
}
149-
}
150-
|}]
183+
]
184+
|}]
151185
;;

0 commit comments

Comments
 (0)