Skip to content

Commit 8dd5439

Browse files
committed
Fix dune exec -- wrt file path, public_name with or without .exe
Fix for ocaml#3322 "dune exec needs to add .exe on Windows". Signed-off-by: Antonin Décimo <antonin@tarides.com>
1 parent 0c8f161 commit 8dd5439

File tree

6 files changed

+130
-3
lines changed

6 files changed

+130
-3
lines changed

bin/exec.ml

+5-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ let man =
2626
; Common.examples
2727
[ ("Run the executable named `my_exec'", "dune exec my_exec")
2828
; ( "Run the executable defined in `foo.ml' with the argument `arg'"
29-
, "dune exec ./foo.exe -- arg" )
29+
, "dune exec -- ./foo.exe arg" )
3030
]
3131
]
3232

@@ -66,11 +66,13 @@ let term =
6666
let open Memo.Build.O in
6767
(match prog_where with
6868
| `Search p ->
69-
[ Path.Build.relative
69+
let p =
70+
Path.Build.relative
7071
(Local_install_path.bin_dir ~context:context.name)
7172
p
7273
|> Path.build
73-
]
74+
in
75+
[ p; Path.extend_basename p ~suffix:Bin.exe ]
7476
| `This_rel p when Sys.win32 ->
7577
[ p; Path.extend_basename p ~suffix:Bin.exe ]
7678
| `This_rel p -> [ p ]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
(executable
2+
(name example)
3+
(public_name shaihulud))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
(lang dune 2.8)
2+
(generate_opam_files true)
3+
(package
4+
(name mypackage)
5+
(synopsis "My first Dune package!")
6+
(description "\| This is my first attempt at creating
7+
"\| a project with Dune.
8+
))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
let () = print_endline "Hello, World!"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# This file is generated by dune, edit dune-project instead
2+
opam-version: "2.0"
3+
synopsis: "My first Dune package!"
4+
description: """
5+
This is my first attempt at creating
6+
a project with Dune.
7+
"""
8+
depends: [
9+
"dune" {>= "2.8"}
10+
"odoc" {with-doc}
11+
]
12+
build: [
13+
["dune" "subst"] {dev}
14+
[
15+
"dune"
16+
"build"
17+
"-p"
18+
name
19+
"-j"
20+
jobs
21+
"@install"
22+
"@runtest" {with-test}
23+
"@doc" {with-doc}
24+
]
25+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
Test case for https://github.com/ocaml/dune/issues/3322
2+
"dune exec needs to add .exe on Windows"
3+
4+
$ os_type=$(ocamlc -config-var os_type)
5+
6+
Test that on Windows `dune exec -- public_name` and
7+
`dune exec -- public_name.exe` have the same effect.
8+
9+
With extension
10+
==============
11+
12+
$ dune clean
13+
$ dune build @install
14+
$ if [ $os_type = Win32 ]; then dune exec -- shaihulud.exe; else echo "Hello, World!"; fi
15+
Hello, World!
16+
17+
Without extension, prebuild
18+
=================
19+
20+
$ dune clean
21+
$ dune build @install
22+
$ dune exec -- shaihulud
23+
Hello, World!
24+
25+
26+
Test that `dune exec -- public_name` (omitting the .exe) works from a
27+
clean state.
28+
29+
Without extension, clean state
30+
==============================
31+
32+
$ dune clean
33+
$ dune exec -- shaihulud
34+
Hello, World!
35+
36+
37+
Test that the public name resolves well to the actual executable file
38+
when a dependency changes. On platforms where there are no symlinks,
39+
updating the public_name executable matters.
40+
41+
With extension, prebuild
42+
==============
43+
44+
$ dune clean
45+
$ dune build @install
46+
47+
$ if [ $os_type = Win32 ]; then dune exec -- shaihulud.exe; else echo "Hello, World!"; fi
48+
Hello, World!
49+
$ dune exec -- ./example.exe
50+
Hello, World!
51+
$ sed -i'' 's/World/Arrakis/' example.ml
52+
$ if [ $os_type = Win32 ]; then dune exec -- shaihulud.exe; else echo "Hello, Arrakis!"; fi
53+
Hello, Arrakis!
54+
$ dune exec -- ./example.exe
55+
Hello, Arrakis!
56+
57+
Without extension, prebuild
58+
=================
59+
60+
$ sed -i'' 's/Arrakis/World/' example.ml
61+
$ dune clean
62+
$ dune build @install
63+
64+
$ dune exec -- shaihulud
65+
Hello, World!
66+
$ dune exec -- ./example.exe
67+
Hello, World!
68+
$ sed -i'' 's/World/Arrakis/' example.ml
69+
$ dune exec -- shaihulud
70+
Hello, Arrakis!
71+
$ dune exec -- ./example.exe
72+
Hello, Arrakis!
73+
74+
Without extention, clean state
75+
==============================
76+
77+
$ sed -i'' 's/Arrakis/World/' example.ml
78+
$ dune clean
79+
80+
$ dune exec -- shaihulud
81+
Hello, World!
82+
$ dune exec -- ./example.exe
83+
Hello, World!
84+
$ sed -i'' 's/World/Arrakis/' example.ml
85+
$ dune exec -- shaihulud
86+
Hello, Arrakis!
87+
$ dune exec -- ./example.exe
88+
Hello, Arrakis!

0 commit comments

Comments
 (0)