Skip to content

Commit 66e54fd

Browse files
committed
cargo: Use --env-set when we have nightly rustc
1 parent 4390593 commit 66e54fd

File tree

3 files changed

+57
-0
lines changed

3 files changed

+57
-0
lines changed

mesonbuild/backend/ninjabackend.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2204,6 +2204,10 @@ def generate_rust_target(self, target: build.BuildTarget, target_name: str, obj_
22042204
proc_macro_dylib_path,
22052205
project_deps)
22062206

2207+
if any(a == '--env-set' for a in args):
2208+
if mesonlib.version_compare(rustc.version, '>= 1.76') and rustc.is_nightly:
2209+
args.extend(['-Z', 'unstable-options'])
2210+
22072211
compiler_name = self.compiler_to_rule_name(rustc)
22082212
element = NinjaBuildElement(self.all_outputs, target_name, compiler_name, main_rust_file)
22092213
if orderdeps:

mesonbuild/cargo/interpreter.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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)}.p')
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()))

mesonbuild/compilers/rust.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,10 @@ def get_rustdoc(self, env: 'Environment') -> T.Optional[RustdocTestCompiler]:
383383
self.is_cross, self.info, full_version=self.full_version,
384384
linker=self.linker, rustc=self)
385385

386+
def supports_env_set(self) -> bool:
387+
return version_compare(self.version, '>= 1.76') and self.is_nightly
388+
389+
386390
class ClippyRustCompiler(RustCompiler):
387391

388392
"""Clippy is a linter that wraps Rustc.

0 commit comments

Comments
 (0)