Skip to content

Commit eae4af5

Browse files
authored
Merge pull request #49 from rust-math/reduce_dependencies
Make download optional
2 parents a422662 + 925c35a commit eae4af5

File tree

10 files changed

+147
-137
lines changed

10 files changed

+147
-137
lines changed

.github/workflows/intel-mkl-tool.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ jobs:
2222
with:
2323
command: test
2424
args: --manifest-path=intel-mkl-tool/Cargo.toml
25+
name: cargo-test
26+
- uses: actions-rs/cargo@v1
27+
with:
28+
command: test
29+
args: --manifest-path=intel-mkl-tool/Cargo.toml --no-default-features
30+
name: cargo-test no-default-features
2531

2632
docker:
2733
runs-on: ubuntu-18.04

intel-mkl-src/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ mkl-dynamic-lp64-seq = []
2727
mkl-dynamic-ilp64-iomp = []
2828
mkl-dynamic-ilp64-seq = []
2929

30-
# Enable downloading from AWS S3 when not found
31-
download = []
30+
# Enable downloading from AWS S3 when system MKL not found
31+
download = ["intel-mkl-tool/archive"]
3232
# (Experimental) Cache download archive ad $XDG_DATA_HOME/intel-mkl-tool/
3333
xdg-data-home = []
3434

intel-mkl-src/build.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2121
// SOFTWARE.
2222

23+
#![cfg_attr(feature = "download", allow(unreachable_code))]
24+
2325
use anyhow::*;
2426
use intel_mkl_tool::*;
2527
use std::{env, path::*};
@@ -51,7 +53,8 @@ fn main() -> Result<()> {
5153
}
5254

5355
// download if not found
54-
if cfg!(feature = "download") {
56+
#[cfg(feature = "download")]
57+
{
5558
let path = if cfg!(feature = "xdg-data-home") {
5659
xdg_home_path()
5760
} else {
@@ -64,6 +67,8 @@ fn main() -> Result<()> {
6467
cfg.download(path)?;
6568
let entry = Entry::from_config(cfg).unwrap(); // must found
6669
entry.print_cargo_metadata();
70+
return Ok(());
6771
}
68-
Ok(())
72+
73+
bail!("No MKL found, and download flag is off.");
6974
}

intel-mkl-tool/Cargo.toml

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,23 @@ license = "MIT"
1111

1212
[features]
1313
default = ["cli"]
14-
cli = ["structopt", "env_logger"]
14+
archive = ["curl", "tar", "zstd"]
15+
cli = ["structopt", "archive"]
1516

1617
[dependencies]
1718
anyhow = "1.0.31"
18-
curl = "0.4.29"
1919
derive_more = "0.99.8"
2020
dirs = "2.0.2"
2121
glob = "0.3.0"
22-
log = "0.4.8"
2322
pkg-config = "0.3.17"
24-
tar = "0.4.29"
25-
zstd = "0.5.3"
23+
24+
# archive
25+
curl = { version = "0.4.29", optional = true }
26+
tar = { version = "0.4.29", optional = true }
27+
zstd = { version = "0.5.3", optional = true }
2628

2729
# CLI
28-
structopt = { version = "0.3.15", optional = true }
29-
env_logger = { version = "0.7.1", optional = true }
30+
structopt = { version = "0.3.15", optional = true }
3031

3132
[dev-dependencies]
3233
paste = "0.1.17"

intel-mkl-tool/src/cli.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use anyhow::*;
22
use intel_mkl_tool::*;
3-
use log::*;
43
use std::{env, path::PathBuf};
54
use structopt::StructOpt;
65

@@ -34,9 +33,6 @@ enum Opt {
3433
}
3534

3635
fn main() -> Result<()> {
37-
env::set_var("RUST_LOG", "info");
38-
env_logger::init();
39-
4036
let opt = Opt::from_args();
4137

4238
match opt {
@@ -47,7 +43,7 @@ fn main() -> Result<()> {
4743
cfg.download(&path.join(cfg.name()))?;
4844
} else {
4945
for cfg in Config::possibles() {
50-
info!(
46+
println!(
5147
"Download archive {:<22} into {}",
5248
cfg.name(),
5349
path.display()
@@ -85,7 +81,7 @@ fn main() -> Result<()> {
8581
path
8682
};
8783
let package = entry.package(&path)?;
88-
info!("Pacakge created: {}", package.display());
84+
println!("Pacakge created: {}", package.display());
8985
} else {
9086
for entry in Entry::available() {
9187
let path = if let Ok(version) = entry.version() {
@@ -94,7 +90,7 @@ fn main() -> Result<()> {
9490
path.clone()
9591
};
9692
let package = entry.package(&path)?;
97-
info!("Pacakge created: {}", package.display());
93+
println!("Pacakge created: {}", package.display());
9894
}
9995
}
10096
}

intel-mkl-tool/src/config.rs

Lines changed: 0 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
use crate::*;
2-
use curl::easy::Easy;
32
use derive_more::*;
4-
use std::fs;
53

64
pub const VALID_CONFIGS: &[&str] = &[
75
"mkl-dynamic-ilp64-iomp",
@@ -146,41 +144,6 @@ impl Config {
146144
}
147145
}
148146
}
149-
150-
/// Download archive from AWS S3, and expand into `${out_dir}/*.so`
151-
pub fn download<P: AsRef<Path>>(&self, out_dir: P) -> Result<()> {
152-
let out_dir = out_dir.as_ref();
153-
if out_dir.exists() {
154-
fs::create_dir_all(&out_dir)?;
155-
}
156-
let data = read_from_url(&format!("{}/{}.tar.zst", s3_addr(), self.name()))?;
157-
let zstd = zstd::stream::read::Decoder::new(data.as_slice())?;
158-
let mut arc = tar::Archive::new(zstd);
159-
arc.unpack(&out_dir)?;
160-
Ok(())
161-
}
162-
}
163-
164-
/// Helper for download file from URL
165-
///
166-
/// - This function expands obtained data into memory space
167-
///
168-
fn read_from_url(url: &str) -> Result<Vec<u8>> {
169-
let mut data = Vec::new();
170-
let mut handle = Easy::new();
171-
handle.fail_on_error(true)?;
172-
handle.url(url)?;
173-
{
174-
let mut transfer = handle.transfer();
175-
transfer
176-
.write_function(|new_data| {
177-
data.extend_from_slice(new_data);
178-
Ok(new_data.len())
179-
})
180-
.unwrap();
181-
transfer.perform().unwrap();
182-
}
183-
Ok(data)
184147
}
185148

186149
#[cfg(test)]
@@ -220,49 +183,4 @@ mod tests {
220183
assert!(Config::from_str("mkl-static-lp64-omp").is_err());
221184
Ok(())
222185
}
223-
224-
macro_rules! impl_test_download {
225-
($name:expr) => {
226-
paste::item! {
227-
#[test]
228-
fn [<download_$name>]() -> Result<()> {
229-
let name = $name;
230-
let cfg = Config::from_str(name)?;
231-
cfg.download(format!("test_download/{}", name))?;
232-
Ok(())
233-
}
234-
}
235-
};
236-
}
237-
238-
#[cfg(target_os = "windows")]
239-
mod macos {
240-
use super::*;
241-
impl_test_download!("mkl-dynamic-lp64-seq");
242-
impl_test_download!("mkl-dynamic-ilp64-seq");
243-
impl_test_download!("mkl-static-lp64-seq");
244-
impl_test_download!("mkl-static-ilp64-seq");
245-
}
246-
247-
#[cfg(target_os = "macos")]
248-
mod macos {
249-
use super::*;
250-
impl_test_download!("mkl-dynamic-lp64-seq");
251-
impl_test_download!("mkl-dynamic-lp64-iomp");
252-
impl_test_download!("mkl-dynamic-ilp64-seq");
253-
impl_test_download!("mkl-dynamic-ilp64-iomp");
254-
}
255-
256-
#[cfg(target_os = "linux")]
257-
mod linux {
258-
use super::*;
259-
impl_test_download!("mkl-dynamic-lp64-seq");
260-
impl_test_download!("mkl-dynamic-lp64-iomp");
261-
impl_test_download!("mkl-dynamic-ilp64-seq");
262-
impl_test_download!("mkl-dynamic-ilp64-iomp");
263-
impl_test_download!("mkl-static-lp64-seq");
264-
impl_test_download!("mkl-static-lp64-iomp");
265-
impl_test_download!("mkl-static-ilp64-seq");
266-
impl_test_download!("mkl-static-ilp64-iomp");
267-
}
268186
}

intel-mkl-tool/src/download.rs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
use crate::*;
2+
use curl::easy::Easy;
3+
use std::fs;
4+
5+
impl Config {
6+
/// Download archive from AWS S3, and expand into `${out_dir}/*.so`
7+
pub fn download<P: AsRef<Path>>(&self, out_dir: P) -> Result<()> {
8+
let out_dir = out_dir.as_ref();
9+
if out_dir.exists() {
10+
fs::create_dir_all(&out_dir)?;
11+
}
12+
let data = read_from_url(&format!("{}/{}.tar.zst", s3_addr(), self.name()))?;
13+
let zstd = zstd::stream::read::Decoder::new(data.as_slice())?;
14+
let mut arc = tar::Archive::new(zstd);
15+
arc.unpack(&out_dir)?;
16+
Ok(())
17+
}
18+
}
19+
20+
/// Helper for download file from URL
21+
///
22+
/// - This function expands obtained data into memory space
23+
///
24+
fn read_from_url(url: &str) -> Result<Vec<u8>> {
25+
let mut data = Vec::new();
26+
let mut handle = Easy::new();
27+
handle.fail_on_error(true)?;
28+
handle.url(url)?;
29+
{
30+
let mut transfer = handle.transfer();
31+
transfer
32+
.write_function(|new_data| {
33+
data.extend_from_slice(new_data);
34+
Ok(new_data.len())
35+
})
36+
.unwrap();
37+
transfer.perform().unwrap();
38+
}
39+
Ok(data)
40+
}
41+
42+
#[cfg(test)]
43+
mod tests {
44+
use super::*;
45+
46+
macro_rules! impl_test_download {
47+
($name:expr) => {
48+
paste::item! {
49+
#[test]
50+
fn [<download_$name>]() -> Result<()> {
51+
let name = $name;
52+
let cfg = Config::from_str(name)?;
53+
cfg.download(format!("test_download/{}", name))?;
54+
Ok(())
55+
}
56+
}
57+
};
58+
}
59+
60+
#[cfg(target_os = "windows")]
61+
mod macos {
62+
use super::*;
63+
impl_test_download!("mkl-dynamic-lp64-seq");
64+
impl_test_download!("mkl-dynamic-ilp64-seq");
65+
impl_test_download!("mkl-static-lp64-seq");
66+
impl_test_download!("mkl-static-ilp64-seq");
67+
}
68+
69+
#[cfg(target_os = "macos")]
70+
mod macos {
71+
use super::*;
72+
impl_test_download!("mkl-dynamic-lp64-seq");
73+
impl_test_download!("mkl-dynamic-lp64-iomp");
74+
impl_test_download!("mkl-dynamic-ilp64-seq");
75+
impl_test_download!("mkl-dynamic-ilp64-iomp");
76+
}
77+
78+
#[cfg(target_os = "linux")]
79+
mod linux {
80+
use super::*;
81+
impl_test_download!("mkl-dynamic-lp64-seq");
82+
impl_test_download!("mkl-dynamic-lp64-iomp");
83+
impl_test_download!("mkl-dynamic-ilp64-seq");
84+
impl_test_download!("mkl-dynamic-ilp64-iomp");
85+
impl_test_download!("mkl-static-lp64-seq");
86+
impl_test_download!("mkl-static-lp64-iomp");
87+
impl_test_download!("mkl-static-ilp64-seq");
88+
impl_test_download!("mkl-static-ilp64-iomp");
89+
}
90+
}

intel-mkl-tool/src/entry.rs

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -193,26 +193,6 @@ impl Entry {
193193
bail!("Cannot determine MKL versions");
194194
}
195195

196-
pub fn package(&self, out_dir: &Path) -> Result<PathBuf> {
197-
fs::create_dir_all(out_dir)?;
198-
let out = out_dir.join(format!("{}.tar.zst", self.name()));
199-
if out.exists() {
200-
bail!("Output archive already exits: {}", out.display());
201-
}
202-
let f = fs::File::create(&out)?;
203-
let buf = io::BufWriter::new(f);
204-
let zstd = zstd::stream::write::Encoder::new(buf, 6)?;
205-
let mut ar = tar::Builder::new(zstd);
206-
ar.mode(tar::HeaderMode::Deterministic);
207-
for (path, name) in self.found_files() {
208-
let lib = path.join(&name);
209-
ar.append_path_with_name(lib, name)?;
210-
}
211-
let zstd = ar.into_inner()?;
212-
zstd.finish()?;
213-
Ok(out)
214-
}
215-
216196
pub fn print_cargo_metadata(&self) {
217197
let paths: HashSet<PathBuf> = self
218198
.found_files()

intel-mkl-tool/src/lib.rs

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,19 @@
9090
//! |mkl_cdft_core | libmkl_cdft_core.so| libmkl_cdft_core.a|
9191
//!
9292
93+
#![cfg_attr(not(feature = "archive"), allow(dead_code))]
94+
9395
use anyhow::*;
94-
use log::*;
9596
use std::path::*;
9697

9798
mod config;
9899
mod entry;
99100

101+
#[cfg(feature = "archive")]
102+
mod download;
103+
#[cfg(feature = "archive")]
104+
mod package;
105+
100106
pub use config::*;
101107
pub use entry::*;
102108

@@ -149,19 +155,3 @@ pub fn xdg_home_path() -> PathBuf {
149155
mkl::VERSION_UPDATE
150156
))
151157
}
152-
153-
pub fn seek_pkg_config() -> Option<PathBuf> {
154-
if let Ok(lib) = pkg_config::probe_library("mkl-dynamic-lp64-seq") {
155-
if lib.libs.len() > 1 {
156-
warn!("Found {} MKL libraries. Use first found.", lib.libs.len())
157-
}
158-
return Some(PathBuf::from(lib.libs[0].clone()));
159-
}
160-
None
161-
}
162-
163-
pub fn download_default<P: AsRef<Path>>(out_dir: P) -> Result<()> {
164-
let cfg = Config::from_str("mkl-dynamic-lp64-seq").unwrap();
165-
cfg.download(out_dir)?;
166-
Ok(())
167-
}

0 commit comments

Comments
 (0)