Skip to content

Commit eada9f5

Browse files
committed
Let caller specify kernel manifest path
Move kernel package location code into a new public function.
1 parent 5b06e82 commit eada9f5

File tree

2 files changed

+20
-41
lines changed

2 files changed

+20
-41
lines changed

src/builder/bootloader.rs

Lines changed: 7 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,15 @@ impl BuildConfig {
2020
/// Derives the bootloader build config from the project's metadata.
2121
pub fn from_metadata(
2222
project_metadata: &Metadata,
23-
kernel_bin_name: &str,
23+
kernel_manifest_path: &Path,
2424
kernel_bin_path: &Path,
2525
) -> Result<Self, BootloaderError> {
26-
let kernel_pkg = kernel_package(project_metadata, kernel_bin_name)?;
26+
let kernel_pkg = project_metadata
27+
.packages
28+
.iter()
29+
.find(|p| p.manifest_path == kernel_manifest_path)
30+
.unwrap();
31+
2732
let bootloader_pkg = bootloader_package(project_metadata, kernel_pkg)?;
2833
let bootloader_root = bootloader_pkg.manifest_path.parent().ok_or_else(|| {
2934
BootloaderError::BootloaderInvalid("bootloader manifest has no target directory".into())
@@ -110,44 +115,6 @@ impl BuildConfig {
110115
}
111116
}
112117

113-
/// Returns the package metadata for the kernel crate
114-
fn kernel_package<'a>(
115-
project_metadata: &'a Metadata,
116-
kernel_bin_name: &str,
117-
) -> Result<&'a Package, BootloaderError> {
118-
// look for exact match with binary name first
119-
let contains_bin = |p: &&Package| {
120-
p.targets
121-
.iter()
122-
.any(|t| t.name == kernel_bin_name && t.kind.iter().any(|k| k == "bin"))
123-
};
124-
let package = project_metadata.packages.iter().find(contains_bin);
125-
126-
// then look for exact match with integration test binary
127-
let contains_test_bin = |p: &&Package| {
128-
p.targets
129-
.iter()
130-
.any(|t| t.name == kernel_bin_name && t.kind.iter().any(|k| k == "test"))
131-
};
132-
let package = package.or_else(|| project_metadata.packages.iter().find(contains_test_bin));
133-
134-
// then look for match with appended hash (e.g. for library tests)
135-
let contains_test = |p: &&Package| {
136-
let package_name = match kernel_bin_name.rsplitn(2, '-').nth(1) {
137-
Some(name) => name,
138-
None => return false,
139-
};
140-
p.targets
141-
.iter()
142-
.any(|t| t.name.replace("-", "_") == package_name)
143-
};
144-
let package = package.or_else(|| project_metadata.packages.iter().find(contains_test));
145-
146-
package.ok_or_else(|| BootloaderError::KernelBinPackageNotFound {
147-
bin_name: kernel_bin_name.to_owned(),
148-
})
149-
}
150-
151118
/// Returns the package metadata for the bootloader crate
152119
fn bootloader_package<'a>(
153120
project_metadata: &'a Metadata,

src/builder/mod.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ impl Builder {
117117
/// If the quiet argument is set to true, all output to stdout is suppressed.
118118
pub fn create_bootimage(
119119
&mut self,
120-
bin_name: &str,
120+
kernel_manifest_path: &Path,
121121
bin_path: &Path,
122122
output_bin_path: &Path,
123123
quiet: bool,
@@ -187,6 +187,18 @@ impl Builder {
187187
Ok(())
188188
}
189189

190+
/// Returns the cargo metadata package that contains the given binary.
191+
pub fn kernel_package_for_bin(
192+
&mut self,
193+
kernel_bin_name: &str,
194+
) -> Result<Option<&cargo_metadata::Package>, cargo_metadata::Error> {
195+
Ok(self.project_metadata()?.packages.iter().find(|p| {
196+
p.targets
197+
.iter()
198+
.any(|t| t.name == kernel_bin_name && t.kind.iter().any(|k| k == "bin"))
199+
}))
200+
}
201+
190202
fn project_metadata(&mut self) -> Result<&Metadata, cargo_metadata::Error> {
191203
if let Some(ref metadata) = self.project_metadata {
192204
return Ok(metadata);

0 commit comments

Comments
 (0)