@@ -137,6 +137,7 @@ def _create_package(self, pkg: PackageState, build: builder.Builder, subdir: str
137137        ]
138138        ast  +=  self ._create_dependencies (pkg , build )
139139        ast  +=  self ._create_meson_subdir (build )
140+         ast  +=  self ._create_env_args (pkg , build , subdir )
140141
141142        if  pkg .manifest .lib :
142143            for  crate_type  in  pkg .manifest .lib .crate_type :
@@ -560,6 +561,53 @@ def _create_meson_subdir(self, build: builder.Builder) -> T.List[mparser.BaseNod
560561                      build .block ([build .function ('subdir' , [build .string ('meson' )])]))
561562        ]
562563
564+     def  _pkg_common_env (self , pkg : PackageState , subdir : str ) ->  T .Dict [str , str ]:
565+         # Common variables for build.rs and crates 
566+         # https://doc.rust-lang.org/cargo/reference/environment-variables.html 
567+         out_dir  =  os .path .join (self .environment .build_dir , subdir , f'{ fixup_meson_varname (pkg .manifest .package .name )}  )
568+         os .makedirs (out_dir , exist_ok = True )
569+         version_arr  =  pkg .manifest .package .version .split ('.' )
570+         version_arr  +=  [''  *  (4  -  len (version_arr ))]
571+         return  {
572+             'OUT_DIR' : out_dir ,
573+             'CARGO_MANIFEST_DIR' : os .path .join (self .environment .source_dir , subdir ),
574+             'CARGO_MANIFEST_PATH' : os .path .join (self .environment .source_dir , subdir , 'Cargo.toml' ),
575+             'CARGO_PKG_VERSION' : pkg .manifest .package .version ,
576+             'CARGO_PKG_VERSION_MAJOR' : version_arr [0 ],
577+             'CARGO_PKG_VERSION_MINOR' : version_arr [1 ],
578+             'CARGO_PKG_VERSION_PATCH' : version_arr [2 ],
579+             'CARGO_PKG_VERSION_PRE' : version_arr [3 ],
580+             'CARGO_PKG_AUTHORS' : ',' .join (pkg .manifest .package .authors ),
581+             'CARGO_PKG_NAME' : pkg .manifest .package .name ,
582+             # FIXME: description can contain newlines which breaks ninja. 
583+             #'CARGO_PKG_DESCRIPTION': pkg.manifest.package.description or '', 
584+             'CARGO_PKG_HOMEPAGE' : pkg .manifest .package .homepage  or  '' ,
585+             'CARGO_PKG_REPOSITORY' : pkg .manifest .package .repository  or  '' ,
586+             'CARGO_PKG_LICENSE' : pkg .manifest .package .license  or  '' ,
587+             'CARGO_PKG_LICENSE_FILE' : pkg .manifest .package .license_file  or  '' ,
588+             'CARGO_PKG_RUST_VERSION' : pkg .manifest .package .rust_version  or  '' ,
589+             'CARGO_PKG_README' : pkg .manifest .package .readme  or  '' ,
590+         }
591+ 
592+     def  _create_env_args (self , pkg : PackageState , build : builder .Builder , subdir : str ) ->  T .List [mparser .BaseNode ]:
593+         host_rustc  =  T .cast ('RustCompiler' , self .environment .coredata .compilers [MachineChoice .HOST ]['rust' ])
594+         if  not  host_rustc .supports_env_set ():
595+             return  []
596+         # https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-crates 
597+         env_dict  =  self ._pkg_common_env (pkg , subdir )
598+         env_dict .update ({
599+             'CARGO_CRATE_NAME'  : fixup_meson_varname (pkg .manifest .package .name ),
600+             #FIXME: TODO 
601+             #CARGO_BIN_NAME 
602+             #CARGO_BIN_EXE_<name> 
603+             #CARGO_PRIMARY_PACKAGE 
604+             #CARGO_TARGET_TMPDIR 
605+         })
606+         env_args : T .List [mparser .BaseNode ] =  []
607+         for  k , v  in  env_dict .items ():
608+             env_args  +=  [build .string ('--env-set' ), build .string (f'{ k } { v }  )]
609+         return  [build .assign (build .array (env_args ), 'env_args' )]
610+ 
563611    def  _create_lib (self , pkg : PackageState , build : builder .Builder , crate_type : raw .CRATE_TYPE ) ->  T .List [mparser .BaseNode ]:
564612        dependencies : T .List [mparser .BaseNode ] =  []
565613        dependency_map : T .Dict [mparser .BaseNode , mparser .BaseNode ] =  {}
@@ -578,6 +626,7 @@ def _create_lib(self, pkg: PackageState, build: builder.Builder, crate_type: raw
578626            build .identifier ('features_args' ),
579627            build .identifier (_extra_args_varname ()),
580628            build .identifier ('system_deps_args' ),
629+             build .identifier ('env_args' ),
581630        ]
582631
583632        dependencies .append (build .identifier (_extra_deps_varname ()))
0 commit comments