@@ -102,7 +102,7 @@ fn get_lib_name(name: &str, aux_type: AuxType) -> Option<String> {
102
102
// In this case, the only path we can pass
103
103
// with '--extern-meta' is the '.rlib' file
104
104
AuxType :: Lib => Some ( format ! ( "lib{name}.rlib" ) ) ,
105
- AuxType :: Dylib => Some ( dylib_name ( name) ) ,
105
+ AuxType :: Dylib | AuxType :: ProcMacro => Some ( dylib_name ( name) ) ,
106
106
}
107
107
}
108
108
@@ -1097,7 +1097,9 @@ impl<'test> TestCx<'test> {
1097
1097
}
1098
1098
1099
1099
fn has_aux_dir ( & self ) -> bool {
1100
- !self . props . aux . builds . is_empty ( ) || !self . props . aux . crates . is_empty ( )
1100
+ !self . props . aux . builds . is_empty ( )
1101
+ || !self . props . aux . crates . is_empty ( )
1102
+ || !self . props . aux . proc_macros . is_empty ( )
1101
1103
}
1102
1104
1103
1105
fn aux_output_dir ( & self ) -> PathBuf {
@@ -1118,31 +1120,48 @@ impl<'test> TestCx<'test> {
1118
1120
1119
1121
fn build_all_auxiliary ( & self , of : & TestPaths , aux_dir : & Path , rustc : & mut Command ) {
1120
1122
for rel_ab in & self . props . aux . builds {
1121
- self . build_auxiliary ( of, rel_ab, & aux_dir, false /* is_bin */ ) ;
1123
+ self . build_auxiliary ( of, rel_ab, & aux_dir, None ) ;
1122
1124
}
1123
1125
1124
1126
for rel_ab in & self . props . aux . bins {
1125
- self . build_auxiliary ( of, rel_ab, & aux_dir, true /* is_bin */ ) ;
1127
+ self . build_auxiliary ( of, rel_ab, & aux_dir, Some ( AuxType :: Bin ) ) ;
1126
1128
}
1127
1129
1130
+ let path_to_crate_name = |path : & str | -> String {
1131
+ path. rsplit_once ( '/' )
1132
+ . map_or ( path, |( _, tail) | tail)
1133
+ . trim_end_matches ( ".rs" )
1134
+ . replace ( '-' , "_" )
1135
+ } ;
1136
+
1137
+ let add_extern =
1138
+ |rustc : & mut Command , aux_name : & str , aux_path : & str , aux_type : AuxType | {
1139
+ let lib_name = get_lib_name ( & path_to_crate_name ( aux_path) , aux_type) ;
1140
+ if let Some ( lib_name) = lib_name {
1141
+ rustc. arg ( "--extern" ) . arg ( format ! (
1142
+ "{}={}/{}" ,
1143
+ aux_name,
1144
+ aux_dir. display( ) ,
1145
+ lib_name
1146
+ ) ) ;
1147
+ }
1148
+ } ;
1149
+
1128
1150
for ( aux_name, aux_path) in & self . props . aux . crates {
1129
- let aux_type = self . build_auxiliary ( of, & aux_path, & aux_dir, false /* is_bin */ ) ;
1130
- let lib_name =
1131
- get_lib_name ( & aux_path. trim_end_matches ( ".rs" ) . replace ( '-' , "_" ) , aux_type) ;
1132
- if let Some ( lib_name) = lib_name {
1133
- rustc. arg ( "--extern" ) . arg ( format ! (
1134
- "{}={}/{}" ,
1135
- aux_name,
1136
- aux_dir. display( ) ,
1137
- lib_name
1138
- ) ) ;
1139
- }
1151
+ let aux_type = self . build_auxiliary ( of, & aux_path, & aux_dir, None ) ;
1152
+ add_extern ( rustc, aux_name, aux_path, aux_type) ;
1153
+ }
1154
+
1155
+ for proc_macro in & self . props . aux . proc_macros {
1156
+ self . build_auxiliary ( of, proc_macro, & aux_dir, Some ( AuxType :: ProcMacro ) ) ;
1157
+ let crate_name = path_to_crate_name ( proc_macro) ;
1158
+ add_extern ( rustc, & crate_name, proc_macro, AuxType :: ProcMacro ) ;
1140
1159
}
1141
1160
1142
1161
// Build any `//@ aux-codegen-backend`, and pass the resulting library
1143
1162
// to `-Zcodegen-backend` when compiling the test file.
1144
1163
if let Some ( aux_file) = & self . props . aux . codegen_backend {
1145
- let aux_type = self . build_auxiliary ( of, aux_file, aux_dir, false ) ;
1164
+ let aux_type = self . build_auxiliary ( of, aux_file, aux_dir, None ) ;
1146
1165
if let Some ( lib_name) = get_lib_name ( aux_file. trim_end_matches ( ".rs" ) , aux_type) {
1147
1166
let lib_path = aux_dir. join ( & lib_name) ;
1148
1167
rustc. arg ( format ! ( "-Zcodegen-backend={}" , lib_path. display( ) ) ) ;
@@ -1209,17 +1228,23 @@ impl<'test> TestCx<'test> {
1209
1228
}
1210
1229
1211
1230
/// Builds an aux dependency.
1231
+ ///
1232
+ /// If `aux_type` is `None`, then this will determine the aux-type automatically.
1212
1233
fn build_auxiliary (
1213
1234
& self ,
1214
1235
of : & TestPaths ,
1215
1236
source_path : & str ,
1216
1237
aux_dir : & Path ,
1217
- is_bin : bool ,
1238
+ aux_type : Option < AuxType > ,
1218
1239
) -> AuxType {
1219
1240
let aux_testpaths = self . compute_aux_test_paths ( of, source_path) ;
1220
- let aux_props = self . props . from_aux_file ( & aux_testpaths. file , self . revision , self . config ) ;
1241
+ let mut aux_props =
1242
+ self . props . from_aux_file ( & aux_testpaths. file , self . revision , self . config ) ;
1243
+ if aux_type == Some ( AuxType :: ProcMacro ) {
1244
+ aux_props. force_host = true ;
1245
+ }
1221
1246
let mut aux_dir = aux_dir. to_path_buf ( ) ;
1222
- if is_bin {
1247
+ if aux_type == Some ( AuxType :: Bin ) {
1223
1248
// On unix, the binary of `auxiliary/foo.rs` will be named
1224
1249
// `auxiliary/foo` which clashes with the _dir_ `auxiliary/foo`, so
1225
1250
// put bins in a `bin` subfolder.
@@ -1250,8 +1275,12 @@ impl<'test> TestCx<'test> {
1250
1275
aux_rustc. env_remove ( key) ;
1251
1276
}
1252
1277
1253
- let ( aux_type, crate_type) = if is_bin {
1278
+ let ( aux_type, crate_type) = if aux_type == Some ( AuxType :: Bin ) {
1254
1279
( AuxType :: Bin , Some ( "bin" ) )
1280
+ } else if aux_type == Some ( AuxType :: ProcMacro ) {
1281
+ ( AuxType :: ProcMacro , Some ( "proc-macro" ) )
1282
+ } else if aux_type. is_some ( ) {
1283
+ panic ! ( "aux_type {aux_type:?} not expected" ) ;
1255
1284
} else if aux_props. no_prefer_dynamic {
1256
1285
( AuxType :: Dylib , None )
1257
1286
} else if self . config . target . contains ( "emscripten" )
@@ -1287,6 +1316,11 @@ impl<'test> TestCx<'test> {
1287
1316
aux_rustc. args ( & [ "--crate-type" , crate_type] ) ;
1288
1317
}
1289
1318
1319
+ if aux_type == AuxType :: ProcMacro {
1320
+ // For convenience, but this only works on 2018.
1321
+ aux_rustc. args ( & [ "--extern" , "proc_macro" ] ) ;
1322
+ }
1323
+
1290
1324
aux_rustc. arg ( "-L" ) . arg ( & aux_dir) ;
1291
1325
1292
1326
let auxres = aux_cx. compose_and_run (
@@ -2768,8 +2802,10 @@ enum LinkToAux {
2768
2802
No ,
2769
2803
}
2770
2804
2805
+ #[ derive( Debug , PartialEq ) ]
2771
2806
enum AuxType {
2772
2807
Bin ,
2773
2808
Lib ,
2774
2809
Dylib ,
2810
+ ProcMacro ,
2775
2811
}
0 commit comments