Skip to content

Commit 21c50fa

Browse files
authored
Find prefixed AR when cross compiling. (#502)
Fixes #330
1 parent 299e5dd commit 21c50fa

File tree

1 file changed

+96
-78
lines changed

1 file changed

+96
-78
lines changed

src/lib.rs

Lines changed: 96 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1998,83 +1998,7 @@ impl Build {
19981998
} else if target.contains("vxworks") {
19991999
"wr-c++".to_string()
20002000
} else if self.get_host()? != target {
2001-
// CROSS_COMPILE is of the form: "arm-linux-gnueabi-"
2002-
let cc_env = self.getenv("CROSS_COMPILE");
2003-
let cross_compile = cc_env.as_ref().map(|s| s.trim_right_matches('-'));
2004-
let prefix = cross_compile.or(match &target[..] {
2005-
"aarch64-unknown-linux-gnu" => Some("aarch64-linux-gnu"),
2006-
"aarch64-unknown-linux-musl" => Some("aarch64-linux-musl"),
2007-
"aarch64-unknown-netbsd" => Some("aarch64--netbsd"),
2008-
"arm-unknown-linux-gnueabi" => Some("arm-linux-gnueabi"),
2009-
"armv4t-unknown-linux-gnueabi" => Some("arm-linux-gnueabi"),
2010-
"armv5te-unknown-linux-gnueabi" => Some("arm-linux-gnueabi"),
2011-
"armv5te-unknown-linux-musleabi" => Some("arm-linux-gnueabi"),
2012-
"arm-frc-linux-gnueabi" => Some("arm-frc-linux-gnueabi"),
2013-
"arm-unknown-linux-gnueabihf" => Some("arm-linux-gnueabihf"),
2014-
"arm-unknown-linux-musleabi" => Some("arm-linux-musleabi"),
2015-
"arm-unknown-linux-musleabihf" => Some("arm-linux-musleabihf"),
2016-
"arm-unknown-netbsd-eabi" => Some("arm--netbsdelf-eabi"),
2017-
"armv6-unknown-netbsd-eabihf" => Some("armv6--netbsdelf-eabihf"),
2018-
"armv7-unknown-linux-gnueabihf" => Some("arm-linux-gnueabihf"),
2019-
"armv7-unknown-linux-musleabihf" => Some("arm-linux-musleabihf"),
2020-
"armv7neon-unknown-linux-gnueabihf" => Some("arm-linux-gnueabihf"),
2021-
"armv7neon-unknown-linux-musleabihf" => Some("arm-linux-musleabihf"),
2022-
"thumbv7-unknown-linux-gnueabihf" => Some("arm-linux-gnueabihf"),
2023-
"thumbv7-unknown-linux-musleabihf" => Some("arm-linux-musleabihf"),
2024-
"thumbv7neon-unknown-linux-gnueabihf" => Some("arm-linux-gnueabihf"),
2025-
"thumbv7neon-unknown-linux-musleabihf" => Some("arm-linux-musleabihf"),
2026-
"armv7-unknown-netbsd-eabihf" => Some("armv7--netbsdelf-eabihf"),
2027-
"i586-unknown-linux-musl" => Some("musl"),
2028-
"i686-pc-windows-gnu" => Some("i686-w64-mingw32"),
2029-
"i686-uwp-windows-gnu" => Some("i686-w64-mingw32"),
2030-
"i686-unknown-linux-musl" => Some("musl"),
2031-
"i686-unknown-netbsd" => Some("i486--netbsdelf"),
2032-
"mips-unknown-linux-gnu" => Some("mips-linux-gnu"),
2033-
"mipsel-unknown-linux-gnu" => Some("mipsel-linux-gnu"),
2034-
"mips64-unknown-linux-gnuabi64" => Some("mips64-linux-gnuabi64"),
2035-
"mips64el-unknown-linux-gnuabi64" => Some("mips64el-linux-gnuabi64"),
2036-
"mipsisa32r6-unknown-linux-gnu" => Some("mipsisa32r6-linux-gnu"),
2037-
"mipsisa32r6el-unknown-linux-gnu" => Some("mipsisa32r6el-linux-gnu"),
2038-
"mipsisa64r6-unknown-linux-gnuabi64" => Some("mipsisa64r6-linux-gnuabi64"),
2039-
"mipsisa64r6el-unknown-linux-gnuabi64" => {
2040-
Some("mipsisa64r6el-linux-gnuabi64")
2041-
}
2042-
"powerpc-unknown-linux-gnu" => Some("powerpc-linux-gnu"),
2043-
"powerpc-unknown-linux-gnuspe" => Some("powerpc-linux-gnuspe"),
2044-
"powerpc-unknown-netbsd" => Some("powerpc--netbsd"),
2045-
"powerpc64-unknown-linux-gnu" => Some("powerpc-linux-gnu"),
2046-
"powerpc64le-unknown-linux-gnu" => Some("powerpc64le-linux-gnu"),
2047-
"riscv32i-unknown-none-elf" => Some("riscv32-unknown-elf"),
2048-
"riscv32imac-unknown-none-elf" => Some("riscv32-unknown-elf"),
2049-
"riscv32imc-unknown-none-elf" => Some("riscv32-unknown-elf"),
2050-
"riscv64gc-unknown-none-elf" => Some("riscv64-unknown-elf"),
2051-
"riscv64imac-unknown-none-elf" => Some("riscv64-unknown-elf"),
2052-
"riscv64gc-unknown-linux-gnu" => Some("riscv64-linux-gnu"),
2053-
"s390x-unknown-linux-gnu" => Some("s390x-linux-gnu"),
2054-
"sparc-unknown-linux-gnu" => Some("sparc-linux-gnu"),
2055-
"sparc64-unknown-linux-gnu" => Some("sparc64-linux-gnu"),
2056-
"sparc64-unknown-netbsd" => Some("sparc64--netbsd"),
2057-
"sparcv9-sun-solaris" => Some("sparcv9-sun-solaris"),
2058-
"armv7a-none-eabi" => Some("arm-none-eabi"),
2059-
"armv7a-none-eabihf" => Some("arm-none-eabi"),
2060-
"armebv7r-none-eabi" => Some("arm-none-eabi"),
2061-
"armebv7r-none-eabihf" => Some("arm-none-eabi"),
2062-
"armv7r-none-eabi" => Some("arm-none-eabi"),
2063-
"armv7r-none-eabihf" => Some("arm-none-eabi"),
2064-
"thumbv6m-none-eabi" => Some("arm-none-eabi"),
2065-
"thumbv7em-none-eabi" => Some("arm-none-eabi"),
2066-
"thumbv7em-none-eabihf" => Some("arm-none-eabi"),
2067-
"thumbv7m-none-eabi" => Some("arm-none-eabi"),
2068-
"thumbv8m.base-none-eabi" => Some("arm-none-eabi"),
2069-
"thumbv8m.main-none-eabi" => Some("arm-none-eabi"),
2070-
"thumbv8m.main-none-eabihf" => Some("arm-none-eabi"),
2071-
"x86_64-pc-windows-gnu" => Some("x86_64-w64-mingw32"),
2072-
"x86_64-uwp-windows-gnu" => Some("x86_64-w64-mingw32"),
2073-
"x86_64-rumprun-netbsd" => Some("x86_64-rumprun-netbsd"),
2074-
"x86_64-unknown-linux-musl" => Some("musl"),
2075-
"x86_64-unknown-netbsd" => Some("x86_64--netbsd"),
2076-
_ => None,
2077-
});
2001+
let prefix = self.prefix_for_target(&target);
20782002
match prefix {
20792003
Some(prefix) => format!("{}-{}", prefix, gnu),
20802004
None => default.to_string(),
@@ -2284,6 +2208,7 @@ impl Build {
22842208
return Ok((self.cmd(&p), p));
22852209
}
22862210
let target = self.get_target()?;
2211+
let default_ar = "ar".to_string();
22872212
let program = if target.contains("android") {
22882213
format!("{}-ar", target.replace("armv7", "arm"))
22892214
} else if target.contains("emscripten") {
@@ -2300,12 +2225,105 @@ impl Build {
23002225
Some(t) => return Ok((t, "lib.exe".to_string())),
23012226
None => "lib.exe".to_string(),
23022227
}
2228+
} else if self.get_host()? != target {
2229+
match self.prefix_for_target(&target) {
2230+
Some(p) => {
2231+
let target_ar = format!("{}-ar", p);
2232+
if Command::new(&target_ar).output().is_ok() {
2233+
target_ar
2234+
} else {
2235+
default_ar
2236+
}
2237+
}
2238+
None => default_ar,
2239+
}
23032240
} else {
2304-
"ar".to_string()
2241+
default_ar
23052242
};
23062243
Ok((self.cmd(&program), program))
23072244
}
23082245

2246+
fn prefix_for_target(&self, target: &str) -> Option<String> {
2247+
// CROSS_COMPILE is of the form: "arm-linux-gnueabi-"
2248+
let cc_env = self.getenv("CROSS_COMPILE");
2249+
let cross_compile = cc_env
2250+
.as_ref()
2251+
.map(|s| s.trim_right_matches('-').to_owned());
2252+
cross_compile.or(match &target[..] {
2253+
"aarch64-unknown-linux-gnu" => Some("aarch64-linux-gnu"),
2254+
"aarch64-unknown-linux-musl" => Some("aarch64-linux-musl"),
2255+
"aarch64-unknown-netbsd" => Some("aarch64--netbsd"),
2256+
"arm-unknown-linux-gnueabi" => Some("arm-linux-gnueabi"),
2257+
"armv4t-unknown-linux-gnueabi" => Some("arm-linux-gnueabi"),
2258+
"armv5te-unknown-linux-gnueabi" => Some("arm-linux-gnueabi"),
2259+
"armv5te-unknown-linux-musleabi" => Some("arm-linux-gnueabi"),
2260+
"arm-frc-linux-gnueabi" => Some("arm-frc-linux-gnueabi"),
2261+
"arm-unknown-linux-gnueabihf" => Some("arm-linux-gnueabihf"),
2262+
"arm-unknown-linux-musleabi" => Some("arm-linux-musleabi"),
2263+
"arm-unknown-linux-musleabihf" => Some("arm-linux-musleabihf"),
2264+
"arm-unknown-netbsd-eabi" => Some("arm--netbsdelf-eabi"),
2265+
"armv6-unknown-netbsd-eabihf" => Some("armv6--netbsdelf-eabihf"),
2266+
"armv7-unknown-linux-gnueabihf" => Some("arm-linux-gnueabihf"),
2267+
"armv7-unknown-linux-musleabihf" => Some("arm-linux-musleabihf"),
2268+
"armv7neon-unknown-linux-gnueabihf" => Some("arm-linux-gnueabihf"),
2269+
"armv7neon-unknown-linux-musleabihf" => Some("arm-linux-musleabihf"),
2270+
"thumbv7-unknown-linux-gnueabihf" => Some("arm-linux-gnueabihf"),
2271+
"thumbv7-unknown-linux-musleabihf" => Some("arm-linux-musleabihf"),
2272+
"thumbv7neon-unknown-linux-gnueabihf" => Some("arm-linux-gnueabihf"),
2273+
"thumbv7neon-unknown-linux-musleabihf" => Some("arm-linux-musleabihf"),
2274+
"armv7-unknown-netbsd-eabihf" => Some("armv7--netbsdelf-eabihf"),
2275+
"i586-unknown-linux-musl" => Some("musl"),
2276+
"i686-pc-windows-gnu" => Some("i686-w64-mingw32"),
2277+
"i686-uwp-windows-gnu" => Some("i686-w64-mingw32"),
2278+
"i686-unknown-linux-musl" => Some("musl"),
2279+
"i686-unknown-netbsd" => Some("i486--netbsdelf"),
2280+
"mips-unknown-linux-gnu" => Some("mips-linux-gnu"),
2281+
"mipsel-unknown-linux-gnu" => Some("mipsel-linux-gnu"),
2282+
"mips64-unknown-linux-gnuabi64" => Some("mips64-linux-gnuabi64"),
2283+
"mips64el-unknown-linux-gnuabi64" => Some("mips64el-linux-gnuabi64"),
2284+
"mipsisa32r6-unknown-linux-gnu" => Some("mipsisa32r6-linux-gnu"),
2285+
"mipsisa32r6el-unknown-linux-gnu" => Some("mipsisa32r6el-linux-gnu"),
2286+
"mipsisa64r6-unknown-linux-gnuabi64" => Some("mipsisa64r6-linux-gnuabi64"),
2287+
"mipsisa64r6el-unknown-linux-gnuabi64" => Some("mipsisa64r6el-linux-gnuabi64"),
2288+
"powerpc-unknown-linux-gnu" => Some("powerpc-linux-gnu"),
2289+
"powerpc-unknown-linux-gnuspe" => Some("powerpc-linux-gnuspe"),
2290+
"powerpc-unknown-netbsd" => Some("powerpc--netbsd"),
2291+
"powerpc64-unknown-linux-gnu" => Some("powerpc-linux-gnu"),
2292+
"powerpc64le-unknown-linux-gnu" => Some("powerpc64le-linux-gnu"),
2293+
"riscv32i-unknown-none-elf" => Some("riscv32-unknown-elf"),
2294+
"riscv32imac-unknown-none-elf" => Some("riscv32-unknown-elf"),
2295+
"riscv32imc-unknown-none-elf" => Some("riscv32-unknown-elf"),
2296+
"riscv64gc-unknown-none-elf" => Some("riscv64-unknown-elf"),
2297+
"riscv64imac-unknown-none-elf" => Some("riscv64-unknown-elf"),
2298+
"riscv64gc-unknown-linux-gnu" => Some("riscv64-linux-gnu"),
2299+
"s390x-unknown-linux-gnu" => Some("s390x-linux-gnu"),
2300+
"sparc-unknown-linux-gnu" => Some("sparc-linux-gnu"),
2301+
"sparc64-unknown-linux-gnu" => Some("sparc64-linux-gnu"),
2302+
"sparc64-unknown-netbsd" => Some("sparc64--netbsd"),
2303+
"sparcv9-sun-solaris" => Some("sparcv9-sun-solaris"),
2304+
"armv7a-none-eabi" => Some("arm-none-eabi"),
2305+
"armv7a-none-eabihf" => Some("arm-none-eabi"),
2306+
"armebv7r-none-eabi" => Some("arm-none-eabi"),
2307+
"armebv7r-none-eabihf" => Some("arm-none-eabi"),
2308+
"armv7r-none-eabi" => Some("arm-none-eabi"),
2309+
"armv7r-none-eabihf" => Some("arm-none-eabi"),
2310+
"thumbv6m-none-eabi" => Some("arm-none-eabi"),
2311+
"thumbv7em-none-eabi" => Some("arm-none-eabi"),
2312+
"thumbv7em-none-eabihf" => Some("arm-none-eabi"),
2313+
"thumbv7m-none-eabi" => Some("arm-none-eabi"),
2314+
"thumbv8m.base-none-eabi" => Some("arm-none-eabi"),
2315+
"thumbv8m.main-none-eabi" => Some("arm-none-eabi"),
2316+
"thumbv8m.main-none-eabihf" => Some("arm-none-eabi"),
2317+
"x86_64-pc-windows-gnu" => Some("x86_64-w64-mingw32"),
2318+
"x86_64-uwp-windows-gnu" => Some("x86_64-w64-mingw32"),
2319+
"x86_64-rumprun-netbsd" => Some("x86_64-rumprun-netbsd"),
2320+
"x86_64-unknown-linux-musl" => Some("musl"),
2321+
"x86_64-unknown-netbsd" => Some("x86_64--netbsd"),
2322+
_ => None,
2323+
}
2324+
.map(|x| x.to_owned()))
2325+
}
2326+
23092327
fn get_target(&self) -> Result<String, Error> {
23102328
match self.target.clone() {
23112329
Some(t) => Ok(t),

0 commit comments

Comments
 (0)