@@ -28,7 +28,7 @@ use std::collections::HashMap;
28
28
use core:: registry:: PackageRegistry ;
29
29
use core:: { MultiShell , Source , SourceId , PackageSet , Package , Target , PackageId } ;
30
30
use core:: resolver;
31
- use ops;
31
+ use ops:: { mod , BuildOutput } ;
32
32
use sources:: { PathSource } ;
33
33
use util:: config:: { Config , ConfigValue } ;
34
34
use util:: { CargoResult , Wrap , config, internal, human, ChainError , profile} ;
@@ -129,7 +129,7 @@ pub fn compile_pkg(package: &Package, options: &mut CompileOptions)
129
129
} ;
130
130
131
131
let targets = to_build. get_targets ( ) . iter ( ) . filter ( |target| {
132
- match env {
132
+ target . get_profile ( ) . is_custom_build ( ) || match env {
133
133
// doc-all == document everything, so look for doc targets
134
134
"doc" | "doc-all" => target. get_profile ( ) . get_env ( ) == "doc" ,
135
135
env => target. get_profile ( ) . get_env ( ) == env,
@@ -138,12 +138,12 @@ pub fn compile_pkg(package: &Package, options: &mut CompileOptions)
138
138
139
139
let ret = {
140
140
let _p = profile:: start ( "compiling" ) ;
141
- try!( scrape_target_config ( & config, & user_configs) ) ;
141
+ let lib_overrides = try!( scrape_target_config ( & config, & user_configs) ) ;
142
142
143
143
try!( ops:: compile_targets ( env. as_slice ( ) , targets. as_slice ( ) , to_build,
144
144
& PackageSet :: new ( packages. as_slice ( ) ) ,
145
145
& resolve_with_overrides, & sources,
146
- & config) )
146
+ & config, lib_overrides ) )
147
147
} ;
148
148
149
149
return Ok ( ret) ;
@@ -175,41 +175,68 @@ fn source_ids_from_config(configs: &HashMap<String, config::ConfigValue>,
175
175
176
176
fn scrape_target_config ( config : & Config ,
177
177
configs : & HashMap < String , config:: ConfigValue > )
178
- -> CargoResult < ( ) > {
178
+ -> CargoResult < HashMap < String , BuildOutput > > {
179
179
let target = match configs. find_equiv ( "target" ) {
180
- None => return Ok ( ( ) ) ,
180
+ None => return Ok ( HashMap :: new ( ) ) ,
181
181
Some ( target) => try!( target. table ( ) . chain_error ( || {
182
182
internal ( "invalid configuration for the key `target`" )
183
183
} ) ) ,
184
184
} ;
185
- let target = match config. target ( ) {
186
- None => target,
187
- Some ( triple) => match target. find_equiv ( triple) {
188
- None => return Ok ( ( ) ) ,
189
- Some ( target) => try!( target. table ( ) . chain_error ( || {
190
- internal ( format ! ( "invalid configuration for the key \
191
- `target.{}`", triple) )
192
- } ) ) ,
193
- } ,
185
+ let triple = config. target ( ) . unwrap_or ( config. rustc_host ( ) ) . to_string ( ) ;
186
+ let target = match target. find ( & triple) {
187
+ None => return Ok ( HashMap :: new ( ) ) ,
188
+ Some ( target) => try!( target. table ( ) . chain_error ( || {
189
+ internal ( format ! ( "invalid configuration for the key \
190
+ `target.{}`", triple) )
191
+ } ) ) ,
194
192
} ;
195
193
196
- match target. find_equiv ( "ar" ) {
197
- None => { }
198
- Some ( ar) => {
199
- config. set_ar ( try!( ar. string ( ) . chain_error ( || {
200
- internal ( "invalid configuration for key `ar`" )
201
- } ) ) . ref0 ( ) . to_string ( ) ) ;
202
- }
203
- }
204
-
205
- match target. find_equiv ( "linker" ) {
206
- None => { }
207
- Some ( linker) => {
208
- config. set_linker ( try!( linker. string ( ) . chain_error ( || {
209
- internal ( "invalid configuration for key `ar`" )
210
- } ) ) . ref0 ( ) . to_string ( ) ) ;
194
+ let mut ret = HashMap :: new ( ) ;
195
+ for ( k, v) in target. iter ( ) {
196
+ match k. as_slice ( ) {
197
+ "ar" | "linker" => {
198
+ let v = try!( v. string ( ) . chain_error ( || {
199
+ internal ( format ! ( "invalid configuration for key `{}`" , k) )
200
+ } ) ) . ref0 ( ) . to_string ( ) ;
201
+ if k. as_slice ( ) == "linker" {
202
+ config. set_linker ( v) ;
203
+ } else {
204
+ config. set_ar ( v) ;
205
+ }
206
+ }
207
+ lib_name => {
208
+ let table = try!( v. table ( ) . chain_error ( || {
209
+ internal ( format ! ( "invalid configuration for the key \
210
+ `target.{}.{}`", triple, lib_name) )
211
+ } ) ) ;
212
+ let mut output = BuildOutput {
213
+ library_paths : Vec :: new ( ) ,
214
+ library_links : Vec :: new ( ) ,
215
+ metadata : Vec :: new ( ) ,
216
+ } ;
217
+ for ( k, v) in table. iter ( ) {
218
+ let v = try!( v. string ( ) . chain_error ( || {
219
+ internal ( format ! ( "invalid configuration for the key \
220
+ `target.{}.{}.{}`", triple, lib_name,
221
+ k) )
222
+ } ) ) . val0 ( ) ;
223
+ if k. as_slice ( ) == "rustc-flags" {
224
+ let whence = format ! ( "in `target.{}.{}.rustc-flags`" ,
225
+ triple, lib_name) ;
226
+ let whence = whence. as_slice ( ) ;
227
+ let ( paths, links) = try!(
228
+ BuildOutput :: parse_rustc_flags ( v. as_slice ( ) , whence)
229
+ ) ;
230
+ output. library_paths . extend ( paths. into_iter ( ) ) ;
231
+ output. library_links . extend ( links. into_iter ( ) ) ;
232
+ } else {
233
+ output. metadata . push ( ( k. to_string ( ) , v. to_string ( ) ) ) ;
234
+ }
235
+ }
236
+ ret. insert ( lib_name. to_string ( ) , output) ;
237
+ }
211
238
}
212
239
}
213
240
214
- Ok ( ( ) )
241
+ Ok ( ret )
215
242
}
0 commit comments