Skip to content

Commit 877125b

Browse files
finalyardslulf
authored andcommitted
Early check of 'host' feature inconsistencies.
1 parent 7f751c4 commit 877125b

File tree

2 files changed

+95
-17
lines changed

2 files changed

+95
-17
lines changed

host/Cargo.toml

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ central = []
6767
# Enable GATT support
6868
gatt = []
6969
# Enable scan support
70-
scan = []
70+
scan = ["central"]
7171
# Enable macros
7272
derive = ["trouble-host-macros"]
7373
# Enable controller-to-host flow control
@@ -122,24 +122,24 @@ l2cap-tx-queue-size-32 = []
122122
l2cap-tx-queue-size-64 = []
123123

124124
# Controls the pool size of the default packet pool, if enabled.
125-
default-packet-pool-size-1 = []
126-
default-packet-pool-size-2 = []
127-
default-packet-pool-size-4 = []
128-
default-packet-pool-size-8 = []
129-
default-packet-pool-size-16 = [] # Default
130-
default-packet-pool-size-32 = []
131-
default-packet-pool-size-64 = []
132-
default-packet-pool-size-128 = []
125+
default-packet-pool-size-1 = ["default-packet-pool"]
126+
default-packet-pool-size-2 = ["default-packet-pool"]
127+
default-packet-pool-size-4 = ["default-packet-pool"]
128+
default-packet-pool-size-8 = ["default-packet-pool"]
129+
default-packet-pool-size-16 = ["default-packet-pool"] # Default
130+
default-packet-pool-size-32 = ["default-packet-pool"]
131+
default-packet-pool-size-64 = ["default-packet-pool"]
132+
default-packet-pool-size-128 = ["default-packet-pool"]
133133

134134
# Controls the packet MTU of the default packet pool, if enabled.
135-
default-packet-pool-mtu-27 = []
136-
default-packet-pool-mtu-48 = []
137-
default-packet-pool-mtu-64 = []
138-
default-packet-pool-mtu-128 = []
139-
default-packet-pool-mtu-251 = [] # Default
140-
default-packet-pool-mtu-255 = []
141-
default-packet-pool-mtu-512 = []
142-
default-packet-pool-mtu-1024 = []
135+
default-packet-pool-mtu-27 = ["default-packet-pool"]
136+
default-packet-pool-mtu-48 = ["default-packet-pool"]
137+
default-packet-pool-mtu-64 = ["default-packet-pool"]
138+
default-packet-pool-mtu-128 = ["default-packet-pool"]
139+
default-packet-pool-mtu-251 = ["default-packet-pool"] # Default
140+
default-packet-pool-mtu-255 = ["default-packet-pool"]
141+
default-packet-pool-mtu-512 = ["default-packet-pool"]
142+
default-packet-pool-mtu-1024 = ["default-packet-pool"]
143143

144144
# When using the GATT client, this controls how many subscribers can be created.
145145
gatt-client-notification-max-subscribers-1 = [] # Default

host/build.rs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)