1- mod deserialize_vec ;
1+ mod deserialize ;
22
33use anyhow:: Context ;
44use clap:: Parser ;
55use codeql_extractor:: trap;
6- use deserialize_vec:: deserialize_newline_or_comma_separated;
76use figment:: {
87 providers:: { Env , Format , Serialized , Yaml } ,
98 value:: Value ,
@@ -14,7 +13,7 @@ use num_traits::Zero;
1413use ra_ap_cfg:: { CfgAtom , CfgDiff } ;
1514use ra_ap_ide_db:: FxHashMap ;
1615use ra_ap_intern:: Symbol ;
17- use ra_ap_paths:: { AbsPath , Utf8PathBuf } ;
16+ use ra_ap_paths:: { AbsPath , AbsPathBuf , Utf8PathBuf } ;
1817use ra_ap_project_model:: { CargoConfig , CargoFeatures , CfgOverrides , RustLibSource , Sysroot } ;
1918use rust_extractor_macros:: extractor_cli_config;
2019use serde:: { Deserialize , Serialize } ;
@@ -51,12 +50,20 @@ pub struct Config {
5150 pub cargo_target : Option < String > ,
5251 pub cargo_features : Vec < String > ,
5352 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 ,
5456 pub verbose : u8 ,
5557 pub compression : Compression ,
5658 pub inputs : Vec < PathBuf > ,
5759 pub qltest : bool ,
5860 pub qltest_cargo_check : bool ,
5961 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 > ,
6067}
6168
6269impl Config {
@@ -87,41 +94,66 @@ impl Config {
8794 }
8895
8996 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) ;
102106
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)
111112 }
113+ ( Some ( sysroot) , Some ( sysroot_src) ) => Sysroot :: new ( Some ( sysroot) , Some ( sysroot_src) ) ,
112114 } ;
113-
114- let target = self . cargo_target . clone ( ) ;
115-
116- let cfg_overrides = to_cfg_overrides ( & self . cargo_cfg_overrides ) ;
117-
118115 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+ } ,
125157 ..Default :: default ( )
126158 }
127159 }
0 commit comments