Skip to content

Commit 045f46a

Browse files
author
Arvid Gerstmann
committed
fix: set correct architecture for package
1 parent 600b1f3 commit 045f46a

File tree

4 files changed

+130
-30
lines changed

4 files changed

+130
-30
lines changed

src/generator.rs

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,22 @@ use anyhow::Context;
44

55
use crate::cargo_schema::CargoManifest;
66
use crate::nfpm_schema;
7+
use crate::triple::LlvmTriple;
8+
9+
#[derive(Debug, Clone, Copy, clap::ValueEnum)]
10+
pub enum OutputFormat {
11+
Apk,
12+
Archlinux,
13+
Deb,
14+
Ipk,
15+
Rpm,
16+
}
717

818
pub fn get_config_from_metadata(
919
_metadata: &cargo_metadata::Metadata,
1020
package: &cargo_metadata::Package,
1121
triple: &str,
22+
format: OutputFormat,
1223
) -> anyhow::Result<nfpm_schema::Config> {
1324
let manifest_str =
1425
std::fs::read_to_string(&package.manifest_path).context("reading Cargo.toml manifest")?;
@@ -24,7 +35,14 @@ pub fn get_config_from_metadata(
2435
merge_base_config_with_package(package, &mut base_config)
2536
.context("merging config with manifest values")?;
2637

27-
base_config.arch = Some(triple_to_goarch(triple)?);
38+
let parsed = LlvmTriple::new(triple).context("parsing cargo target triple")?;
39+
base_config.arch = match format {
40+
OutputFormat::Apk => Some(parsed.to_apk_arch()?.to_owned()),
41+
OutputFormat::Archlinux => Some(parsed.to_archlinux_arch()?.to_owned()),
42+
OutputFormat::Deb => Some(parsed.to_deb_arch()?.to_owned()),
43+
OutputFormat::Ipk => Some(parsed.to_ipk_arch()?.to_owned()),
44+
OutputFormat::Rpm => Some(parsed.to_rpm_arch()?.to_owned()),
45+
};
2846

2947
// Set some sane defaults.
3048
if base_config.epoch.is_none() {
@@ -50,22 +68,6 @@ pub fn get_config_from_metadata(
5068
Ok(base_config)
5169
}
5270

53-
/// Triple must follow the general format from LLVM:
54-
///
55-
/// The triple has the format `<arch><sub>-<vendor>-<sys>-<env>`
56-
fn triple_to_goarch(triple: &str) -> anyhow::Result<String> {
57-
let (arch, _) = triple.split_once('-').context("triple malformed")?;
58-
let goarch = match arch {
59-
"aarch64" | "arm64" | "arm64e" => "arm64",
60-
"i686" => "386",
61-
"x86_64" => "amd64",
62-
"arm" | "armv6" | "armv6k" | "armv7" | "armv7k" | "armv7s" | "armv7a" => "arm",
63-
arch => return Err(anyhow::anyhow!("unsupported arch: {arch}")),
64-
};
65-
66-
Ok(goarch.to_owned())
67-
}
68-
6971
fn merge_base_config_with_package(
7072
package: &cargo_metadata::Package,
7173
config: &mut nfpm_schema::Config,

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ pub mod cargo_schema;
55
pub mod generator;
66
pub mod nfpm;
77
pub mod nfpm_schema;
8+
pub mod triple;

src/main.rs

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::process::Command;
22

33
use anyhow::Context;
44
use cargo_nfpm::cargo::{self, ProjectBuilder};
5-
use cargo_nfpm::generator::get_config_from_metadata;
5+
use cargo_nfpm::generator::{get_config_from_metadata, OutputFormat};
66
use cargo_nfpm::nfpm::download_nfpm;
77
use cargo_nfpm::nfpm_schema::{ContentElement, FileInfo};
88
use clap::Parser;
@@ -18,6 +18,7 @@ pub struct CliArgs {
1818

1919
#[derive(clap::Subcommand, Debug)]
2020
pub enum Commands {
21+
/// Call `cargo-nfpm`.
2122
Nfpm(NfpmArgs),
2223
}
2324

@@ -29,18 +30,11 @@ pub struct NfpmArgs {
2930

3031
#[derive(clap::Subcommand, Debug)]
3132
pub enum NfpmCommands {
33+
/// Creates a package based on the `Cargo.toml` config
34+
#[clap(aliases = ["pkg", "p"])]
3235
Package(PackageArgs),
3336
}
3437

35-
#[derive(Debug, Clone, Copy, clap::ValueEnum)]
36-
pub enum OutputFormat {
37-
Apk,
38-
ArchLinux,
39-
Deb,
40-
Ipk,
41-
Rpm,
42-
}
43-
4438
#[derive(clap::Args, Debug)]
4539
pub struct PackageArgs {
4640
/// Package to build (see `cargo help pkgid`)
@@ -67,7 +61,7 @@ pub struct PackageArgs {
6761
#[arg(long, action = clap::ArgAction::SetTrue)]
6862
no_vendor: bool,
6963

70-
/// Output format.
64+
/// Package format.
7165
#[arg(long, short)]
7266
format: OutputFormat,
7367

@@ -139,7 +133,7 @@ fn main() -> anyhow::Result<()> {
139133
builder.build()?;
140134
}
141135

142-
let mut config = get_config_from_metadata(&metadata, package, &triple)
136+
let mut config = get_config_from_metadata(&metadata, package, &triple, args.format)
143137
.context("create config from Cargo manifest")?;
144138

145139
let auto_add_binary = if let Some(contents) = &config.contents {
@@ -182,7 +176,7 @@ fn main() -> anyhow::Result<()> {
182176

183177
let packager = match args.format {
184178
OutputFormat::Apk => "apk",
185-
OutputFormat::ArchLinux => "archlinux",
179+
OutputFormat::Archlinux => "archlinux",
186180
OutputFormat::Deb => "deb",
187181
OutputFormat::Ipk => "ipk",
188182
OutputFormat::Rpm => "rpm",

src/triple.rs

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
//! Rust Triple manipulation and information query.
2+
3+
use anyhow::Context;
4+
5+
/// An LLVM triple in the format: `<arch><sub>-<vendor>-<sys>-<env>`.
6+
pub struct LlvmTriple {
7+
inner: String,
8+
}
9+
10+
impl LlvmTriple {
11+
/// Triple must follow the following format:
12+
///
13+
/// `<arch><sub>-<vendor>-<sys>-<env>`.
14+
pub fn new<S>(triple: S) -> anyhow::Result<Self>
15+
where
16+
S: AsRef<str>,
17+
{
18+
let inner = String::from(triple.as_ref());
19+
20+
let mut split = inner.split('-');
21+
let _arch = split.next().context("missing architecture component")?;
22+
let _vendor = split.next().context("missing vendor component")?;
23+
let _sys = split.next().context("missing sys component")?;
24+
let _env = split.next().context("missing env component")?;
25+
26+
Ok(Self { inner })
27+
}
28+
29+
pub fn arch(&self) -> &str {
30+
let (arch, _) = self.inner.split_once('-').expect("validation wrong");
31+
arch
32+
}
33+
34+
pub fn to_rpm_arch(&self) -> anyhow::Result<&'static str> {
35+
let arch = self.arch();
36+
let ret = match arch {
37+
"aarch64" | "arm64" | "arm64e" => "aarch64",
38+
"i686" => "i386",
39+
"x86_64" => "x86_64",
40+
"arm" | "armv6" | "armv6k" => "armv6hl",
41+
"armv7" | "armv7k" | "armv7s" | "armv7a" => "armv7hl",
42+
arch => return Err(anyhow::anyhow!("unsupported arch: {arch}")),
43+
};
44+
45+
Ok(ret)
46+
}
47+
48+
/// Architecture for `DEB` files is defined here: https://wiki.debian.org/ArchitectureSpecificsMemo
49+
pub fn to_deb_arch(&self) -> anyhow::Result<&'static str> {
50+
let arch = self.arch();
51+
let ret = match arch {
52+
"aarch64" | "arm64" | "arm64e" => "arm64",
53+
"i686" => "i386",
54+
"x86_64" => "amd64",
55+
"arm" | "armv6" | "armv6k" | "armv7" | "armv7k" | "armv7s" | "armv7a" => "arm",
56+
arch => return Err(anyhow::anyhow!("unsupported arch: {arch}")),
57+
};
58+
59+
Ok(ret)
60+
}
61+
62+
pub fn to_ipk_arch(&self) -> anyhow::Result<&'static str> {
63+
let arch = self.arch();
64+
let ret = match arch {
65+
"aarch64" | "arm64" | "arm64e" => "arm64",
66+
"i686" => "i386",
67+
"x86_64" => "x86_64",
68+
"arm" | "armv6" | "armv6k" => "armhf",
69+
"armv7" | "armv7k" | "armv7s" | "armv7a" => "armhf",
70+
arch => return Err(anyhow::anyhow!("unsupported arch: {arch}")),
71+
};
72+
73+
Ok(ret)
74+
}
75+
76+
pub fn to_apk_arch(&self) -> anyhow::Result<&'static str> {
77+
let arch = self.arch();
78+
let ret = match arch {
79+
"aarch64" | "arm64" | "arm64e" => "aarch64",
80+
"i686" => "x86",
81+
"x86_64" => "x86_64",
82+
"arm" | "armv6" | "armv6k" => "armhf",
83+
"armv7" | "armv7k" | "armv7s" | "armv7a" => "armv7",
84+
arch => return Err(anyhow::anyhow!("unsupported arch: {arch}")),
85+
};
86+
87+
Ok(ret)
88+
}
89+
90+
pub fn to_archlinux_arch(&self) -> anyhow::Result<&'static str> {
91+
let arch = self.arch();
92+
let ret = match arch {
93+
"aarch64" | "arm64" | "arm64e" => "aarch64",
94+
"i686" => "i686",
95+
"x86_64" => "x86_64",
96+
"arm" | "armv6" | "armv6k" => "armv6h",
97+
"armv7" | "armv7k" | "armv7s" | "armv7a" => "armv7h",
98+
arch => return Err(anyhow::anyhow!("unsupported arch: {arch}")),
99+
};
100+
101+
Ok(ret)
102+
}
103+
}

0 commit comments

Comments
 (0)