1
- mod deserialize_vec ;
1
+ mod deserialize ;
2
2
3
3
use anyhow:: Context ;
4
4
use clap:: Parser ;
5
5
use codeql_extractor:: trap;
6
- use deserialize_vec:: deserialize_newline_or_comma_separated;
7
6
use figment:: {
8
7
providers:: { Env , Format , Serialized , Yaml } ,
9
8
value:: Value ,
@@ -14,7 +13,7 @@ use num_traits::Zero;
14
13
use ra_ap_cfg:: { CfgAtom , CfgDiff } ;
15
14
use ra_ap_ide_db:: FxHashMap ;
16
15
use ra_ap_intern:: Symbol ;
17
- use ra_ap_paths:: { AbsPath , Utf8PathBuf } ;
16
+ use ra_ap_paths:: { AbsPath , AbsPathBuf , Utf8PathBuf } ;
18
17
use ra_ap_project_model:: { CargoConfig , CargoFeatures , CfgOverrides , RustLibSource , Sysroot } ;
19
18
use rust_extractor_macros:: extractor_cli_config;
20
19
use serde:: { Deserialize , Serialize } ;
@@ -51,12 +50,20 @@ pub struct Config {
51
50
pub cargo_target : Option < String > ,
52
51
pub cargo_features : Vec < String > ,
53
52
pub cargo_cfg_overrides : Vec < String > ,
53
+ pub cargo_extra_env : FxHashMap < String , String > ,
54
+ pub cargo_extra_args : Vec < String > ,
55
+ pub cargo_all_targets : bool ,
54
56
pub verbose : u8 ,
55
57
pub compression : Compression ,
56
58
pub inputs : Vec < PathBuf > ,
57
59
pub qltest : bool ,
58
60
pub qltest_cargo_check : bool ,
59
61
pub qltest_dependencies : Vec < String > ,
62
+ pub sysroot : Option < PathBuf > ,
63
+ pub sysroot_src : Option < PathBuf > ,
64
+ pub rustc_src : Option < PathBuf > ,
65
+ pub build_script_command : Vec < String > ,
66
+ pub extra_includes : Vec < PathBuf > ,
60
67
}
61
68
62
69
impl Config {
@@ -87,41 +94,66 @@ impl Config {
87
94
}
88
95
89
96
pub fn to_cargo_config ( & self , dir : & AbsPath ) -> CargoConfig {
90
- let sysroot = Sysroot :: discover ( dir, & FxHashMap :: default ( ) ) ;
91
- let sysroot_src = sysroot. src_root ( ) . map ( ToOwned :: to_owned) ;
92
- let sysroot = sysroot
93
- . root ( )
94
- . map ( ToOwned :: to_owned)
95
- . map ( RustLibSource :: Path ) ;
96
-
97
- let target_dir = self
98
- . cargo_target_dir
99
- . clone ( )
100
- . unwrap_or_else ( || self . scratch_dir . join ( "target" ) ) ;
101
- let target_dir = Utf8PathBuf :: from_path_buf ( target_dir) . ok ( ) ;
97
+ let path_buf_to_abs_path_buf = |path : & PathBuf | {
98
+ let Ok ( path) = Utf8PathBuf :: from_path_buf ( path. clone ( ) ) else {
99
+ panic ! ( "non utf8 input: {}" , path. display( ) )
100
+ } ;
101
+ dir. join ( path)
102
+ } ;
103
+ let sysroot_input = self . sysroot . as_ref ( ) . map ( path_buf_to_abs_path_buf) ;
104
+ let sysroot_src_input = self . sysroot_src . as_ref ( ) . map ( path_buf_to_abs_path_buf) ;
105
+ let rustc_src_input = self . rustc_src . as_ref ( ) . map ( path_buf_to_abs_path_buf) ;
102
106
103
- let features = if self . cargo_features . is_empty ( ) {
104
- Default :: default ( )
105
- } else if self . cargo_features . contains ( & "*" . to_string ( ) ) {
106
- CargoFeatures :: All
107
- } else {
108
- CargoFeatures :: Selected {
109
- features : self . cargo_features . clone ( ) ,
110
- no_default_features : false ,
107
+ let sysroot = match ( sysroot_input, sysroot_src_input) {
108
+ ( None , None ) => Sysroot :: discover ( dir, & self . cargo_extra_env ) ,
109
+ ( Some ( sysroot) , None ) => Sysroot :: discover_sysroot_src_dir ( sysroot) ,
110
+ ( None , Some ( sysroot_src) ) => {
111
+ Sysroot :: discover_with_src_override ( dir, & self . cargo_extra_env , sysroot_src)
111
112
}
113
+ ( Some ( sysroot) , Some ( sysroot_src) ) => Sysroot :: new ( Some ( sysroot) , Some ( sysroot_src) ) ,
112
114
} ;
113
-
114
- let target = self . cargo_target . clone ( ) ;
115
-
116
- let cfg_overrides = to_cfg_overrides ( & self . cargo_cfg_overrides ) ;
117
-
118
115
CargoConfig {
119
- sysroot,
120
- sysroot_src,
121
- target_dir,
122
- features,
123
- target,
124
- cfg_overrides,
116
+ all_targets : self . cargo_all_targets ,
117
+ sysroot_src : sysroot. src_root ( ) . map ( ToOwned :: to_owned) ,
118
+ rustc_source : rustc_src_input
119
+ . or_else ( || sysroot. discover_rustc_src ( ) . map ( AbsPathBuf :: from) )
120
+ . map ( RustLibSource :: Path ) ,
121
+ sysroot : sysroot
122
+ . root ( )
123
+ . map ( ToOwned :: to_owned)
124
+ . map ( RustLibSource :: Path ) ,
125
+
126
+ extra_env : self . cargo_extra_env . clone ( ) ,
127
+ extra_args : self . cargo_extra_args . clone ( ) ,
128
+ extra_includes : self
129
+ . extra_includes
130
+ . iter ( )
131
+ . map ( path_buf_to_abs_path_buf)
132
+ . collect ( ) ,
133
+ target_dir : Utf8PathBuf :: from_path_buf (
134
+ self . cargo_target_dir
135
+ . clone ( )
136
+ . unwrap_or_else ( || self . scratch_dir . join ( "target" ) ) ,
137
+ )
138
+ . ok ( ) ,
139
+ features : if self . cargo_features . is_empty ( ) {
140
+ Default :: default ( )
141
+ } else if self . cargo_features . contains ( & "*" . to_string ( ) ) {
142
+ CargoFeatures :: All
143
+ } else {
144
+ CargoFeatures :: Selected {
145
+ features : self . cargo_features . clone ( ) ,
146
+ no_default_features : false ,
147
+ }
148
+ } ,
149
+ target : self . cargo_target . clone ( ) ,
150
+ cfg_overrides : to_cfg_overrides ( & self . cargo_cfg_overrides ) ,
151
+ wrap_rustc_in_build_scripts : false ,
152
+ run_build_script_command : if self . build_script_command . is_empty ( ) {
153
+ None
154
+ } else {
155
+ Some ( self . build_script_command . clone ( ) )
156
+ } ,
125
157
..Default :: default ( )
126
158
}
127
159
}
0 commit comments