1
1
use crate :: {
2
- helpers:: { clear_dir, get_codspeed_target_dir} ,
2
+ helpers:: { clear_dir, get_codspeed_target_dir, get_target_packages } ,
3
3
prelude:: * ,
4
4
} ;
5
5
6
6
use std:: { collections:: BTreeSet , fs:: create_dir_all, rc:: Rc } ;
7
7
8
8
use cargo:: {
9
- core:: { FeatureValue , Package , Verbosity , Workspace } ,
9
+ core:: { FeatureValue , Package , Target , Verbosity , Workspace } ,
10
10
ops:: { CompileFilter , CompileOptions , Packages } ,
11
11
util:: { command_prelude:: CompileMode , interning:: InternedString } ,
12
12
Config ,
@@ -50,46 +50,56 @@ fn get_compile_options(
50
50
Ok ( compile_opts)
51
51
}
52
52
53
+ struct BenchToBuild < ' a > {
54
+ package : & ' a Package ,
55
+ target : & ' a Target ,
56
+ }
57
+
53
58
pub fn build_benches (
54
59
ws : & Workspace ,
55
60
selected_benches : Option < Vec < String > > ,
56
61
package_name : Option < String > ,
57
62
features : Option < Vec < String > > ,
58
63
) -> Result < ( ) > {
59
- let is_root_package = package_name . is_none ( ) ;
60
- let package = match package_name . as_ref ( ) {
61
- Some ( package_name ) => ws . members ( )
62
- . find ( |p| p . name ( ) . to_string ( ) == * package_name )
63
- . ok_or_else ( || anyhow ! ( "Package {} not found" , package_name ) ) ?
64
-
65
- ,
66
- None => ws . current ( ) . map_err ( |_| anyhow ! ( "No package found. If working with a workspace please use the -p option to specify a member." ) ) ?
67
- } ;
68
- let all_benches = package
69
- . targets ( )
70
- . iter ( )
71
- . filter ( |t| t . is_bench ( ) )
72
- . collect_vec ( ) ;
64
+ let packages_to_build = get_target_packages ( & package_name , ws ) ? ;
65
+ let mut benches_to_build = vec ! [ ] ;
66
+ for package in packages_to_build . iter ( ) {
67
+ let benches = package
68
+ . targets ( )
69
+ . iter ( )
70
+ . filter ( |t| t . is_bench ( ) )
71
+ . collect_vec ( ) ;
72
+ benches_to_build . extend (
73
+ benches
74
+ . into_iter ( )
75
+ . map ( |t| BenchToBuild { package , target : t } ) ,
76
+ ) ;
77
+ }
73
78
74
- let all_benches_count = all_benches . len ( ) ;
79
+ let all_benches_count = benches_to_build . len ( ) ;
75
80
76
- let benches = if let Some ( selected_benches) = selected_benches {
77
- all_benches
81
+ let benches_to_build = if let Some ( selected_benches) = selected_benches {
82
+ benches_to_build
78
83
. into_iter ( )
79
- . filter ( |t| selected_benches. contains ( & t. name ( ) . to_string ( ) ) )
84
+ . filter ( |t| selected_benches. contains ( & t. target . name ( ) . to_string ( ) ) )
80
85
. collect_vec ( )
81
86
} else {
82
- all_benches
87
+ benches_to_build
83
88
} ;
84
89
90
+ let actual_benches_count = benches_to_build. len ( ) ;
91
+
85
92
ws. config ( ) . shell ( ) . set_verbosity ( Verbosity :: Normal ) ;
86
93
ws. config ( ) . shell ( ) . status_with_color (
87
94
"Collected" ,
88
95
format ! (
89
96
"{} benchmark suite(s) to build{}" ,
90
- benches. len( ) ,
91
- if all_benches_count > benches. len( ) {
92
- format!( " ({} filtered out)" , all_benches_count - benches. len( ) )
97
+ benches_to_build. len( ) ,
98
+ if all_benches_count > actual_benches_count {
99
+ format!(
100
+ " ({} filtered out)" ,
101
+ all_benches_count - actual_benches_count
102
+ )
93
103
} else {
94
104
"" . to_string( )
95
105
}
@@ -98,51 +108,57 @@ pub fn build_benches(
98
108
) ?;
99
109
100
110
let config = ws. config ( ) ;
111
+ let codspeed_root_target_dir = get_codspeed_target_dir ( ws) ;
112
+ // Create and clear packages target directories
113
+ for package in packages_to_build. iter ( ) {
114
+ let package_target_dir = codspeed_root_target_dir. join ( package. name ( ) ) ;
115
+ create_dir_all ( & package_target_dir) ?;
116
+ clear_dir ( & package_target_dir) ?;
117
+ }
118
+ let mut built_benches = 0 ;
119
+ for bench in benches_to_build. iter ( ) {
120
+ ws. config ( ) . shell ( ) . status_with_color (
121
+ "Building" ,
122
+ format ! ( "{} {}" , bench. package. name( ) , bench. target. name( ) ) ,
123
+ Color :: Yellow ,
124
+ ) ?;
125
+ let is_root_package = ws. current_opt ( ) . map_or ( false , |p| p == bench. package ) ;
126
+ let benches_names = vec ! [ bench. target. name( ) ] ;
127
+ let compile_opts = get_compile_options (
128
+ config,
129
+ & features,
130
+ bench. package ,
131
+ benches_names,
132
+ is_root_package,
133
+ ) ?;
134
+ let result = cargo:: ops:: compile ( ws, & compile_opts) ?;
135
+ let built_units = result
136
+ . tests
137
+ . into_iter ( )
138
+ . filter ( |u| u. unit . target . is_bench ( ) )
139
+ . collect_vec ( ) ;
140
+ if built_units. is_empty ( ) {
141
+ continue ;
142
+ }
143
+ built_benches += 1 ;
144
+ let codspeed_target_dir = codspeed_root_target_dir. join ( bench. package . name ( ) ) ;
145
+ for built_unit in built_units. iter ( ) {
146
+ let bench_dest = codspeed_target_dir
147
+ . clone ( )
148
+ . join ( built_unit. unit . target . name ( ) ) ;
149
+ std:: fs:: copy ( built_unit. path . clone ( ) , bench_dest) ?;
150
+ }
151
+ }
101
152
102
- let benches_names = benches. iter ( ) . map ( |t| t. name ( ) ) . collect_vec ( ) ;
103
- let benches_names_str = benches_names. join ( ", " ) ;
104
-
105
- ws. config ( )
106
- . shell ( )
107
- . status_with_color ( "Building" , benches_names_str. clone ( ) , Color :: Yellow ) ?;
108
- let compile_opts =
109
- get_compile_options ( config, & features, package, benches_names, is_root_package) ?;
110
- let result = cargo:: ops:: compile ( ws, & compile_opts) ?;
111
- let built_benches = result
112
- . tests
113
- . into_iter ( )
114
- . filter ( |u| u. unit . target . is_bench ( ) )
115
- . collect_vec ( ) ;
116
-
117
- if built_benches. is_empty ( ) {
153
+ if built_benches == 0 {
118
154
bail ! (
119
155
"No benchmark target found. \
120
156
Please add a benchmark target to your Cargo.toml"
121
157
) ;
122
158
}
123
-
124
- ws. config ( )
125
- . shell ( )
126
- . status_with_color ( "Built" , benches_names_str, Color :: Green ) ?;
127
-
128
- let mut codspeed_target_dir = get_codspeed_target_dir ( ws) ;
129
- create_dir_all ( & codspeed_target_dir) ?;
130
- if let Some ( name) = package_name. as_ref ( ) {
131
- codspeed_target_dir = codspeed_target_dir. join ( name) ;
132
- create_dir_all ( & codspeed_target_dir) ?;
133
- }
134
- clear_dir ( & codspeed_target_dir) ?;
135
-
136
- for built_bench in built_benches. iter ( ) {
137
- let bench_dest = codspeed_target_dir
138
- . clone ( )
139
- . join ( built_bench. unit . target . name ( ) ) ;
140
- std:: fs:: copy ( built_bench. path . clone ( ) , bench_dest) ?;
141
- }
142
-
143
159
ws. config ( ) . shell ( ) . status_with_color (
144
160
"Finished" ,
145
- format ! ( "built {} benchmark suite(s)" , benches . len ( ) ) ,
161
+ format ! ( "built {} benchmark suite(s)" , built_benches ) ,
146
162
Color :: Green ,
147
163
) ?;
148
164
0 commit comments