@@ -208,13 +208,23 @@ pub(crate) enum PackageType {
208208 Delegate ,
209209}
210210
211+ const CONTRACT_EXTRA_FEATURES : [ & str ; 1 ] = [ "contract" ] ;
212+ const NO_EXTRA_FEATURES : [ & str ; 0 ] = [ ] ;
213+
211214impl PackageType {
212215 pub fn feature ( & self ) -> & ' static str {
213216 match self {
214217 PackageType :: Contract => "freenet-main-contract" ,
215218 PackageType :: Delegate => "freenet-main-delegate" ,
216219 }
217220 }
221+
222+ pub fn extra_features ( & self ) -> & ' static [ & ' static str ] {
223+ match self {
224+ PackageType :: Contract => & CONTRACT_EXTRA_FEATURES ,
225+ PackageType :: Delegate => & NO_EXTRA_FEATURES ,
226+ }
227+ }
218228}
219229
220230impl std:: fmt:: Display for PackageType {
@@ -250,9 +260,10 @@ fn compile_options(cli_config: &BuildToolConfig) -> impl Iterator<Item = String>
250260 . iter ( )
251261 . flat_map ( |s| {
252262 s. split ( ',' )
253- . filter ( |p| * p != cli_config. package_type . feature ( ) )
263+ . filter ( |p| * p != cli_config. package_type . feature ( ) && * p != "contract" )
254264 } )
255- . chain ( [ cli_config. package_type . feature ( ) ] ) ;
265+ . chain ( [ cli_config. package_type . feature ( ) ] )
266+ . chain ( cli_config. package_type . extra_features ( ) . iter ( ) . copied ( ) ) ;
256267 let features = [
257268 "--features" . to_string ( ) ,
258269 feature_list. collect :: < Vec < _ > > ( ) . join ( "," ) ,
@@ -262,7 +273,33 @@ fn compile_options(cli_config: &BuildToolConfig) -> impl Iterator<Item = String>
262273 . chain ( release. iter ( ) . map ( |s| s. to_string ( ) ) )
263274}
264275// TODO: refactor so we share the implementation with fdev (need to extract to )
276+ fn ensure_target_dir_env ( ) {
277+ if std:: env:: var ( TARGET_DIR_VAR ) . is_err ( ) {
278+ let workspace_dir = std:: env:: var ( "CARGO_WORKSPACE_DIR" )
279+ . map ( PathBuf :: from)
280+ . unwrap_or_else ( |_| find_workspace_root ( ) ) ;
281+ let target_dir = workspace_dir. join ( "target" ) ;
282+ std:: env:: set_var ( TARGET_DIR_VAR , & target_dir) ;
283+ }
284+ }
285+
286+ fn find_workspace_root ( ) -> PathBuf {
287+ let manifest_dir = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) ;
288+ manifest_dir
289+ . ancestors ( )
290+ . find ( |dir| {
291+ let cargo_toml = dir. join ( "Cargo.toml" ) ;
292+ cargo_toml. exists ( )
293+ && std:: fs:: read_to_string ( & cargo_toml)
294+ . map ( |contents| contents. contains ( "[workspace]" ) )
295+ . unwrap_or ( false )
296+ } )
297+ . expect ( "Could not determine workspace root from manifest directory" )
298+ . to_path_buf ( )
299+ }
300+
265301fn compile_contract ( contract_path : & PathBuf ) -> anyhow:: Result < Vec < u8 > > {
302+ ensure_target_dir_env ( ) ;
266303 println ! ( "module path: {contract_path:?}" ) ;
267304 let target = std:: env:: var ( TARGET_DIR_VAR )
268305 . map_err ( |_| anyhow:: anyhow!( "CARGO_TARGET_DIR should be set" ) ) ?;
0 commit comments