Skip to content

Commit 637f685

Browse files
committed
build.rs scripts now parallelize with rayon (not sure of tradeoff)
1 parent d43ce8b commit 637f685

File tree

5 files changed

+56
-77
lines changed

5 files changed

+56
-77
lines changed

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

imageflow_abi/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ base64="0.22"
2626
imageflow_helpers = { path = "../imageflow_helpers", version = "*"}
2727
cbindgen = "0.28"
2828
regex-lite = { version = "0.1.6" }
29-
29+
rayon = "1"
3030
[features]
3131
nightly = ["imageflow_core/nightly", "imageflow_helpers/nightly"]

imageflow_abi/build.rs

Lines changed: 25 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
extern crate cbindgen;
32
extern crate regex_lite;
43
extern crate imageflow_helpers;
@@ -10,6 +9,7 @@ use std::path;
109
use cbindgen::Builder;
1110
use std::io::Cursor;
1211
use std::env;
12+
use rayon::prelude::*;
1313

1414

1515
static OPAQUE_STRUCTS: &'static str = r#"
@@ -310,56 +310,29 @@ fn main() {
310310
//let base = "imageflow_"; //for debugging more easily
311311
let base = "../bindings/headers/imageflow_";
312312

313-
build(format!("{}default.h",base), Target::Default);
314-
315-
build(format!("{}lua.h",base), Target::Lua);
316-
build(format!("{}raw.h",base), Target::Raw);
317-
318-
build(format!("{}short.h",base), Target::SignaturesOnly);
319-
build(format!("{}pinvoke.h",base), Target::PInvoke);
320-
321-
// build(format!("{}SCREAMING_SNAKE.h",base), Target::PrefixAll{
322-
// prefix: "Imageflow",
323-
// struct_name: Style::ScreamingSnake,
324-
// enum_name: Style::ScreamingSnake,
325-
// enum_member: Style::ScreamingSnake,
326-
// });
327-
build(format!("{}SCREAMING_ENUMS.h",base), Target::PrefixAll{
328-
prefix: "Imageflow",
329-
struct_name: Style::Snake,
330-
enum_name: Style::ScreamingSnake,
331-
enum_member: Style::ScreamingSnake,
332-
});
333-
// build(format!("{}PascalCase.h",base), Target::PrefixAll{
334-
// prefix: "",
335-
// struct_name: Style::PascalCase,
336-
// enum_name: Style::PascalCase,
337-
// enum_member: Style::PascalCase,
338-
// });
339-
build(format!("{}PrefixedPascalCase.h",base), Target::PrefixAll{
340-
prefix: "Imageflow",
341-
struct_name: Style::PascalCase,
342-
enum_name: Style::PascalCase,
343-
enum_member: Style::PascalCase,
313+
// Create a vector of tuples containing (filename, target)
314+
let builds = vec![
315+
(format!("{}default.h", base), Target::Default),
316+
(format!("{}lua.h", base), Target::Lua),
317+
(format!("{}raw.h", base), Target::Raw),
318+
(format!("{}short.h", base), Target::SignaturesOnly),
319+
(format!("{}pinvoke.h", base), Target::PInvoke),
320+
(format!("{}SCREAMING_ENUMS.h", base), Target::PrefixAll{
321+
prefix: "Imageflow",
322+
struct_name: Style::Snake,
323+
enum_name: Style::ScreamingSnake,
324+
enum_member: Style::ScreamingSnake,
325+
}),
326+
(format!("{}PrefixedPascalCase.h", base), Target::PrefixAll{
327+
prefix: "Imageflow",
328+
struct_name: Style::PascalCase,
329+
enum_name: Style::PascalCase,
330+
enum_member: Style::PascalCase,
331+
}),
332+
];
333+
334+
// Use rayon to parallelize the builds
335+
builds.par_iter().for_each(|(file, target)| {
336+
build(file.clone(), *target);
344337
});
345-
// build(format!("{}Prefixed_Pascal_Snake.h",base), Target::PrefixAll{
346-
// prefix: "Imageflow",
347-
// struct_name: Style::PascalSnake,
348-
// enum_name: Style::PascalSnake,
349-
// enum_member: Style::PascalSnake,
350-
// });
351-
352-
// build(format!("{}prefixed_Camel_Snake.h",base), Target::PrefixAll{
353-
// prefix: "Imageflow",
354-
// struct_name: Style::CamelSnake,
355-
// enum_name: Style::CamelSnake,
356-
// enum_member: Style::CamelSnake,
357-
// });
358-
// build(format!("{}prefixedCamelCase.h",base), Target::PrefixAll{
359-
// prefix: "Imageflow",
360-
// struct_name: Style::CamelCase,
361-
// enum_name: Style::CamelCase,
362-
// enum_member: Style::CamelCase,
363-
// });
364-
365338
}

imageflow_types/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ rgb = "0.8"
2424
[build-dependencies]
2525
quick-error = "2"
2626
chrono = "0.4"
27+
rayon = "1"
2728

2829
[features]
2930
nightly = ["imageflow_helpers/nightly"]

imageflow_types/build.rs

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ use std::path::{Path};
1010
use std::process::{Command, Output};
1111
use std::collections::HashMap;
1212
use std::time::{Instant};
13+
extern crate rayon;
14+
use rayon::prelude::*;
1315

1416
quick_error! {
1517
#[derive(Debug)]
@@ -124,30 +126,31 @@ fn env_or_cmd(key: &str, cmd: &str) -> Option<String>{
124126
// Path::new(&build_rs_path).parent().expect("Rust must be stripping parent directory info from file! macro. This breaks path stuff in build.rs.").to_owned()
125127
//}
126128

127-
fn collect_info(shopping_list: Vec<EnvTidbit>) -> HashMap<String, Option<String>>{
128-
129-
let mut info = HashMap::new();
130-
for from in shopping_list {
131-
let (k,v) = match from {
132-
EnvTidbit::Env(key) => (key, fetch_env(key, false, true)),
133-
EnvTidbit::EnvReq(key) => (key, fetch_env(key, true, true)),
134-
EnvTidbit::FileContentsReq{key, relative_to_build_rs} => {
135-
136-
let io_error_expect = format!("Failed to read file {:?}. This file is required to be embedded in output binaries.", relative_to_build_rs);
137-
let mut file = File::open(relative_to_build_rs).expect(&io_error_expect);
138-
let mut contents = String::new();
139-
file.read_to_string( &mut contents).expect(&io_error_expect);
140-
(key, Some(contents))
141-
},
142-
EnvTidbit::Cmd{key, cmd} => (key, command(key, cmd, false, false)),
143-
EnvTidbit::CmdReq{key, cmd} => (key, command(key, cmd, true, false)),
144-
EnvTidbit::CmdOrEnvReq{key, cmd} => (key, command(key, cmd, true, true)),
145-
EnvTidbit::CmdOrEnv{key, cmd} => (key, command(key, cmd, false, true)),
146-
EnvTidbit::EnvOrCmdInconsistent{key, cmd} => (key, env_or_cmd(key, cmd)),
147-
};
148-
info.insert(k.to_owned(),v);
149-
}
150-
info
129+
fn collect_info(shopping_list: Vec<EnvTidbit>) -> HashMap<String, Option<String>> {
130+
let results: Vec<(String, Option<String>)> = shopping_list
131+
.into_par_iter()
132+
.map(|from| {
133+
let (k, v) = match from {
134+
EnvTidbit::Env(key) => (key, fetch_env(key, false, true)),
135+
EnvTidbit::EnvReq(key) => (key, fetch_env(key, true, true)),
136+
EnvTidbit::FileContentsReq { key, relative_to_build_rs } => {
137+
let io_error_expect = format!("Failed to read file {:?}. This file is required to be embedded in output binaries.", relative_to_build_rs);
138+
let mut file = File::open(relative_to_build_rs).expect(&io_error_expect);
139+
let mut contents = String::new();
140+
file.read_to_string(&mut contents).expect(&io_error_expect);
141+
(key, Some(contents))
142+
},
143+
EnvTidbit::Cmd { key, cmd } => (key, command(key, cmd, false, false)),
144+
EnvTidbit::CmdReq { key, cmd } => (key, command(key, cmd, true, false)),
145+
EnvTidbit::CmdOrEnvReq { key, cmd } => (key, command(key, cmd, true, true)),
146+
EnvTidbit::CmdOrEnv { key, cmd } => (key, command(key, cmd, false, true)),
147+
EnvTidbit::EnvOrCmdInconsistent { key, cmd } => (key, env_or_cmd(key, cmd)),
148+
};
149+
(k.to_owned(), v)
150+
})
151+
.collect();
152+
153+
results.into_iter().collect()
151154
}
152155
fn what_to_collect() -> Vec<EnvTidbit>{
153156
let mut c = Vec::new();

0 commit comments

Comments
 (0)