diff options
author | Joel Galenson <jgalenson@google.com> | 2021-10-05 01:43:42 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-10-05 01:43:42 +0000 |
commit | 59bd07db87006383758bc3ad2712cf59006ef05c (patch) | |
tree | c651f77c1ff05a060e402fb30b555e9f0234c2cc | |
parent | 7d2f203e11a5458d0dbefbf5a53a475372b3820c (diff) | |
parent | f31da20ac2121b0fc491e57170907dfc8f154f8c (diff) | |
download | clang-sys-59bd07db87006383758bc3ad2712cf59006ef05c.tar.gz |
Upgrade rust/crates/clang-sys to 1.2.2 am: eabe835c04 am: 43ee8131c8 am: f31da20ac2
Original change: https://android-review.googlesource.com/c/platform/external/rust/crates/clang-sys/+/1832738
Change-Id: Idd6a817e877f9376aed27c5fd05484b50715c514
-rw-r--r-- | .cargo_vcs_info.json | 2 | ||||
-rw-r--r-- | Android.bp | 10 | ||||
-rw-r--r-- | CHANGELOG.md | 16 | ||||
-rw-r--r-- | Cargo.toml | 2 | ||||
-rw-r--r-- | Cargo.toml.orig | 2 | ||||
-rw-r--r-- | METADATA | 8 | ||||
-rw-r--r-- | build/common.rs | 14 | ||||
-rw-r--r-- | build/dynamic.rs | 6 | ||||
-rw-r--r-- | build/static.rs | 21 | ||||
-rw-r--r-- | out/common.rs | 14 | ||||
-rw-r--r-- | out/dynamic.rs | 6 | ||||
-rw-r--r-- | src/support.rs | 46 |
12 files changed, 86 insertions, 61 deletions
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json index 630eef7..859474d 100644 --- a/.cargo_vcs_info.json +++ b/.cargo_vcs_info.json @@ -1,5 +1,5 @@ { "git": { - "sha1": "c9ae24a7a218e73e1eccd320174349eef5a3bd1a" + "sha1": "fa181dee9b829be68d581ec02583c0568576bbed" } } @@ -1,4 +1,4 @@ -// This file is generated by cargo2android.py --run --features=runtime,clang_10_0 --dependencies --copy-out. +// This file is generated by cargo2android.py --run --features=runtime,clang_10_0 --copy-out. // Do not modify this file as changes will be overridden on upgrade. package { @@ -31,6 +31,8 @@ genrule { rust_library_host { name: "libclang_sys", crate_name: "clang_sys", + cargo_env_compat: true, + cargo_pkg_version: "1.2.2", srcs: [ "src/lib.rs", ":copy_clang-sys_build_out", @@ -58,9 +60,3 @@ rust_library_host { "liblibloading", ], } - -// dependent_library ["feature_list"] -// cfg-if-1.0.0 -// glob-0.3.0 -// libc-0.2.94 -// libloading-0.7.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 50af79f..dd5d8a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +## [1.2.2] - 2021-09-02 + +### Fixed +- Fixed handling of paths that contain characters that have special meaning in +glob patterns (e.g., `[` or `]`) + +## [1.2.1] - 2021-08-24 + +### Changed +- Updated build script to check the install location used by the +[Scoop](https://scoop.sh/) command-line installer on Windows + +### Fixed +- Updated build script to support environments where the `PATH` environment +variable is not set + ## [1.2.0] - 2021-04-08 ### Changed @@ -12,7 +12,7 @@ [package] name = "clang-sys" -version = "1.2.0" +version = "1.2.2" authors = ["Kyle Mayes <kyle@mayeses.com>"] build = "build.rs" links = "clang" diff --git a/Cargo.toml.orig b/Cargo.toml.orig index e34929a..e04a103 100644 --- a/Cargo.toml.orig +++ b/Cargo.toml.orig @@ -3,7 +3,7 @@ name = "clang-sys" authors = ["Kyle Mayes <kyle@mayeses.com>"] -version = "1.2.0" +version = "1.2.2" readme = "README.md" license = "Apache-2.0" @@ -7,13 +7,13 @@ third_party { } url { type: ARCHIVE - value: "https://static.crates.io/crates/clang-sys/clang-sys-1.2.0.crate" + value: "https://static.crates.io/crates/clang-sys/clang-sys-1.2.2.crate" } - version: "1.2.0" + version: "1.2.2" license_type: NOTICE last_upgrade_date { year: 2021 - month: 5 - day: 19 + month: 9 + day: 22 } } diff --git a/build/common.rs b/build/common.rs index f06aff5..56480df 100644 --- a/build/common.rs +++ b/build/common.rs @@ -20,7 +20,7 @@ use std::env; use std::path::{Path, PathBuf}; use std::process::Command; -use glob::MatchOptions; +use glob::{MatchOptions, Pattern}; /// `libclang` directory patterns for FreeBSD and Linux. const DIRECTORIES_LINUX: &[&str] = &[ @@ -49,6 +49,9 @@ const DIRECTORIES_WINDOWS: &[&str] = &[ // LLVM + Clang can be installed as a component of Visual Studio. // https://github.com/KyleMayes/clang-sys/issues/121 "C:\\Program Files*\\Microsoft Visual Studio\\*\\BuildTools\\VC\\Tools\\Llvm\\**\\bin", + // Scoop user installation https://scoop.sh/. + // Chocolatey, WinGet and other installers use to the system wide dir listed above + "C:\\Users\\*\\scoop\\apps\\llvm\\current\\bin", ]; thread_local! { @@ -152,10 +155,15 @@ impl Drop for CommandErrorPrinter { /// Returns the paths to and the filenames of the files matching the supplied /// filename patterns in the supplied directory. fn search_directory(directory: &Path, filenames: &[String]) -> Vec<(PathBuf, String)> { + // Escape the directory in case it contains characters that have special + // meaning in glob patterns (e.g., `[` or `]`). + let directory = Pattern::escape(directory.to_str().unwrap()); + let directory = Path::new(&directory); + // Join the directory to the filename patterns to obtain the path patterns. let paths = filenames .iter() - .filter_map(|f| directory.join(f).to_str().map(ToOwned::to_owned)); + .map(|f| directory.join(f).to_str().unwrap().to_owned()); // Prevent wildcards from matching path separators. let mut options = MatchOptions::new(); @@ -170,7 +178,7 @@ fn search_directory(directory: &Path, filenames: &[String]) -> Vec<(PathBuf, Str } }) .filter_map(|p| { - let filename = p.file_name().and_then(|f| f.to_str())?; + let filename = p.file_name()?.to_str().unwrap(); // The `libclang_shared` library has been renamed to `libclang-cpp` // in Clang 10. This can cause instances of this library (e.g., diff --git a/build/dynamic.rs b/build/dynamic.rs index c15973c..156afe4 100644 --- a/build/dynamic.rs +++ b/build/dynamic.rs @@ -90,8 +90,8 @@ fn validate_header(path: &Path) -> Result<(), String> { /// Returns the components of the version in the supplied `libclang` shared // library filename. fn parse_version(filename: &str) -> Vec<u32> { - let version = if filename.starts_with("libclang.so.") { - &filename[12..] + let version = if let Some(version) = filename.strip_prefix("libclang.so.") { + version } else if filename.starts_with("libclang-") { &filename[9..filename.len() - 3] } else { @@ -252,7 +252,7 @@ pub fn link() { // `libclang.so.7.0`). let name = match name.find(".dylib").or_else(|| name.find(".so")) { Some(index) => &name[0..index], - None => &name, + None => name, }; println!("cargo:rustc-link-lib=dylib={}", name); diff --git a/build/static.rs b/build/static.rs index 83a8185..66da274 100644 --- a/build/static.rs +++ b/build/static.rs @@ -16,14 +16,16 @@ extern crate glob; use std::path::{Path, PathBuf}; +use glob::Pattern; + use common; /// Returns the name of an LLVM or Clang library from a path to such a library. fn get_library_name(path: &Path) -> Option<String> { path.file_stem().map(|p| { let string = p.to_string_lossy(); - if string.starts_with("lib") { - string[3..].to_owned() + if let Some(name) = string.strip_prefix("lib") { + name.to_owned() } else { string.to_string() } @@ -39,8 +41,8 @@ fn get_llvm_libraries() -> Vec<String> { // Depending on the version of `llvm-config` in use, listed // libraries may be in one of two forms, a full path to the library // or simply prefixed with `-l`. - if p.starts_with("-l") { - Some(p[2..].into()) + if let Some(path) = p.strip_prefix("-l") { + Some(path.into()) } else { get_library_name(Path::new(p)) } @@ -67,11 +69,12 @@ const CLANG_LIBRARIES: &[&str] = &[ /// Returns the Clang libraries required to link to `libclang` statically. fn get_clang_libraries<P: AsRef<Path>>(directory: P) -> Vec<String> { - let pattern = directory - .as_ref() - .join("libclang*.a") - .to_string_lossy() - .to_string(); + // Escape the directory in case it contains characters that have special + // meaning in glob patterns (e.g., `[` or `]`). + let directory = Pattern::escape(directory.as_ref().to_str().unwrap()); + let directory = Path::new(&directory); + + let pattern = directory.join("libclang*.a").to_str().unwrap().to_owned(); if let Ok(libraries) = glob::glob(&pattern) { libraries .filter_map(|l| l.ok().and_then(|l| get_library_name(&l))) diff --git a/out/common.rs b/out/common.rs index f06aff5..56480df 100644 --- a/out/common.rs +++ b/out/common.rs @@ -20,7 +20,7 @@ use std::env; use std::path::{Path, PathBuf}; use std::process::Command; -use glob::MatchOptions; +use glob::{MatchOptions, Pattern}; /// `libclang` directory patterns for FreeBSD and Linux. const DIRECTORIES_LINUX: &[&str] = &[ @@ -49,6 +49,9 @@ const DIRECTORIES_WINDOWS: &[&str] = &[ // LLVM + Clang can be installed as a component of Visual Studio. // https://github.com/KyleMayes/clang-sys/issues/121 "C:\\Program Files*\\Microsoft Visual Studio\\*\\BuildTools\\VC\\Tools\\Llvm\\**\\bin", + // Scoop user installation https://scoop.sh/. + // Chocolatey, WinGet and other installers use to the system wide dir listed above + "C:\\Users\\*\\scoop\\apps\\llvm\\current\\bin", ]; thread_local! { @@ -152,10 +155,15 @@ impl Drop for CommandErrorPrinter { /// Returns the paths to and the filenames of the files matching the supplied /// filename patterns in the supplied directory. fn search_directory(directory: &Path, filenames: &[String]) -> Vec<(PathBuf, String)> { + // Escape the directory in case it contains characters that have special + // meaning in glob patterns (e.g., `[` or `]`). + let directory = Pattern::escape(directory.to_str().unwrap()); + let directory = Path::new(&directory); + // Join the directory to the filename patterns to obtain the path patterns. let paths = filenames .iter() - .filter_map(|f| directory.join(f).to_str().map(ToOwned::to_owned)); + .map(|f| directory.join(f).to_str().unwrap().to_owned()); // Prevent wildcards from matching path separators. let mut options = MatchOptions::new(); @@ -170,7 +178,7 @@ fn search_directory(directory: &Path, filenames: &[String]) -> Vec<(PathBuf, Str } }) .filter_map(|p| { - let filename = p.file_name().and_then(|f| f.to_str())?; + let filename = p.file_name()?.to_str().unwrap(); // The `libclang_shared` library has been renamed to `libclang-cpp` // in Clang 10. This can cause instances of this library (e.g., diff --git a/out/dynamic.rs b/out/dynamic.rs index c15973c..156afe4 100644 --- a/out/dynamic.rs +++ b/out/dynamic.rs @@ -90,8 +90,8 @@ fn validate_header(path: &Path) -> Result<(), String> { /// Returns the components of the version in the supplied `libclang` shared // library filename. fn parse_version(filename: &str) -> Vec<u32> { - let version = if filename.starts_with("libclang.so.") { - &filename[12..] + let version = if let Some(version) = filename.strip_prefix("libclang.so.") { + version } else if filename.starts_with("libclang-") { &filename[9..filename.len() - 3] } else { @@ -252,7 +252,7 @@ pub fn link() { // `libclang.so.7.0`). let name = match name.find(".dylib").or_else(|| name.find(".so")) { Some(index) => &name[0..index], - None => &name, + None => name, }; println!("cargo:rustc-link-lib=dylib={}", name); diff --git a/src/support.rs b/src/support.rs index 4e698ff..48bae28 100644 --- a/src/support.rs +++ b/src/support.rs @@ -18,26 +18,13 @@ use std::path::{Path, PathBuf}; use std::process::Command; use std::{env, io}; -use glob; +use glob::{self, Pattern}; use libc::c_int; use super::CXVersion; //================================================ -// Macros -//================================================ - -macro_rules! try_opt { - ($option:expr) => {{ - match $option { - Some(some) => some, - None => return None, - } - }}; -} - -//================================================ // Structs //================================================ @@ -117,7 +104,9 @@ impl Clang { } } - paths.extend(env::split_paths(&env::var("PATH").unwrap())); + if let Ok(path) = env::var("PATH") { + paths.extend(env::split_paths(&path)); + } // First, look for a target-prefixed `clang` executable. @@ -126,7 +115,7 @@ impl Clang { let versioned = format!("{}-clang-[0-9]*{}", target, env::consts::EXE_SUFFIX); let patterns = &[&default[..], &versioned[..]]; for path in &paths { - if let Some(path) = find(&path, patterns) { + if let Some(path) = find(path, patterns) { return Some(Clang::new(path, args)); } } @@ -154,12 +143,17 @@ impl Clang { /// Returns the first match to the supplied glob patterns in the supplied /// directory if there are any matches. fn find(directory: &Path, patterns: &[&str]) -> Option<PathBuf> { + // Escape the directory in case it contains characters that have special + // meaning in glob patterns (e.g., `[` or `]`). + let directory = if let Some(directory) = directory.to_str() { + Path::new(&Pattern::escape(directory)).to_owned() + } else { + return None; + }; + for pattern in patterns { let pattern = directory.join(pattern).to_string_lossy().into_owned(); - if let Some(path) = try_opt!(glob::glob(&pattern).ok()) - .filter_map(|p| p.ok()) - .next() - { + if let Some(path) = glob::glob(&pattern).ok()?.filter_map(|p| p.ok()).next() { if path.is_file() && is_executable(&path).unwrap_or(false) { return Some(path); } @@ -221,10 +215,10 @@ fn parse_version_number(number: &str) -> Option<c_int> { /// Parses the version from the output of a `clang` executable if possible. fn parse_version(path: &Path) -> Option<CXVersion> { let output = run_clang(path, &["--version"]).0; - let start = try_opt!(output.find("version ")) + 8; - let mut numbers = try_opt!(output[start..].split_whitespace().next()).split('.'); - let major = try_opt!(numbers.next().and_then(parse_version_number)); - let minor = try_opt!(numbers.next().and_then(parse_version_number)); + let start = output.find("version ")? + 8; + let mut numbers = output[start..].split_whitespace().next()?.split('.'); + let major = numbers.next().and_then(parse_version_number)?; + let minor = numbers.next().and_then(parse_version_number)?; let subminor = numbers.next().and_then(parse_version_number).unwrap_or(0); Some(CXVersion { Major: major, @@ -238,8 +232,8 @@ fn parse_search_paths(path: &Path, language: &str, args: &[String]) -> Option<Ve let mut clang_args = vec!["-E", "-x", language, "-", "-v"]; clang_args.extend(args.iter().map(|s| &**s)); let output = run_clang(path, &clang_args).1; - let start = try_opt!(output.find("#include <...> search starts here:")) + 34; - let end = try_opt!(output.find("End of search list.")); + let start = output.find("#include <...> search starts here:")? + 34; + let end = output.find("End of search list.")?; let paths = output[start..end].replace("(framework directory)", ""); Some( paths |