@@ -33,6 +33,84 @@ fn main() {
3333 println ! ( "cargo::rustc-check-cfg=cfg(test)" ) ;
3434 println ! ( "cargo:rerun-if-changed=build.rs" ) ;
3535
36+ // Check feature usage.
37+ //
38+ // Helps both document inter-feature relations, and stop builds ASAP if invariants are not
39+ // fulfilled. For the developer, this leads to more straightforward error messages.
40+ //
41+ // Reference: Cargo features > https://embassy.dev/trouble/#_cargo_features
42+ {
43+ // 'scan' needs 'central'
44+ #[ cfg( all( feature = "scan" , not( feature = "central" ) ) ) ]
45+ compile_error ! ( "Feature 'scan' also needs 'central' to be enabled." ) ;
46+
47+ // Also in 'fmt.rs'
48+ #[ cfg( all( feature = "defmt" , feature = "log" ) ) ]
49+ compile_error ! ( "You may not enable both `defmt` and `log` features." ) ;
50+
51+ // Also in 'lib.rs'
52+ #[ cfg( not( any( feature = "central" , feature = "peripheral" ) ) ) ]
53+ compile_error ! ( "Must enable at least one of: `central`, `peripheral`" ) ;
54+
55+ //...
56+
57+ // Only one of (or none) 'default-packet-pool-size-{X}' is allowed
58+ {
59+ let n = 0 ;
60+ #[ cfg( feature = "default-packet-pool-size-1" ) ]
61+ let n = n+1 ;
62+ #[ cfg( feature = "default-packet-pool-size-2" ) ]
63+ let n = n+1 ;
64+ #[ cfg( feature = "default-packet-pool-size-4" ) ]
65+ let n = n+1 ;
66+ #[ cfg( feature = "default-packet-pool-size-8" ) ]
67+ let n = n+1 ;
68+ #[ cfg( feature = "default-packet-pool-size-16" ) ]
69+ let n = n+1 ;
70+ #[ cfg( feature = "default-packet-pool-size-32" ) ]
71+ let n = n+1 ;
72+ #[ cfg( feature = "default-packet-pool-size-64" ) ]
73+ let n = n+1 ;
74+ #[ cfg( feature = "default-packet-pool-size-128" ) ]
75+ let n = n+1 ;
76+
77+ assert ! ( n <= 1 , "📍 More than one 'default-packet-pool-size-X' feature is enabled." ) ;
78+
79+ #[ cfg( not( feature = "default-packet-pool" ) ) ]
80+ if n>0 {
81+ panic ! ( "📍 'default-packet-pool-size-{{X}}' feature also needs 'default-packet-pool' to be enabled." ) ;
82+ }
83+ }
84+
85+ // Only one of (or none) 'default-packet-pool-mtu-{X}' is allowed
86+ {
87+ let n = 0 ;
88+ #[ cfg( feature = "default-packet-pool-mtu-27" ) ]
89+ let n = n+1 ;
90+ #[ cfg( feature = "default-packet-pool-mtu-48" ) ]
91+ let n = n+1 ;
92+ #[ cfg( feature = "default-packet-pool-mtu-64" ) ]
93+ let n = n+1 ;
94+ #[ cfg( feature = "default-packet-pool-mtu-128" ) ]
95+ let n = n+1 ;
96+ #[ cfg( feature = "default-packet-pool-mtu-251" ) ]
97+ let n = n+1 ;
98+ #[ cfg( feature = "default-packet-pool-mtu-255" ) ]
99+ let n = n+1 ;
100+ #[ cfg( feature = "default-packet-pool-mtu-512" ) ]
101+ let n = n+1 ;
102+ #[ cfg( feature = "default-packet-pool-mtu-1024" ) ]
103+ let n = n+1 ;
104+
105+ assert ! ( n <= 1 , "📍 More than one 'default-packet-pool-mtu-X' feature is enabled." ) ;
106+
107+ #[ cfg( not( feature = "default-packet-pool" ) ) ]
108+ if n>0 {
109+ panic ! ( "📍 'default-packet-pool-mtu-{{X}}' feature also needs 'default-packet-pool' to be enabled." ) ;
110+ }
111+ }
112+ }
113+
36114 // Rebuild if config envvar changed.
37115 for ( name, _) in CONFIGS {
38116 println ! ( "cargo:rerun-if-env-changed={crate_name}_{name}" ) ;
0 commit comments