Skip to content

Commit 4cb42f7

Browse files
committed
cargo: Use --env-set when we have nightly rustc
1 parent 1e7f6f0 commit 4cb42f7

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

mesonbuild/cargo/interpreter.py

Lines changed: 50 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:
@@ -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)}.p')
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()))

mesonbuild/compilers/rust.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,15 @@ 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 enable_env_set_args(self) -> T.Optional[T.List[str]]:
387+
'''Extra arguments to enable --env-set support in rustc.
388+
Returns None if not supported.
389+
'''
390+
if version_compare(self.version, '>= 1.76') and self.is_nightly:
391+
return ['-Z', 'unstable-options']
392+
return None
393+
394+
386395
class ClippyRustCompiler(RustCompiler):
387396

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

0 commit comments

Comments
 (0)