From 64106c4d3d4ddba8c7bc2af75376e6d3d3d75601 Mon Sep 17 00:00:00 2001 From: Date: Mon, 29 Jun 2015 20:16:15 +0000 Subject: Update documentation --- src/pkg_config/lib.rs.html | 679 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 679 insertions(+) create mode 100644 src/pkg_config/lib.rs.html (limited to 'src/pkg_config/lib.rs.html') diff --git a/src/pkg_config/lib.rs.html b/src/pkg_config/lib.rs.html new file mode 100644 index 0000000..250138e --- /dev/null +++ b/src/pkg_config/lib.rs.html @@ -0,0 +1,679 @@ + + + + + + + + + + lib.rs.html -- source + + + + + + + + + + + + + + + +
  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+
+//! A build dependency for Cargo libraries to find system artifacts through the
+//! `pkg-config` utility.
+//!
+//! This library will shell out to `pkg-config` as part of build scripts and
+//! probe the system to determine how to link to a specified library. The
+//! `Config` structure serves as a method of configuring how `pkg-config` is
+//! invoked in a builder style.
+//!
+//! A number of environment variables are available to globally configure how
+//! this crate will invoke `pkg-config`:
+//!
+//! * `PKG_CONFIG_ALLOW_CROSS` - if this variable is not set, then `pkg-config`
+//!   will automatically be disabled for all cross compiles.
+//! * `FOO_NO_PKG_CONFIG` - if set, this will disable running `pkg-config` when
+//!   probing for the library named `foo`.
+//!
+//! There are also a number of environment variables which can configure how a
+//! library is linked to (dynamically vs statically). These variables control
+//! whether the `--static` flag is passed. Note that this behavior can be
+//! overridden by configuring explicitly on `Config`. The variables are checked
+//! in the following order:
+//!
+//! * `FOO_STATIC` - pass `--static` for the library `foo`
+//! * `FOO_DYNAMIC` - do not pass `--static` for the library `foo`
+//! * `PKG_CONFIG_ALL_STATIC` - pass `--static` for all libraries
+//! * `PKG_CONFIG_ALL_DYNAMIC` - do not pass `--static` for all libraries
+//!
+//! After running `pkg-config` all appropriate Cargo metadata will be printed on
+//! stdout if the search was successful.
+//!
+//! # Example
+//!
+//! Find the system library named `foo`.
+//!
+//! ```no_run
+//! extern crate pkg_config;
+//!
+//! fn main() {
+//!     pkg_config::find_library("foo").unwrap();
+//! }
+//! ```
+//!
+//! Configure how library `foo` is linked to.
+//!
+//! ```no_run
+//! extern crate pkg_config;
+//!
+//! fn main() {
+//!     pkg_config::Config::new().statik(true).find("foo").unwrap();
+//! }
+//! ```
+
+#![doc(html_root_url = "http://alexcrichton.com/pkg-config-rs")]
+#![cfg_attr(test, deny(warnings))]
+
+use std::ascii::AsciiExt;
+use std::env;
+use std::ffi::{OsStr, OsString};
+use std::fs;
+use std::path::{PathBuf, Path};
+use std::process::Command;
+use std::str;
+
+pub fn target_supported() -> bool {
+    env::var("HOST") == env::var("TARGET") ||
+        env::var_os("PKG_CONFIG_ALLOW_CROSS").is_some()
+}
+
+#[derive(Clone)]
+pub struct Config {
+    statik: Option<bool>,
+    atleast_version: Option<String>,
+    extra_args: Vec<OsString>,
+}
+
+#[derive(Debug)]
+pub struct Library {
+    pub libs: Vec<String>,
+    pub link_paths: Vec<PathBuf>,
+    pub frameworks: Vec<String>,
+    pub framework_paths: Vec<PathBuf>,
+    pub include_paths: Vec<PathBuf>,
+    pub version: String,
+    _priv: (),
+}
+
+/// Simple shortcut for using all default options for finding a library.
+pub fn find_library(name: &str) -> Result<Library, String> {
+    Config::new().find(name)
+}
+
+impl Config {
+    /// Creates a new set of configuration options which are all initially set
+    /// to "blank".
+    pub fn new() -> Config {
+        Config {
+            statik: None,
+            atleast_version: None,
+            extra_args: vec![],
+        }
+    }
+
+    /// Indicate whether the `--static` flag should be passed.
+    ///
+    /// This will override the inference from environment variables described in
+    /// the crate documentation.
+    pub fn statik(&mut self, statik: bool) -> &mut Config {
+        self.statik = Some(statik);
+        self
+    }
+
+    /// Indicate that the library must be at least version `vers`.
+    pub fn atleast_version(&mut self, vers: &str) -> &mut Config {
+        self.atleast_version = Some(vers.to_string());
+        self
+    }
+
+    /// Add an argument to pass to pkg-config.
+    ///
+    /// It's placed after all of the arguments generated by this library.
+    pub fn arg<S: AsRef<OsStr>>(&mut self, arg: S) -> &mut Config {
+        self.extra_args.push(arg.as_ref().to_os_string());
+        self
+    }
+
+    /// Run `pkg-config` to find the library `name`.
+    ///
+    /// This will use all configuration previously set to specify how
+    /// `pkg-config` is run.
+    pub fn find(&self, name: &str) -> Result<Library, String> {
+        if env::var_os(&format!("{}_NO_PKG_CONFIG", envify(name))).is_some() {
+            return Err(format!("pkg-config requested to be aborted for {}", name))
+        } else if !target_supported() {
+            return Err("pkg-config doesn't handle cross compilation. Use \
+                        PKG_CONFIG_ALLOW_CROSS=1 to override".to_string());
+        }
+
+        let mut library = Library::new();
+
+        let output = try!(run(self.command(name, &["--libs", "--cflags"])));
+        library.parse_libs_cflags(name, &output, self);
+
+        let output = try!(run(self.command(name, &["--modversion"])));
+        library.parse_modversion(&output);
+
+        Ok(library)
+    }
+
+    /// Run `pkg-config` to get the value of a variable from a package using
+    /// --variable.
+    pub fn get_variable(package: &str, variable: &str) -> Result<String, String> {
+        let arg = format!("--variable={}", variable);
+        let cfg = Config::new();
+        Ok(try!(run(cfg.command(package, &[&arg]))).trim_right().to_owned())
+    }
+
+    fn is_static(&self, name: &str) -> bool {
+        self.statik.unwrap_or_else(|| infer_static(name))
+    }
+
+    fn command(&self, name: &str, args: &[&str]) -> Command {
+        let mut cmd = Command::new("pkg-config");
+        if self.is_static(name) {
+            cmd.arg("--static");
+        }
+        cmd.args(args)
+           .args(&self.extra_args)
+           .env("PKG_CONFIG_ALLOW_SYSTEM_LIBS", "1");
+        if let Some(ref version) = self.atleast_version {
+            cmd.arg(&format!("{} >= {}", name, version));
+        } else {
+            cmd.arg(name);
+        }
+        cmd
+    }
+}
+
+impl Library {
+    fn new() -> Library {
+        Library {
+            libs: Vec::new(),
+            link_paths: Vec::new(),
+            include_paths: Vec::new(),
+            frameworks: Vec::new(),
+            framework_paths: Vec::new(),
+            version: String::new(),
+            _priv: (),
+        }
+    }
+
+    fn parse_libs_cflags(&mut self, name: &str, output: &str, config: &Config) {
+        let parts = output.split(' ')
+                          .filter(|l| l.len() > 2)
+                          .map(|arg| (&arg[0..2], &arg[2..]))
+                          .collect::<Vec<_>>();
+
+        let mut dirs = Vec::new();
+        let statik = config.is_static(name);
+        for &(flag, val) in parts.iter() {
+            match flag {
+                "-L" => {
+                    println!("cargo:rustc-link-search=native={}", val);
+                    dirs.push(PathBuf::from(val));
+                    self.link_paths.push(PathBuf::from(val));
+                }
+                "-F" => {
+                    println!("cargo:rustc-link-search=framework={}", val);
+                    self.framework_paths.push(PathBuf::from(val));
+                }
+                "-I" => {
+                    self.include_paths.push(PathBuf::from(val));
+                }
+                "-l" => {
+                    self.libs.push(val.to_string());
+                    if statik && !is_system(val, &dirs) {
+                        println!("cargo:rustc-link-lib=static={}", val);
+                    } else {
+                        println!("cargo:rustc-link-lib={}", val);
+                    }
+                }
+                _ => {}
+            }
+        }
+
+        let mut iter = output.split(' ');
+        while let Some(part) = iter.next() {
+            if part != "-framework" { continue }
+            if let Some(lib) = iter.next() {
+                println!("cargo:rustc-link-lib=framework={}", lib);
+                self.frameworks.push(lib.to_string());
+            }
+        }
+    }
+
+    fn parse_modversion(&mut self, output: &str) {
+        self.version.push_str(output.trim());
+    }
+}
+
+fn infer_static(name: &str) -> bool {
+    let name = envify(name);
+    if env::var_os(&format!("{}_STATIC", name)).is_some() {
+        true
+    } else if env::var_os(&format!("{}_DYNAMIC", name)).is_some() {
+        false
+    } else if env::var_os("PKG_CONFIG_ALL_STATIC").is_some() {
+        true
+    } else if env::var_os("PKG_CONFIG_ALL_DYNAMIC").is_some() {
+        false
+    } else {
+        false
+    }
+}
+
+fn envify(name: &str) -> String {
+    name.chars().map(|c| c.to_ascii_uppercase()).map(|c| {
+        if c == '-' {'_'} else {c}
+    }).collect()
+}
+
+fn is_system(name: &str, dirs: &[PathBuf]) -> bool {
+    let libname = format!("lib{}.a", name);
+    let root = Path::new("/usr");
+    !dirs.iter().any(|d| {
+        !d.starts_with(root) && fs::metadata(&d.join(&libname)).is_ok()
+    })
+}
+
+fn run(mut cmd: Command) -> Result<String, String> {
+    let out = try!(cmd.output().map_err(|e| {
+        format!("failed to run `{:?}`: {}", cmd, e)
+    }));
+
+    let stdout = String::from_utf8(out.stdout).unwrap();
+    if out.status.success() {
+        return Ok(stdout);
+    }
+
+    let stderr = str::from_utf8(&out.stderr).unwrap();
+    let mut msg = format!("`{:?}` did not exit successfully: {}", cmd, out.status);
+    if stdout.len() > 0 {
+        msg.push_str("\n--- stdout\n");
+        msg.push_str(&stdout);
+    }
+    if stderr.len() > 0 {
+        msg.push_str("\n--- stderr\n");
+        msg.push_str(stderr);
+    }
+
+    return Err(msg);
+}
+
+
+ + + + + + + + + + + + + + + \ No newline at end of file -- cgit v1.2.3