@@ -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 :
@@ -549,6 +550,54 @@ def _create_meson_subdir(self, build: builder.Builder) -> T.List[mparser.BaseNod
549550                      build .block ([build .function ('subdir' , [build .string ('meson' )])]))
550551        ]
551552
553+     def  _pkg_common_env (self , pkg : PackageState , subdir : str ) ->  T .Dict [str , str ]:
554+         # Common variables for build.rs and crates 
555+         # https://doc.rust-lang.org/cargo/reference/environment-variables.html 
556+         out_dir  =  os .path .join (self .environment .build_dir , subdir , f'{ fixup_meson_varname (pkg .manifest .package .name )}  )
557+         os .makedirs (out_dir , exist_ok = True )
558+         version_arr  =  pkg .manifest .package .version .split ('.' )
559+         version_arr  +=  [''  *  (4  -  len (version_arr ))]
560+         return  {
561+             'OUT_DIR' : out_dir ,
562+             'CARGO_MANIFEST_DIR' : os .path .join (self .environment .source_dir , subdir ),
563+             'CARGO_MANIFEST_PATH' : os .path .join (self .environment .source_dir , subdir , 'Cargo.toml' ),
564+             'CARGO_PKG_VERSION' : pkg .manifest .package .version ,
565+             'CARGO_PKG_VERSION_MAJOR' : version_arr [0 ],
566+             'CARGO_PKG_VERSION_MINOR' : version_arr [1 ],
567+             'CARGO_PKG_VERSION_PATCH' : version_arr [2 ],
568+             'CARGO_PKG_VERSION_PRE' : version_arr [3 ],
569+             'CARGO_PKG_AUTHORS' : ',' .join (pkg .manifest .package .authors ),
570+             'CARGO_PKG_NAME' : pkg .manifest .package .name ,
571+             # FIXME: description can contain newlines which breaks ninja. 
572+             #'CARGO_PKG_DESCRIPTION': pkg.manifest.package.description or '', 
573+             'CARGO_PKG_HOMEPAGE' : pkg .manifest .package .homepage  or  '' ,
574+             'CARGO_PKG_REPOSITORY' : pkg .manifest .package .repository  or  '' ,
575+             'CARGO_PKG_LICENSE' : pkg .manifest .package .license  or  '' ,
576+             'CARGO_PKG_LICENSE_FILE' : pkg .manifest .package .license_file  or  '' ,
577+             'CARGO_PKG_RUST_VERSION' : pkg .manifest .package .rust_version  or  '' ,
578+             'CARGO_PKG_README' : pkg .manifest .package .readme  or  '' ,
579+         }
580+ 
581+     def  _create_env_args (self , pkg : PackageState , build : builder .Builder , subdir : str ) ->  T .List [mparser .BaseNode ]:
582+         host_rustc  =  T .cast ('RustCompiler' , self .environment .coredata .compilers [MachineChoice .HOST ]['rust' ])
583+         enable_env_set_args  =  host_rustc .enable_env_set_args ()
584+         if  enable_env_set_args  is  None :
585+             return  [build .assign (build .array ([]), 'env_args' )]
586+         # https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-crates 
587+         env_dict  =  self ._pkg_common_env (pkg , subdir )
588+         env_dict .update ({
589+             'CARGO_CRATE_NAME' : fixup_meson_varname (pkg .manifest .package .name ),
590+             #FIXME: TODO 
591+             #CARGO_BIN_NAME 
592+             #CARGO_BIN_EXE_<name> 
593+             #CARGO_PRIMARY_PACKAGE 
594+             #CARGO_TARGET_TMPDIR 
595+         })
596+         env_args : T .List [mparser .BaseNode ] =  [build .string (a ) for  a  in  enable_env_set_args ]
597+         for  k , v  in  env_dict .items ():
598+             env_args  +=  [build .string ('--env-set' ), build .string (f'{ k } { v }  )]
599+         return  [build .assign (build .array (env_args ), 'env_args' )]
600+ 
552601    def  _create_lib (self , pkg : PackageState , build : builder .Builder , crate_type : raw .CRATE_TYPE ) ->  T .List [mparser .BaseNode ]:
553602        dependencies : T .List [mparser .BaseNode ] =  []
554603        dependency_map : T .Dict [mparser .BaseNode , mparser .BaseNode ] =  {}
@@ -567,6 +616,7 @@ def _create_lib(self, pkg: PackageState, build: builder.Builder, crate_type: raw
567616            build .identifier ('features_args' ),
568617            build .identifier (_extra_args_varname ()),
569618            build .identifier ('system_deps_args' ),
619+             build .identifier ('env_args' ),
570620        ]
571621
572622        dependencies .append (build .identifier (_extra_deps_varname ()))
0 commit comments