Skip to content

Commit 37a51cd

Browse files
committed
Use env::var_os (almost) everywhere
Various environment variables used by the pkg-config crate are prone to not have values that are valid utf-8 (as they usually colon-separated paths). There's no convincing reason to force those variables to be `utf-8` anywhere in this crate, so just use `env::var_os` to obtain them almost everywhere.
1 parent ef356f3 commit 37a51cd

File tree

1 file changed

+19
-24
lines changed

1 file changed

+19
-24
lines changed

src/lib.rs

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -326,13 +326,13 @@ impl Config {
326326
// a wrapper script that sets up platform-specific prefixes.
327327
match self.targetted_env_var("PKG_CONFIG_ALLOW_CROSS") {
328328
// don't use pkg-config if explicitly disabled
329-
Ok(ref val) if val == "0" => false,
330-
Ok(_) => true,
331-
Err(_) => {
329+
Some(ref val) if val == "0" => false,
330+
Some(_) => true,
331+
None => {
332332
// if not disabled, and pkg-config is customized,
333333
// then assume it's prepared for cross-compilation
334-
self.targetted_env_var("PKG_CONFIG").is_ok()
335-
|| self.targetted_env_var("PKG_CONFIG_SYSROOT_DIR").is_ok()
334+
self.targetted_env_var("PKG_CONFIG").is_some()
335+
|| self.targetted_env_var("PKG_CONFIG_SYSROOT_DIR").is_some()
336336
}
337337
}
338338
}
@@ -343,28 +343,23 @@ impl Config {
343343
get_variable(package, variable).map_err(|e| e.to_string())
344344
}
345345

346-
fn targetted_env_var(&self, var_base: &str) -> Result<String, env::VarError> {
346+
fn targetted_env_var(&self, var_base: &str) -> Option<OsString> {
347+
// Typically both `TARGET` and `HOST` will be valid utf-8, so we implicitly ignore the
348+
// possiblity of them having that failure mode.
347349
if let Ok(target) = env::var("TARGET") {
348-
let host = env::var("HOST")?;
350+
let host = env::var("HOST").ok()?;
349351
let kind = if host == target { "HOST" } else { "TARGET" };
350352
let target_u = target.replace("-", "_");
351353

352-
self.env_var(&format!("{}_{}", var_base, target))
353-
.or_else(|_| self.env_var(&format!("{}_{}", var_base, target_u)))
354-
.or_else(|_| self.env_var(&format!("{}_{}", kind, var_base)))
355-
.or_else(|_| self.env_var(var_base))
354+
self.env_var_os(&format!("{}_{}", var_base, target))
355+
.or_else(|| self.env_var_os(&format!("{}_{}", var_base, target_u)))
356+
.or_else(|| self.env_var_os(&format!("{}_{}", kind, var_base)))
357+
.or_else(|| self.env_var_os(var_base))
356358
} else {
357-
self.env_var(var_base)
359+
self.env_var_os(var_base)
358360
}
359361
}
360362

361-
fn env_var(&self, name: &str) -> Result<String, env::VarError> {
362-
if self.env_metadata {
363-
println!("cargo:rerun-if-env-changed={}", name);
364-
}
365-
env::var(name)
366-
}
367-
368363
fn env_var_os(&self, name: &str) -> Option<OsString> {
369364
if self.env_metadata {
370365
println!("cargo:rerun-if-env-changed={}", name);
@@ -378,21 +373,21 @@ impl Config {
378373

379374
fn command(&self, name: &str, args: &[&str]) -> Command {
380375
let exe = self
381-
.env_var("PKG_CONFIG")
382-
.unwrap_or_else(|_| String::from("pkg-config"));
376+
.env_var_os("PKG_CONFIG")
377+
.unwrap_or_else(|| OsString::from("pkg-config"));
383378
let mut cmd = Command::new(exe);
384379
if self.is_static(name) {
385380
cmd.arg("--static");
386381
}
387382
cmd.args(args).args(&self.extra_args);
388383

389-
if let Ok(value) = self.targetted_env_var("PKG_CONFIG_PATH") {
384+
if let Some(value) = self.targetted_env_var("PKG_CONFIG_PATH") {
390385
cmd.env("PKG_CONFIG_PATH", value);
391386
}
392-
if let Ok(value) = self.targetted_env_var("PKG_CONFIG_LIBDIR") {
387+
if let Some(value) = self.targetted_env_var("PKG_CONFIG_LIBDIR") {
393388
cmd.env("PKG_CONFIG_LIBDIR", value);
394389
}
395-
if let Ok(value) = self.targetted_env_var("PKG_CONFIG_SYSROOT_DIR") {
390+
if let Some(value) = self.targetted_env_var("PKG_CONFIG_SYSROOT_DIR") {
396391
cmd.env("PKG_CONFIG_SYSROOT_DIR", value);
397392
}
398393
if self.print_system_libs {

0 commit comments

Comments
 (0)