Skip to content

Commit 707774f

Browse files
committed
Wire in the heuristics
1 parent 85c9f47 commit 707774f

File tree

5 files changed

+59
-23
lines changed

5 files changed

+59
-23
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ cargo = "0.79.0"
3232
cargo-util = "0.2"
3333
semver = "1.0.3"
3434
log = "0.4"
35-
clap = { version="4.0.29", features=["color", "derive", "cargo"] }
35+
clap = { version = "4.0.29", features = ["color", "derive", "cargo", "string"] }
3636
regex = "1.5.6"
3737
cbindgen = { version="0.26.0", default-features=false }
3838
toml = "0.8"

src/build.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -928,7 +928,7 @@ fn compile_with_exec(
928928
let pkg = &unit.pkg;
929929
let capi_config = load_manifest_capi_config(pkg, rustc_target)?;
930930
let name = &capi_config.library.name;
931-
let install_paths = InstallPaths::new(name, args, &capi_config);
931+
let install_paths = InstallPaths::new(name, rustc_target, args, &capi_config);
932932
let pkg_rustflags = &capi_config.library.rustflags;
933933

934934
let mut leaf_args: Vec<String> = rustc_target
@@ -1018,7 +1018,7 @@ impl CPackage {
10181018

10191019
let name = &capi_config.library.name;
10201020

1021-
let install_paths = InstallPaths::new(name, args, &capi_config);
1021+
let install_paths = InstallPaths::new(name, rustc_target, args, &capi_config);
10221022
let build_targets = BuildTargets::new(
10231023
name,
10241024
rustc_target,
@@ -1057,7 +1057,7 @@ pub fn cbuild(
10571057
}
10581058
};
10591059

1060-
let rustc_target = target::Target::new(&target, is_target_overridden)?;
1060+
let rustc_target = target::Target::new(Some(&target), is_target_overridden)?;
10611061

10621062
let default_kind = || match (rustc_target.os.as_str(), rustc_target.env.as_str()) {
10631063
("none", _) | (_, "musl") => vec!["staticlib"],

src/cli.rs

+22-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ use cargo_util::{ProcessBuilder, ProcessError};
99

1010
use clap::{Arg, ArgAction, ArgMatches, Command, CommandFactory, Parser};
1111

12+
use crate::target::Target;
13+
1214
// TODO: convert to a function using cargo opt()
1315
#[allow(dead_code)]
1416
#[derive(Clone, Debug, Parser)]
@@ -56,7 +58,8 @@ struct Common {
5658
}
5759

5860
fn base_cli() -> Command {
59-
Common::command()
61+
let default_target = Target::new::<&str>(None, false);
62+
let app = Common::command()
6063
.allow_external_subcommands(true)
6164
.arg(flag("version", "Print version info and exit").short('V'))
6265
.arg(flag("list", "List installed commands"))
@@ -107,7 +110,24 @@ fn base_cli() -> Command {
107110
.arg_target_dir()
108111
.arg_manifest_path()
109112
.arg_message_format()
110-
.arg_build_plan()
113+
.arg_build_plan();
114+
115+
if let Ok(t) = default_target {
116+
app.mut_arg("prefix", |a| {
117+
a.default_value(t.default_prefix().as_os_str().to_os_string())
118+
})
119+
.mut_arg("libdir", |a| {
120+
a.default_value(t.default_libdir().as_os_str().to_os_string())
121+
})
122+
.mut_arg("datadir", |a| {
123+
a.default_value(t.default_datadir().as_os_str().to_os_string())
124+
})
125+
.mut_arg("includedir", |a| {
126+
a.default_value(t.default_includedir().as_os_str().to_os_string())
127+
})
128+
} else {
129+
app
130+
}
111131
}
112132

113133
pub fn subcommand_build(name: &'static str, about: &'static str) -> Command {

src/install.rs

+28-8
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use cargo_util::paths::{copy, create_dir_all};
66

77
use crate::build::*;
88
use crate::build_targets::BuildTargets;
9+
use crate::target::Target;
910

1011
fn append_to_destdir(destdir: Option<&Path>, path: &Path) -> PathBuf {
1112
if let Some(destdir) = destdir {
@@ -294,16 +295,35 @@ pub struct InstallPaths {
294295
pub pkgconfigdir: PathBuf,
295296
}
296297

298+
fn get_path_or(args: &ArgMatches, id: &str, f: impl FnOnce() -> PathBuf) -> PathBuf {
299+
if matches!(
300+
args.value_source(id),
301+
Some(clap::parser::ValueSource::DefaultValue)
302+
) {
303+
f()
304+
} else {
305+
args.get_one::<PathBuf>(id).unwrap().to_owned()
306+
}
307+
}
308+
297309
impl InstallPaths {
298-
pub fn new(_name: &str, args: &ArgMatches, capi_config: &CApiConfig) -> Self {
310+
pub fn new(
311+
_name: &str,
312+
rustc_target: &Target,
313+
args: &ArgMatches,
314+
capi_config: &CApiConfig,
315+
) -> Self {
299316
let destdir = args.get_one::<PathBuf>("destdir").map(PathBuf::from);
300-
let prefix = args
301-
.get_one::<PathBuf>("prefix")
302-
.map(PathBuf::from)
303-
.unwrap_or_else(|| "/usr/local".into());
304-
let libdir = prefix.join(args.get_one::<PathBuf>("libdir").unwrap());
305-
let includedir = prefix.join(args.get_one::<PathBuf>("includedir").unwrap());
306-
let datarootdir = prefix.join(args.get_one::<PathBuf>("datarootdir").unwrap());
317+
let prefix = get_path_or(args, "prefix", || rustc_target.default_prefix());
318+
let libdir = prefix.join(get_path_or(args, "libdir", || {
319+
rustc_target.default_libdir()
320+
}));
321+
let includedir = prefix.join(get_path_or(args, "includedir", || {
322+
rustc_target.default_includedir()
323+
}));
324+
let datarootdir = prefix.join(get_path_or(args, "datarootdir", || {
325+
rustc_target.default_datadir()
326+
}));
307327
let datadir = args
308328
.get_one::<PathBuf>("datadir")
309329
.map(|d| prefix.join(d))

src/target.rs

+5-9
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,16 @@ pub struct Target {
2020

2121
impl Target {
2222
pub fn new<T: AsRef<std::ffi::OsStr>>(
23-
target: T,
23+
target: Option<T>,
2424
is_target_overridden: bool,
2525
) -> Result<Self, anyhow::Error> {
2626
let rustc = std::env::var("RUSTC").unwrap_or_else(|_| "rustc".into());
2727
let mut cmd = std::process::Command::new(rustc);
2828

2929
cmd.arg("--print").arg("cfg");
30-
cmd.arg("--target").arg(target);
30+
if let Some(target) = target {
31+
cmd.arg("--target").arg(target);
32+
}
3133

3234
let out = cmd.output()?;
3335
if out.status.success() {
@@ -120,12 +122,6 @@ impl Target {
120122
lines
121123
}
122124

123-
fn is_debianlike(&self) -> bool {
124-
consts::ARCH.eq_ignore_ascii_case(&self.arch)
125-
&& consts::OS.eq_ignore_ascii_case(&self.os)
126-
&& PathBuf::from("/etc/debian_version").exists()
127-
}
128-
129125
fn is_freebsd(&self) -> bool {
130126
self.os.eq_ignore_ascii_case("freebsd")
131127
}
@@ -143,7 +139,7 @@ impl Target {
143139
return "lib".into();
144140
}
145141

146-
if self.is_debianlike() {
142+
if PathBuf::from("/etc/debian_version").exists() {
147143
let pc = std::process::Command::new("dpkg-architecture")
148144
.arg("-qDEB_HOST_MULTIARCH")
149145
.output();

0 commit comments

Comments
 (0)