@@ -272,7 +272,8 @@ pub trait CommandExt: Sized {
272
272
} ;
273
273
self . _arg (
274
274
optional_multi_opt ( "target" , "TRIPLE" , target)
275
- . help_heading ( heading:: COMPILATION_OPTIONS ) ,
275
+ . help_heading ( heading:: COMPILATION_OPTIONS )
276
+ . add ( clap_complete:: ArgValueCandidates :: new ( get_target_triples) ) ,
276
277
)
277
278
. _arg ( unsupported_short_arg)
278
279
}
@@ -1067,6 +1068,62 @@ fn get_targets_from_metadata() -> CargoResult<Vec<Target>> {
1067
1068
Ok ( targets)
1068
1069
}
1069
1070
1071
+ fn get_target_triples ( ) -> Vec < clap_complete:: CompletionCandidate > {
1072
+ let mut candidates = Vec :: new ( ) ;
1073
+
1074
+ if is_rustup ( ) {
1075
+ if let Ok ( targets) = get_target_triples_from_rustup ( ) {
1076
+ candidates. extend ( targets) ;
1077
+ }
1078
+ } else {
1079
+ if let Ok ( targets) = get_target_triples_from_rustc ( ) {
1080
+ candidates. extend ( targets) ;
1081
+ }
1082
+ }
1083
+
1084
+ candidates
1085
+ }
1086
+
1087
+ fn get_target_triples_from_rustup ( ) -> CargoResult < Vec < clap_complete:: CompletionCandidate > > {
1088
+ let output = std:: process:: Command :: new ( "rustup" )
1089
+ . arg ( "target" )
1090
+ . arg ( "list" )
1091
+ . output ( ) ?;
1092
+
1093
+ if !output. status . success ( ) {
1094
+ return Ok ( vec ! [ ] ) ;
1095
+ }
1096
+
1097
+ let stdout = String :: from_utf8 ( output. stdout ) ?;
1098
+
1099
+ Ok ( stdout
1100
+ . lines ( )
1101
+ . map ( |line| {
1102
+ let target = line. split_once ( ' ' ) ;
1103
+ match target {
1104
+ None => clap_complete:: CompletionCandidate :: new ( line. to_owned ( ) ) . hide ( true ) ,
1105
+ Some ( ( target, _installed) ) => clap_complete:: CompletionCandidate :: new ( target) ,
1106
+ }
1107
+ } )
1108
+ . collect ( ) )
1109
+ }
1110
+
1111
+ fn get_target_triples_from_rustc ( ) -> CargoResult < Vec < clap_complete:: CompletionCandidate > > {
1112
+ let cwd = std:: env:: current_dir ( ) ?;
1113
+ let gctx = GlobalContext :: new ( shell:: Shell :: new ( ) , cwd. clone ( ) , cargo_home_with_cwd ( & cwd) ?) ;
1114
+ let ws = Workspace :: new ( & find_root_manifest_for_wd ( & PathBuf :: from ( & cwd) ) ?, & gctx) ;
1115
+
1116
+ let rustc = gctx. load_global_rustc ( ws. as_ref ( ) . ok ( ) ) ?;
1117
+
1118
+ let ( stdout, _stderr) =
1119
+ rustc. cached_output ( rustc. process ( ) . arg ( "--print" ) . arg ( "target-list" ) , 0 ) ?;
1120
+
1121
+ Ok ( stdout
1122
+ . lines ( )
1123
+ . map ( |line| clap_complete:: CompletionCandidate :: new ( line. to_owned ( ) ) )
1124
+ . collect ( ) )
1125
+ }
1126
+
1070
1127
#[ track_caller]
1071
1128
pub fn ignore_unknown < T : Default > ( r : Result < T , clap:: parser:: MatchesError > ) -> T {
1072
1129
match r {
0 commit comments