Update to Rust 1.80, make check-cfg unconditional.

This commit is contained in:
Dario Nieuwenhuis 2024-07-25 15:53:00 +02:00
parent 8b4bb625be
commit 2d678d6956
12 changed files with 22 additions and 111 deletions

6
ci.sh
View File

@ -10,12 +10,6 @@ if ! command -v cargo-batch &> /dev/null; then
exit 1 exit 1
fi fi
# check-cfg is stable on rustc 1.79 but not cargo 1.79.
# however, our cargo-batch is currently based on cargo 1.80, which does support check-cfg.
# so, force build.rs scripts to emit check-cfg commands.
# when 1.80 hits stable we can make build.rs unconditionally emit check-cfg and remove all this.
export EMBASSY_FORCE_CHECK_CFG=1
export RUSTFLAGS=-Dwarnings export RUSTFLAGS=-Dwarnings
export DEFMT_LOG=trace,embassy_hal_internal=debug,embassy_net_esp_hosted=debug,cyw43=info,cyw43_pio=info,smoltcp=info export DEFMT_LOG=trace,embassy_hal_internal=debug,embassy_net_esp_hosted=debug,cyw43=info,cyw43_pio=info,smoltcp=info
if [[ -z "${CARGO_TARGET_DIR}" ]]; then if [[ -z "${CARGO_TARGET_DIR}" ]]; then

View File

@ -8,8 +8,6 @@
use std::collections::HashSet; use std::collections::HashSet;
use std::env; use std::env;
use std::ffi::OsString;
use std::process::Command;
/// Helper for emitting cargo instruction for enabling configs (`cargo:rustc-cfg=X`) and declaring /// Helper for emitting cargo instruction for enabling configs (`cargo:rustc-cfg=X`) and declaring
/// them (`cargo:rust-check-cfg=cfg(X)`). /// them (`cargo:rust-check-cfg=cfg(X)`).
@ -17,7 +15,6 @@ use std::process::Command;
pub struct CfgSet { pub struct CfgSet {
enabled: HashSet<String>, enabled: HashSet<String>,
declared: HashSet<String>, declared: HashSet<String>,
emit_declared: bool,
} }
impl CfgSet { impl CfgSet {
@ -25,7 +22,6 @@ impl CfgSet {
Self { Self {
enabled: HashSet::new(), enabled: HashSet::new(),
declared: HashSet::new(), declared: HashSet::new(),
emit_declared: is_rustc_nightly(),
} }
} }
@ -49,7 +45,7 @@ impl CfgSet {
/// ///
/// This enables rustc to check that the configs in `#[cfg(...)]` attributes are valid. /// This enables rustc to check that the configs in `#[cfg(...)]` attributes are valid.
pub fn declare(&mut self, cfg: impl AsRef<str>) { pub fn declare(&mut self, cfg: impl AsRef<str>) {
if self.declared.insert(cfg.as_ref().to_owned()) && self.emit_declared { if self.declared.insert(cfg.as_ref().to_owned()) {
println!("cargo:rustc-check-cfg=cfg({})", cfg.as_ref()); println!("cargo:rustc-check-cfg=cfg({})", cfg.as_ref());
} }
} }
@ -69,21 +65,6 @@ impl CfgSet {
} }
} }
fn is_rustc_nightly() -> bool {
if env::var_os("EMBASSY_FORCE_CHECK_CFG").is_some() {
return true;
}
let rustc = env::var_os("RUSTC").unwrap_or_else(|| OsString::from("rustc"));
let output = Command::new(rustc)
.arg("--version")
.output()
.expect("failed to run `rustc --version`");
String::from_utf8_lossy(&output.stdout).contains("nightly")
}
/// Sets configs that describe the target platform. /// Sets configs that describe the target platform.
pub fn set_target_cfgs(cfgs: &mut CfgSet) { pub fn set_target_cfgs(cfgs: &mut CfgSet) {
let target = env::var("TARGET").unwrap(); let target = env::var("TARGET").unwrap();

View File

@ -8,8 +8,6 @@
use std::collections::HashSet; use std::collections::HashSet;
use std::env; use std::env;
use std::ffi::OsString;
use std::process::Command;
/// Helper for emitting cargo instruction for enabling configs (`cargo:rustc-cfg=X`) and declaring /// Helper for emitting cargo instruction for enabling configs (`cargo:rustc-cfg=X`) and declaring
/// them (`cargo:rust-check-cfg=cfg(X)`). /// them (`cargo:rust-check-cfg=cfg(X)`).
@ -17,7 +15,6 @@ use std::process::Command;
pub struct CfgSet { pub struct CfgSet {
enabled: HashSet<String>, enabled: HashSet<String>,
declared: HashSet<String>, declared: HashSet<String>,
emit_declared: bool,
} }
impl CfgSet { impl CfgSet {
@ -25,7 +22,6 @@ impl CfgSet {
Self { Self {
enabled: HashSet::new(), enabled: HashSet::new(),
declared: HashSet::new(), declared: HashSet::new(),
emit_declared: is_rustc_nightly(),
} }
} }
@ -49,7 +45,7 @@ impl CfgSet {
/// ///
/// This enables rustc to check that the configs in `#[cfg(...)]` attributes are valid. /// This enables rustc to check that the configs in `#[cfg(...)]` attributes are valid.
pub fn declare(&mut self, cfg: impl AsRef<str>) { pub fn declare(&mut self, cfg: impl AsRef<str>) {
if self.declared.insert(cfg.as_ref().to_owned()) && self.emit_declared { if self.declared.insert(cfg.as_ref().to_owned()) {
println!("cargo:rustc-check-cfg=cfg({})", cfg.as_ref()); println!("cargo:rustc-check-cfg=cfg({})", cfg.as_ref());
} }
} }
@ -69,21 +65,6 @@ impl CfgSet {
} }
} }
fn is_rustc_nightly() -> bool {
if env::var_os("EMBASSY_FORCE_CHECK_CFG").is_some() {
return true;
}
let rustc = env::var_os("RUSTC").unwrap_or_else(|| OsString::from("rustc"));
let output = Command::new(rustc)
.arg("--version")
.output()
.expect("failed to run `rustc --version`");
String::from_utf8_lossy(&output.stdout).contains("nightly")
}
/// Sets configs that describe the target platform. /// Sets configs that describe the target platform.
pub fn set_target_cfgs(cfgs: &mut CfgSet) { pub fn set_target_cfgs(cfgs: &mut CfgSet) {
let target = env::var("TARGET").unwrap(); let target = env::var("TARGET").unwrap();

View File

@ -312,13 +312,13 @@ impl<'d, T: Instance> I2c<'d, T, Async> {
} }
} }
/// Read from address into buffer using DMA. /// Read from address into buffer asynchronously.
pub async fn read_async(&mut self, addr: impl Into<u16>, buffer: &mut [u8]) -> Result<(), Error> { pub async fn read_async(&mut self, addr: impl Into<u16>, buffer: &mut [u8]) -> Result<(), Error> {
Self::setup(addr.into())?; Self::setup(addr.into())?;
self.read_async_internal(buffer, true, true).await self.read_async_internal(buffer, true, true).await
} }
/// Write to address from buffer using DMA. /// Write to address from buffer asynchronously.
pub async fn write_async( pub async fn write_async(
&mut self, &mut self,
addr: impl Into<u16>, addr: impl Into<u16>,
@ -328,7 +328,7 @@ impl<'d, T: Instance> I2c<'d, T, Async> {
self.write_async_internal(bytes, true).await self.write_async_internal(bytes, true).await
} }
/// Write to address from bytes and read from address into buffer using DMA. /// Write to address from bytes and read from address into buffer asynchronously.
pub async fn write_read_async( pub async fn write_read_async(
&mut self, &mut self,
addr: impl Into<u16>, addr: impl Into<u16>,
@ -779,9 +779,6 @@ pub fn i2c_reserved_addr(addr: u16) -> bool {
} }
pub(crate) trait SealedInstance { pub(crate) trait SealedInstance {
const TX_DREQ: u8;
const RX_DREQ: u8;
fn regs() -> crate::pac::i2c::I2c; fn regs() -> crate::pac::i2c::I2c;
fn reset() -> crate::pac::resets::regs::Peripherals; fn reset() -> crate::pac::resets::regs::Peripherals;
fn waker() -> &'static AtomicWaker; fn waker() -> &'static AtomicWaker;
@ -816,11 +813,8 @@ pub trait Instance: SealedInstance {
} }
macro_rules! impl_instance { macro_rules! impl_instance {
($type:ident, $irq:ident, $reset:ident, $tx_dreq:expr, $rx_dreq:expr) => { ($type:ident, $irq:ident, $reset:ident) => {
impl SealedInstance for peripherals::$type { impl SealedInstance for peripherals::$type {
const TX_DREQ: u8 = $tx_dreq;
const RX_DREQ: u8 = $rx_dreq;
#[inline] #[inline]
fn regs() -> pac::i2c::I2c { fn regs() -> pac::i2c::I2c {
pac::$type pac::$type
@ -846,8 +840,8 @@ macro_rules! impl_instance {
}; };
} }
impl_instance!(I2C0, I2C0_IRQ, set_i2c0, 32, 33); impl_instance!(I2C0, I2C0_IRQ, set_i2c0);
impl_instance!(I2C1, I2C1_IRQ, set_i2c1, 34, 35); impl_instance!(I2C1, I2C1_IRQ, set_i2c1);
/// SDA pin. /// SDA pin.
pub trait SdaPin<T: Instance>: crate::gpio::Pin {} pub trait SdaPin<T: Instance>: crate::gpio::Pin {}

View File

@ -8,8 +8,6 @@
use std::collections::HashSet; use std::collections::HashSet;
use std::env; use std::env;
use std::ffi::OsString;
use std::process::Command;
/// Helper for emitting cargo instruction for enabling configs (`cargo:rustc-cfg=X`) and declaring /// Helper for emitting cargo instruction for enabling configs (`cargo:rustc-cfg=X`) and declaring
/// them (`cargo:rust-check-cfg=cfg(X)`). /// them (`cargo:rust-check-cfg=cfg(X)`).
@ -17,7 +15,6 @@ use std::process::Command;
pub struct CfgSet { pub struct CfgSet {
enabled: HashSet<String>, enabled: HashSet<String>,
declared: HashSet<String>, declared: HashSet<String>,
emit_declared: bool,
} }
impl CfgSet { impl CfgSet {
@ -25,7 +22,6 @@ impl CfgSet {
Self { Self {
enabled: HashSet::new(), enabled: HashSet::new(),
declared: HashSet::new(), declared: HashSet::new(),
emit_declared: is_rustc_nightly(),
} }
} }
@ -49,7 +45,7 @@ impl CfgSet {
/// ///
/// This enables rustc to check that the configs in `#[cfg(...)]` attributes are valid. /// This enables rustc to check that the configs in `#[cfg(...)]` attributes are valid.
pub fn declare(&mut self, cfg: impl AsRef<str>) { pub fn declare(&mut self, cfg: impl AsRef<str>) {
if self.declared.insert(cfg.as_ref().to_owned()) && self.emit_declared { if self.declared.insert(cfg.as_ref().to_owned()) {
println!("cargo:rustc-check-cfg=cfg({})", cfg.as_ref()); println!("cargo:rustc-check-cfg=cfg({})", cfg.as_ref());
} }
} }
@ -69,21 +65,6 @@ impl CfgSet {
} }
} }
fn is_rustc_nightly() -> bool {
if env::var_os("EMBASSY_FORCE_CHECK_CFG").is_some() {
return true;
}
let rustc = env::var_os("RUSTC").unwrap_or_else(|| OsString::from("rustc"));
let output = Command::new(rustc)
.arg("--version")
.output()
.expect("failed to run `rustc --version`");
String::from_utf8_lossy(&output.stdout).contains("nightly")
}
/// Sets configs that describe the target platform. /// Sets configs that describe the target platform.
pub fn set_target_cfgs(cfgs: &mut CfgSet) { pub fn set_target_cfgs(cfgs: &mut CfgSet) {
let target = env::var("TARGET").unwrap(); let target = env::var("TARGET").unwrap();

View File

@ -2,6 +2,7 @@
#![macro_use] #![macro_use]
#![allow(missing_docs)] // TODO #![allow(missing_docs)] // TODO
#![cfg_attr(adc_f3_v2, allow(unused))]
#[cfg(not(adc_f3_v2))] #[cfg(not(adc_f3_v2))]
#[cfg_attr(adc_f1, path = "f1.rs")] #[cfg_attr(adc_f1, path = "f1.rs")]

View File

@ -45,6 +45,7 @@ pub struct OpAmpOutput<'d, T: Instance> {
/// OpAmp internal outputs, wired directly to ADC inputs. /// OpAmp internal outputs, wired directly to ADC inputs.
/// ///
/// This struct can be used as an ADC input. /// This struct can be used as an ADC input.
#[cfg(opamp_g4)]
pub struct OpAmpInternalOutput<'d, T: Instance> { pub struct OpAmpInternalOutput<'d, T: Instance> {
_inner: &'d OpAmp<'d, T>, _inner: &'d OpAmp<'d, T>,
} }
@ -184,6 +185,7 @@ impl<'d, T: Instance> Drop for OpAmpOutput<'d, T> {
} }
} }
#[cfg(opamp_g4)]
impl<'d, T: Instance> Drop for OpAmpInternalOutput<'d, T> { impl<'d, T: Instance> Drop for OpAmpInternalOutput<'d, T> {
fn drop(&mut self) { fn drop(&mut self) {
T::regs().csr().modify(|w| { T::regs().csr().modify(|w| {

View File

@ -1060,10 +1060,6 @@ pub(crate) trait SealedInstance {
const REGS: Regs; const REGS: Regs;
} }
trait SealedWord {
const CONFIG: u8;
}
/// OSPI instance trait. /// OSPI instance trait.
#[allow(private_bounds)] #[allow(private_bounds)]
pub trait Instance: Peripheral<P = Self> + SealedInstance + RccPeripheral {} pub trait Instance: Peripheral<P = Self> + SealedInstance + RccPeripheral {}
@ -1110,17 +1106,14 @@ impl<'d, T: Instance, M: PeriMode> GetConfig for Ospi<'d, T, M> {
/// Word sizes usable for OSPI. /// Word sizes usable for OSPI.
#[allow(private_bounds)] #[allow(private_bounds)]
pub trait Word: word::Word + SealedWord {} pub trait Word: word::Word {}
macro_rules! impl_word { macro_rules! impl_word {
($T:ty, $config:expr) => { ($T:ty) => {
impl SealedWord for $T {
const CONFIG: u8 = $config;
}
impl Word for $T {} impl Word for $T {}
}; };
} }
impl_word!(u8, 8); impl_word!(u8);
impl_word!(u16, 16); impl_word!(u16);
impl_word!(u32, 32); impl_word!(u32);

View File

@ -1282,6 +1282,7 @@ pub(crate) struct Info {
struct State {} struct State {}
impl State { impl State {
#[allow(unused)]
const fn new() -> Self { const fn new() -> Self {
Self {} Self {}
} }

View File

@ -8,8 +8,6 @@
use std::collections::HashSet; use std::collections::HashSet;
use std::env; use std::env;
use std::ffi::OsString;
use std::process::Command;
/// Helper for emitting cargo instruction for enabling configs (`cargo:rustc-cfg=X`) and declaring /// Helper for emitting cargo instruction for enabling configs (`cargo:rustc-cfg=X`) and declaring
/// them (`cargo:rust-check-cfg=cfg(X)`). /// them (`cargo:rust-check-cfg=cfg(X)`).
@ -17,7 +15,6 @@ use std::process::Command;
pub struct CfgSet { pub struct CfgSet {
enabled: HashSet<String>, enabled: HashSet<String>,
declared: HashSet<String>, declared: HashSet<String>,
emit_declared: bool,
} }
impl CfgSet { impl CfgSet {
@ -25,7 +22,6 @@ impl CfgSet {
Self { Self {
enabled: HashSet::new(), enabled: HashSet::new(),
declared: HashSet::new(), declared: HashSet::new(),
emit_declared: is_rustc_nightly(),
} }
} }
@ -49,7 +45,7 @@ impl CfgSet {
/// ///
/// This enables rustc to check that the configs in `#[cfg(...)]` attributes are valid. /// This enables rustc to check that the configs in `#[cfg(...)]` attributes are valid.
pub fn declare(&mut self, cfg: impl AsRef<str>) { pub fn declare(&mut self, cfg: impl AsRef<str>) {
if self.declared.insert(cfg.as_ref().to_owned()) && self.emit_declared { if self.declared.insert(cfg.as_ref().to_owned()) {
println!("cargo:rustc-check-cfg=cfg({})", cfg.as_ref()); println!("cargo:rustc-check-cfg=cfg({})", cfg.as_ref());
} }
} }
@ -69,21 +65,6 @@ impl CfgSet {
} }
} }
fn is_rustc_nightly() -> bool {
if env::var_os("EMBASSY_FORCE_CHECK_CFG").is_some() {
return true;
}
let rustc = env::var_os("RUSTC").unwrap_or_else(|| OsString::from("rustc"));
let output = Command::new(rustc)
.arg("--version")
.output()
.expect("failed to run `rustc --version`");
String::from_utf8_lossy(&output.stdout).contains("nightly")
}
/// Sets configs that describe the target platform. /// Sets configs that describe the target platform.
pub fn set_target_cfgs(cfgs: &mut CfgSet) { pub fn set_target_cfgs(cfgs: &mut CfgSet) {
let target = env::var("TARGET").unwrap(); let target = env::var("TARGET").unwrap();

View File

@ -278,6 +278,7 @@ pub enum DescriptorType {
/// Table 5. Descriptor set information structure. /// Table 5. Descriptor set information structure.
#[allow(non_snake_case)] #[allow(non_snake_case)]
#[allow(unused)]
#[repr(C, packed(1))] #[repr(C, packed(1))]
pub struct DescriptorSetInformation { pub struct DescriptorSetInformation {
dwWindowsVersion: u32, dwWindowsVersion: u32,
@ -288,6 +289,7 @@ pub struct DescriptorSetInformation {
/// Table 4. Microsoft OS 2.0 platform capability descriptor header. /// Table 4. Microsoft OS 2.0 platform capability descriptor header.
#[allow(non_snake_case)] #[allow(non_snake_case)]
#[allow(unused)]
#[repr(C, packed(1))] #[repr(C, packed(1))]
pub struct PlatformDescriptor { pub struct PlatformDescriptor {
bLength: u8, bLength: u8,

View File

@ -1,5 +1,5 @@
[toolchain] [toolchain]
channel = "1.79" channel = "1.80"
components = [ "rust-src", "rustfmt", "llvm-tools" ] components = [ "rust-src", "rustfmt", "llvm-tools" ]
targets = [ targets = [
"thumbv7em-none-eabi", "thumbv7em-none-eabi",