mte/unikernel/duniverse/dune_/otherlibs/dune-build-info/test/run.t

160 lines
4.2 KiB
Perl
Raw Normal View History

2025-11-11 02:07:51 +01:00
Test embedding of build information
-----------------------------------
$ mkdir -p a b c
$ for i in a b c d; do
> mkdir -p $i
> cat >$i/dune-project <<EOF
> (lang dune 2.0)
> (name $i)
> (package (name $i))
> EOF
> (cd $i;
> git init -q;
> git config user.name "Test Name"
> git config user.email "test@example.com"
> git add .;
> git commit -q -m _;
> git tag -a 1.0+$i -m _)
> done
$ for i in a b; do
> cat >$i/dune <<EOF
> (library
> (public_name $i))
> EOF
> done
$ cat >c/dune <<EOF
> (executable
> (public_name c)
> (promote (until-clean))
> (libraries a b dune-build-info))
> EOF
$ cat >c/c.ml <<EOF
> module B = Build_info.V1
> let pr fmt = Printf.printf (fmt ^^ "\n")
> let get_version = function
> | Some v -> B.Version.to_string v
> | None -> "n/a"
> let () =
> pr "%s" (get_version (B.version ()));
> let process_lib lib =
> let name = B.Statically_linked_library.name lib in
> let version = B.Statically_linked_library.version lib in
> pr "lib %s: %s" name (get_version version)
> in
> List.iter process_lib (B.Statically_linked_libraries.to_list ())
> EOF
$ cat > dune-project << EOF
> (lang dune 2.0)
> EOF
$ dune build
$ dune install --prefix _install
Inside _build, we have no version information:
$ _build/default/c/c.exe | sed 's/build-info: .*/build-info: XXX/'
n/a
lib a: n/a
lib b: n/a
lib dune-build-info: XXX
$ grep version _build/install/default/lib/a/dune-package
[1]
$ grep version _build/install/default/lib/a/META
[1]
Once installed, we have the version information:
$ _install/bin/c | sed 's/build-info: .*/build-info: XXX/'
1.0+c
lib a: 1.0+a
lib b: 1.0+b
lib dune-build-info: XXX
$ grep version _install/lib/a/dune-package
(version 1.0+a)
$ grep version _install/lib/a/META
version = "1.0+a"
Check what the generated build info module looks like:
$ cat _build/default/c/.c.eobjs/build_info__Build_info_data.ml-gen \
> | sed 's/"dune-build-info".*/"dune-build-info", Some "XXX"/'
let eval s =
let s = Bytes.unsafe_to_string (Bytes.unsafe_of_string s) in
let len = String.length s in
if s.[0] = '=' then
let colon_pos = String.index_from s 1 ':' in
let vlen = int_of_string (String.sub s 1 (colon_pos - 1)) in
(* This [min] is because the value might have been truncated
if it was too large *)
let vlen = min vlen (len - colon_pos - 1) in
Some (String.sub s (colon_pos + 1) vlen)
else
None
[@@inline never]
let p1 = eval (Sys.opaque_identity "%%DUNE_PLACEHOLDER:64:vcs-describe:1:a%%%%%%%%%%%%%%%%%%%%%%%%%%")
let p2 = eval (Sys.opaque_identity "%%DUNE_PLACEHOLDER:64:vcs-describe:1:b%%%%%%%%%%%%%%%%%%%%%%%%%%")
let p0 = eval (Sys.opaque_identity "%%DUNE_PLACEHOLDER:64:vcs-describe:1:c%%%%%%%%%%%%%%%%%%%%%%%%%%")
let version = p0
let statically_linked_libraries =
[ "a", p1
; "b", p2
; "dune-build-info", Some "XXX"
]
Test --debug-artifact-substitution
----------------------------------
The order of substitutions printed by `--debug-artifact-substitution`
is not stable across machines since it depends on the order in which
the string constant end up in the binary. To make the test stable, we
craft an example with a single placeholder to make the output stable:
$ cat >d/dune <<EOF
> (executable
> (public_name d)
> (promote (until-clean))
> (libraries dune-build-info))
> EOF
$ cp c/c.ml d/d.ml
$ dune build d/d.install
$ dune install d --prefix _install --debug-artifact-substitution
Found placeholder in _build/install/default/bin/d:
- placeholder: Vcs_describe (In_source_tree "d")
- evaluates to: "1.0+d"
Test substitution when promoting
--------------------------------
$ c/c.exe | sed 's/build-info: .*/build-info: XXX/'
1.0+c
lib a: 1.0+a
lib b: 1.0+b
lib dune-build-info: XXX
Version is picked from dune-project if available
------------------------------------------------
$ echo '(version project-version)' >> c/dune-project
$ dune build
$ dune install --prefix _install
$ _install/bin/c | sed 's/build-info: .*/build-info: XXX/'
project-version
lib a: 1.0+a
lib b: 1.0+b
lib dune-build-info: XXX