@@ -21,9 +21,6 @@ pub fn clean(build: &Build, all: bool) {
21
21
} else {
22
22
rm_rf ( & build. out . join ( "tmp" ) ) ;
23
23
rm_rf ( & build. out . join ( "dist" ) ) ;
24
- // Only delete the bootstrap executable on non-Windows systems
25
- // Windows does not allow deleting a currently running executable
26
- #[ cfg( not( windows) ) ]
27
24
rm_rf ( & build. out . join ( "bootstrap" ) ) ;
28
25
29
26
for host in & build. hosts {
@@ -54,14 +51,40 @@ fn rm_rf(path: &Path) {
54
51
}
55
52
Ok ( metadata) => {
56
53
if metadata. file_type ( ) . is_file ( ) || metadata. file_type ( ) . is_symlink ( ) {
57
- do_op ( path, "remove file" , |p| fs:: remove_file ( p) ) ;
54
+ do_op ( path, "remove file" , |p| {
55
+ fs:: remove_file ( p) . or_else ( |e| {
56
+ // Work around the fact that we cannot
57
+ // delete an executable while it runs on Windows.
58
+ #[ cfg( windows) ]
59
+ if e. kind ( ) == std:: io:: ErrorKind :: PermissionDenied
60
+ && p. file_name ( ) . and_then ( std:: ffi:: OsStr :: to_str)
61
+ == Some ( "bootstrap.exe" )
62
+ {
63
+ eprintln ! ( "warning: failed to delete '{}'." , p. display( ) ) ;
64
+ return Ok ( ( ) ) ;
65
+ }
66
+ Err ( e)
67
+ } )
68
+ } ) ;
58
69
return ;
59
70
}
60
71
61
72
for file in t ! ( fs:: read_dir( path) ) {
62
73
rm_rf ( & t ! ( file) . path ( ) ) ;
63
74
}
64
- do_op ( path, "remove dir" , |p| fs:: remove_dir ( p) ) ;
75
+ do_op ( path, "remove dir" , |p| {
76
+ fs:: remove_dir ( p) . or_else ( |e| {
77
+ // Check for dir not empty on Windows
78
+ #[ cfg( windows) ]
79
+ if matches ! ( e. kind( ) , std:: io:: ErrorKind :: Other )
80
+ && e. raw_os_error ( ) == Some ( 145 )
81
+ {
82
+ return Ok ( ( ) ) ;
83
+ }
84
+
85
+ Err ( e)
86
+ } )
87
+ } ) ;
65
88
}
66
89
} ;
67
90
}
@@ -80,8 +103,15 @@ where
80
103
p. set_readonly ( false ) ;
81
104
t ! ( fs:: set_permissions( path, p) ) ;
82
105
f ( path) . unwrap_or_else ( |e| {
106
+ // Deleting symlinked directories on Windows is non-trivial.
107
+ // Skip doing so for now.
108
+ #[ cfg( windows) ]
109
+ if e. kind ( ) == ErrorKind :: PermissionDenied && path. is_dir ( ) {
110
+ eprintln ! ( "warning: failed to delete '{}'." , path. display( ) ) ;
111
+ return ;
112
+ }
83
113
panic ! ( "failed to {} {}: {}" , desc, path. display( ) , e) ;
84
- } )
114
+ } ) ;
85
115
}
86
116
Err ( e) => {
87
117
panic ! ( "failed to {} {}: {}" , desc, path. display( ) , e) ;
0 commit comments