10
10
11
11
// rustpkg utilities having to do with paths and directories
12
12
13
- pub use util:: { PkgId , RemotePath , LocalPath } ;
13
+ use util:: PkgId ;
14
14
use core:: libc:: consts:: os:: posix88:: { S_IRUSR , S_IWUSR , S_IXUSR } ;
15
15
use core:: os:: mkdir_recursive;
16
- pub use util:: { normalize, OutputType , Main , Lib , Bench , Test } ;
16
+
17
+ #[ deriving( Eq ) ]
18
+ pub enum OutputType { Main , Lib , Bench , Test }
17
19
18
20
/// Returns the value of RUST_PATH, as a list
19
21
/// of Paths. In general this should be read from the
@@ -29,73 +31,67 @@ pub static u_rwx: i32 = (S_IRUSR | S_IWUSR | S_IXUSR) as i32;
29
31
/// succeeded.
30
32
pub fn make_dir_rwx ( p : & Path ) -> bool { os:: make_dir ( p, u_rwx) }
31
33
34
+ /// Replace all occurrences of '-' in the stem part of path with '_'
35
+ /// This is because we treat rust-foo-bar-quux and rust_foo_bar_quux
36
+ /// as the same name
37
+ pub fn normalize ( p : ~Path ) -> ~Path {
38
+ match p. filestem ( ) {
39
+ None => p,
40
+ Some ( st) => {
41
+ let replaced = str:: replace ( st, "-" , "_" ) ;
42
+ if replaced != st {
43
+ ~p. with_filestem ( replaced)
44
+ }
45
+ else {
46
+ p
47
+ }
48
+ }
49
+ }
50
+ }
51
+
32
52
// n.b. So far this only handles local workspaces
33
53
// n.b. The next three functions ignore the package version right
34
54
// now. Should fix that.
35
55
36
56
/// True if there's a directory in <workspace> with
37
57
/// pkgid's short name
38
- pub fn workspace_contains_package_id ( pkgid : PkgId , workspace : & Path ) -> bool {
39
- let pkgpath = workspace. push ( "src" ) . push ( pkgid. local_path . to_str ( ) ) ;
58
+ pub fn workspace_contains_package_id ( pkgid : & PkgId , workspace : & Path ) -> bool {
59
+ let pkgpath = workspace. push ( "src" ) . push ( pkgid. path . to_str ( ) ) ;
40
60
os:: path_is_dir ( & pkgpath)
41
61
}
42
62
43
63
/// Return the directory for <pkgid>'s source files in <workspace>.
44
64
/// Doesn't check that it exists.
45
65
pub fn pkgid_src_in_workspace ( pkgid : & PkgId , workspace : & Path ) -> Path {
46
66
let result = workspace. push ( "src" ) ;
47
- result. push ( pkgid. local_path . to_str ( ) )
67
+ result. push ( pkgid. path . to_str ( ) )
48
68
}
49
69
50
70
/// Figure out what the executable name for <pkgid> in <workspace>'s build
51
71
/// directory is, and if the file exists, return it.
52
72
pub fn built_executable_in_workspace ( pkgid : & PkgId , workspace : & Path ) -> Option < Path > {
53
73
let mut result = workspace. push ( "build" ) ;
74
+ result = result. push_rel ( & pkgid. path ) ;
54
75
// should use a target-specific subdirectory
55
- result = mk_output_path ( Main , pkgid, & result) ;
76
+ result = mk_output_path ( Main , fmt ! ( "%s-%s" , pkgid. path. to_str( ) , pkgid. version. to_str( ) ) ,
77
+ result) ;
56
78
debug ! ( "built_executable_in_workspace: checking whether %s exists" ,
57
79
result. to_str( ) ) ;
58
80
if os:: path_exists ( & result) {
59
81
Some ( result)
60
82
}
61
83
else {
62
- // This is not an error, but it's worth logging it
63
- error ! ( fmt!( "built_executable_in_workspace: %s does not exist" , result. to_str( ) ) ) ;
64
84
None
65
85
}
66
86
}
67
87
68
- /// Figure out what the test name for <pkgid> in <workspace>'s build
69
- /// directory is, and if the file exists, return it.
70
- pub fn built_test_in_workspace ( pkgid : PkgId , workspace : & Path ) -> Option < Path > {
71
- output_in_workspace ( pkgid, workspace, Test )
72
- }
73
-
74
- /// Figure out what the test name for <pkgid> in <workspace>'s build
88
+ /// Figure out what the library name for <pkgid> in <workspace>'s build
75
89
/// directory is, and if the file exists, return it.
76
- pub fn built_bench_in_workspace ( pkgid : PkgId , workspace : & Path ) -> Option < Path > {
77
- output_in_workspace ( pkgid, workspace, Bench )
78
- }
79
-
80
- fn output_in_workspace ( pkgid : PkgId , workspace : & Path , what : OutputType ) -> Option < Path > {
90
+ pub fn built_library_in_workspace ( pkgid : & PkgId , workspace : & Path ) -> Option < Path > {
81
91
let mut result = workspace. push ( "build" ) ;
92
+ result = result. push_rel ( & pkgid. path ) ;
82
93
// should use a target-specific subdirectory
83
- result = mk_output_path ( what, pkgid, & result) ;
84
- debug ! ( "output_in_workspace: checking whether %s exists" ,
85
- result. to_str( ) ) ;
86
- if os:: path_exists ( & result) {
87
- Some ( result)
88
- }
89
- else {
90
- error ! ( fmt!( "output_in_workspace: %s does not exist" , result. to_str( ) ) ) ;
91
- None
92
- }
93
- }
94
-
95
- /// Figure out what the library name for <pkgid> in <workspace>'s build
96
- /// directory is, and if the file exists, return it.
97
- pub fn built_library_in_workspace ( pkgid : PkgId , workspace : & Path ) -> Option < Path > {
98
- let result = mk_output_path ( Lib , pkgid, & workspace. push ( "build" ) ) ;
94
+ result = mk_output_path ( Lib , pkgid. path . to_str ( ) , result) ;
99
95
debug ! ( "built_library_in_workspace: checking whether %s exists" ,
100
96
result. to_str( ) ) ;
101
97
@@ -104,7 +100,8 @@ pub fn built_library_in_workspace(pkgid: PkgId, workspace: &Path) -> Option<Path
104
100
let dir_contents = os:: list_dir ( & result. pop ( ) ) ;
105
101
debug ! ( "dir has %? entries" , dir_contents. len( ) ) ;
106
102
107
- let lib_prefix = fmt ! ( "%s%s" , os:: consts:: DLL_PREFIX , pkgid. short_name) ;
103
+ // n.b. This code assumes the pkgid's path only has one element
104
+ let lib_prefix = fmt ! ( "%s%s" , os:: consts:: DLL_PREFIX , pkgid. path. to_str( ) ) ;
108
105
let lib_filetype = fmt ! ( "%s%s" , pkgid. version. to_str( ) , os:: consts:: DLL_SUFFIX ) ;
109
106
110
107
debug ! ( "lib_prefix = %s and lib_filetype = %s" , lib_prefix, lib_filetype) ;
@@ -176,15 +173,13 @@ pub fn target_library_in_workspace(pkgid: &PkgId, workspace: &Path) -> Path {
176
173
177
174
/// Returns the test executable that would be installed for <pkgid>
178
175
/// in <workspace>
179
- /// note that we *don't* install test executables, so this is just for unit testing
180
- pub fn target_test_in_workspace ( pkgid: PkgId , workspace: & Path ) -> Path {
176
+ pub fn target_test_in_workspace ( pkgid: & PkgId , workspace: & Path ) -> Path {
181
177
target_file_in_workspace( pkgid, workspace, Test )
182
178
}
183
179
184
180
/// Returns the bench executable that would be installed for <pkgid>
185
181
/// in <workspace>
186
- /// note that we *don't* install bench executables, so this is just for unit testing
187
- pub fn target_bench_in_workspace ( pkgid: PkgId , workspace: & Path ) -> Path {
182
+ pub fn target_bench_in_workspace ( pkgid: & PkgId , workspace: & Path ) -> Path {
188
183
target_file_in_workspace( pkgid, workspace, Bench )
189
184
}
190
185
@@ -193,14 +188,17 @@ fn target_file_in_workspace(pkgid: &PkgId, workspace: &Path,
193
188
use conditions:: bad_path:: cond;
194
189
195
190
let ( subdir, create_dir) = match what {
196
- Lib => "lib" , Main | Test | Bench => "bin"
191
+ Main => ( "bin" , true ) , Lib => ( "lib" , true ) , Test | Bench => ( "build" , false )
197
192
} ;
198
193
let result = workspace. push ( subdir) ;
199
- debug ! ( "target_file_in_workspace: %s %?" , result. to_str( ) , create_dir) ;
200
- if !os:: path_exists ( & result) && !mkdir_recursive ( & result, u_rwx) {
201
- cond. raise ( ( result, fmt ! ( "I couldn't create the %s dir" , subdir) ) ) ;
194
+ if create_dir {
195
+ if !os:: path_exists ( & result) && !mkdir_recursive ( & result, u_rwx) {
196
+ cond. raise ( ( copy result,
197
+ fmt ! ( "I couldn't create the %s dir" , subdir) ) ) ;
198
+ }
202
199
}
203
- mk_output_path ( what, pkgid, & result)
200
+ mk_output_path ( what, pkgid. path . to_str ( ) , result)
201
+
204
202
}
205
203
206
204
/// Return the directory for <pkgid>'s build artifacts in <workspace>.
@@ -211,7 +209,7 @@ pub fn build_pkg_id_in_workspace(pkgid: &PkgId, workspace: &Path) -> Path {
211
209
let mut result = workspace. push ( "build" ) ;
212
210
// n.b. Should actually use a target-specific
213
211
// subdirectory of build/
214
- result = result. push_rel ( & * pkgid. local_path ) ;
212
+ result = result. push ( normalize ( ~copy pkgid. path ) . to_str ( ) ) ;
215
213
if os:: path_exists ( & result) || os:: mkdir_recursive ( & result, u_rwx) {
216
214
result
217
215
}
@@ -222,15 +220,8 @@ pub fn build_pkg_id_in_workspace(pkgid: &PkgId, workspace: &Path) -> Path {
222
220
223
221
/// Return the output file for a given directory name,
224
222
/// given whether we're building a library and whether we're building tests
225
- pub fn mk_output_path ( what : OutputType , pkg_id : PkgId , workspace : & Path ) -> Path {
226
- let short_name = pkg_id. short_name_with_version ( ) ;
227
- // Not local_path.dir_path()! For package foo/bar/blat/, we want
228
- // the executable blat-0.5 to live under blat/
229
- let dir = workspace. push_rel ( & * pkg_id. local_path ) ;
230
- debug ! ( "mk_output_path: short_name = %s, path = %s" ,
231
- short_name, dir. to_str( ) ) ;
232
- let output_path = match what {
233
- // this code is duplicated from elsewhere; fix this
223
+ pub fn mk_output_path ( what : OutputType , short_name : ~str , dir : Path ) -> Path {
224
+ match what {
234
225
Lib => dir. push ( os:: dll_filename ( short_name) ) ,
235
226
_ => dir. push ( fmt ! ( "%s%s%s" , short_name,
236
227
match what {
@@ -239,7 +230,5 @@ pub fn mk_output_path(what: OutputType, pkg_id: PkgId, workspace: &Path) -> Path
239
230
_ => ""
240
231
}
241
232
os:: EXE_SUFFIX ) )
242
- } ;
243
- debug ! ( "mk_output_path: returning %s" , output_path. to_str( ) ) ;
244
- output_path
233
+ }
245
234
}
0 commit comments