Skip to content

Commit 4687583

Browse files
committed
Enable dependencies of dependencies
Fixes #603
1 parent 85f1318 commit 4687583

File tree

61 files changed

+183
-141
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+183
-141
lines changed

crates/header-translator/src/library.rs

Lines changed: 80 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ pub struct Library {
2424
pub data: LibraryConfig,
2525
}
2626

27+
type Dependencies<'c> = BTreeMap<&'c str, (bool, String, BTreeSet<String>)>;
28+
2729
impl Library {
2830
pub fn new(name: &str, data: &LibraryConfig) -> Self {
2931
Self {
@@ -54,10 +56,62 @@ impl Library {
5456
current
5557
}
5658

59+
pub fn dependencies<'c>(&self, config: &'c Config) -> Dependencies<'c> {
60+
let mut dependencies: BTreeMap<_, _> = self
61+
.module
62+
.all_items()
63+
.into_iter()
64+
.flat_map(|item| {
65+
let location = item.location();
66+
location
67+
.library(config, &self.link_name)
68+
.krate()
69+
.map(|(krate, required)| {
70+
(
71+
krate,
72+
(
73+
required,
74+
location.library_name().to_string(),
75+
BTreeSet::new(),
76+
),
77+
)
78+
})
79+
})
80+
.collect();
81+
82+
// Process top-level statements
83+
for stmt in &self.module.stmts {
84+
for required_item in stmt.required_items_inner() {
85+
let location = required_item.location();
86+
if let Some(feature) = location
87+
.library(config, &self.link_name)
88+
.cargo_toml_feature()
89+
{
90+
if feature == "bitflags" {
91+
if let Some((bitflags_required, _, _)) = dependencies.get_mut("bitflags") {
92+
*bitflags_required = true;
93+
}
94+
} else {
95+
let (krate, feature) = feature.split_once('/').unwrap();
96+
let krate = krate.strip_suffix('?').unwrap_or(krate);
97+
if let Some((_, _, krate_features)) = dependencies.get_mut(krate) {
98+
krate_features.insert(feature.to_string());
99+
} else {
100+
error!(?location, ?feature, "tried to set krate dependency feature");
101+
}
102+
}
103+
}
104+
}
105+
}
106+
107+
dependencies
108+
}
109+
57110
pub fn output(
58111
&self,
59112
crate_dir: &Path,
60113
config: &Config,
114+
dependency_map: &BTreeMap<&str, Dependencies<'_>>,
61115
) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
62116
let generated_dir = crate_dir.join("src").join("generated");
63117

@@ -196,43 +250,7 @@ see that for related crates.", self.data.krate, self.link_name)?;
196250
cargo_toml["package"]["metadata"]["docs"]["rs"]["default-target"] =
197251
value(default_target.unwrap());
198252

199-
let mut dependencies: BTreeMap<_, _> = self
200-
.module
201-
.all_items()
202-
.into_iter()
203-
.flat_map(|item| {
204-
let lib = item.location().library(config, &self.link_name);
205-
lib.krate()
206-
.map(|(krate, required)| (krate, (required, BTreeSet::new())))
207-
})
208-
.collect();
209-
210-
// Process top-level statements
211-
for stmt in &self.module.stmts {
212-
for required_item in stmt.required_items_inner() {
213-
let location = required_item.location();
214-
if let Some(feature) = location
215-
.library(config, &self.link_name)
216-
.cargo_toml_feature()
217-
{
218-
if feature == "bitflags" {
219-
if let Some((bitflags_required, _)) = dependencies.get_mut("bitflags") {
220-
*bitflags_required = true;
221-
}
222-
} else {
223-
let (krate, feature) = feature.split_once('/').unwrap();
224-
let krate = krate.strip_suffix('?').unwrap_or(krate);
225-
if let Some((_, krate_features)) = dependencies.get_mut(krate) {
226-
krate_features.insert(feature.to_string());
227-
} else {
228-
error!(?location, ?feature, "tried to set krate dependency feature");
229-
}
230-
}
231-
}
232-
}
233-
}
234-
235-
for (krate, (required, features)) in &dependencies {
253+
for (krate, (required, _, features)) in &dependency_map[&*self.link_name] {
236254
let mut table = match *krate {
237255
"objc2" => InlineTable::from_iter([
238256
("path", Value::from("../../crates/objc2".to_string())),
@@ -296,11 +314,30 @@ see that for related crates.", self.data.krate, self.link_name)?;
296314
Err(e) => Err(e)?,
297315
}
298316

299-
for (krate, (required, _)) in &dependencies {
300-
if !required {
301-
let array: Array = [format!("dep:{krate}")].iter().collect();
302-
cargo_toml["features"][krate] = value(array);
317+
for (krate, (required, _, _)) in &dependency_map[&*self.link_name] {
318+
if *required {
319+
continue;
320+
}
321+
322+
let mut array: Array = [format!("dep:{krate}")].iter().collect();
323+
// Enable features of the dependency as well
324+
// E.g. `block2 = ["dep:block2", "objc2-foundation/block2"]`
325+
for (dependency_krate, (dependency_required, dependency_library, _)) in
326+
&dependency_map[&*self.link_name]
327+
{
328+
if let Some(dependency) = dependency_map.get(&**dependency_library) {
329+
if let Some((inner_required, _, _)) = dependency.get(krate) {
330+
if *inner_required {
331+
continue;
332+
}
333+
array.push(format!(
334+
"{dependency_krate}{}/{krate}",
335+
if *dependency_required { "" } else { "?" }
336+
));
337+
}
338+
}
303339
}
340+
cargo_toml["features"][krate] = value(array);
304341
}
305342

306343
add_newline_at_end(&mut cargo_toml["features"]);
@@ -316,9 +353,9 @@ see that for related crates.", self.data.krate, self.link_name)?;
316353
.keys()
317354
.cloned()
318355
.chain(
319-
dependencies
356+
dependency_map[&*self.link_name]
320357
.iter()
321-
.filter(|(_, (required, _))| !*required)
358+
.filter(|(_, (required, _, _))| !*required)
322359
.map(|(krate, _)| krate.to_string()),
323360
)
324361
.collect::<BTreeSet<_>>(),

crates/header-translator/src/main.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,11 @@ fn main() -> Result<(), BoxError> {
197197
}
198198
drop(span);
199199

200+
let dependency_map: BTreeMap<_, _> = libraries
201+
.iter()
202+
.map(|(library_name, library)| (&**library_name, library.dependencies(&config)))
203+
.collect();
204+
200205
for (library_name, library) in &libraries {
201206
let _span = info_span!("writing", library_name).entered();
202207

@@ -230,7 +235,7 @@ fn main() -> Result<(), BoxError> {
230235
Err(err) => Err(err)?,
231236
}
232237

233-
library.output(&crate_dir, &config)?;
238+
library.output(&crate_dir, &config, &dependency_map)?;
234239
}
235240

236241
let span = info_span!("formatting").entered();

framework-crates/objc2-accessibility/Cargo.toml

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

framework-crates/objc2-accounts/Cargo.toml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

framework-crates/objc2-app-kit/Cargo.toml

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

framework-crates/objc2-authentication-services/Cargo.toml

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

framework-crates/objc2-automatic-assessment-configuration/Cargo.toml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

framework-crates/objc2-av-kit/Cargo.toml

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

framework-crates/objc2-background-assets/Cargo.toml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

framework-crates/objc2-background-tasks/Cargo.toml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)