aboutsummaryrefslogtreecommitdiff
path: root/helix-loader
diff options
context:
space:
mode:
authoryvt2022-07-20 14:56:26 +0000
committerBlaž Hrastnik2022-08-02 03:04:09 +0000
commit6d16d2cbc910f2e3e4131fae41a8cd67c287e6a5 (patch)
tree41055e4b1e0e27fa2105bfba767502f32ee891a7 /helix-loader
parentf6f054ae5b091a608233b1e3d105e1032a8d676b (diff)
feat: support grammar cross-compilation
Diffstat (limited to 'helix-loader')
-rw-r--r--helix-loader/src/grammar.rs23
1 files changed, 16 insertions, 7 deletions
diff --git a/helix-loader/src/grammar.rs b/helix-loader/src/grammar.rs
index 8ff1ebe8..231ecf34 100644
--- a/helix-loader/src/grammar.rs
+++ b/helix-loader/src/grammar.rs
@@ -92,8 +92,12 @@ pub fn fetch_grammars() -> Result<()> {
run_parallel(grammars, fetch_grammar, "fetch")
}
-pub fn build_grammars() -> Result<()> {
- run_parallel(get_grammar_configs()?, build_grammar, "build")
+pub fn build_grammars(target: Option<String>) -> Result<()> {
+ run_parallel(
+ get_grammar_configs()?,
+ move |grammar| build_grammar(grammar, target.as_deref()),
+ "build",
+ )
}
// Returns the set of grammar configurations the user requests.
@@ -124,13 +128,14 @@ fn get_grammar_configs() -> Result<Vec<GrammarConfiguration>> {
fn run_parallel<F>(grammars: Vec<GrammarConfiguration>, job: F, action: &'static str) -> Result<()>
where
- F: Fn(GrammarConfiguration) -> Result<()> + std::marker::Send + 'static + Copy,
+ F: Fn(GrammarConfiguration) -> Result<()> + std::marker::Send + 'static + Clone,
{
let pool = threadpool::Builder::new().build();
let (tx, rx) = channel();
for grammar in grammars {
let tx = tx.clone();
+ let job = job.clone();
pool.execute(move || {
// Ignore any SendErrors, if any job in another thread has encountered an
@@ -240,7 +245,7 @@ where
}
}
-fn build_grammar(grammar: GrammarConfiguration) -> Result<()> {
+fn build_grammar(grammar: GrammarConfiguration, target: Option<&str>) -> Result<()> {
let grammar_dir = if let GrammarSource::Local { path } = &grammar.source {
PathBuf::from(&path)
} else {
@@ -273,10 +278,14 @@ fn build_grammar(grammar: GrammarConfiguration) -> Result<()> {
}
.join("src");
- build_tree_sitter_library(&path, grammar)
+ build_tree_sitter_library(&path, grammar, target)
}
-fn build_tree_sitter_library(src_path: &Path, grammar: GrammarConfiguration) -> Result<()> {
+fn build_tree_sitter_library(
+ src_path: &Path,
+ grammar: GrammarConfiguration,
+ target: Option<&str>,
+) -> Result<()> {
let header_path = src_path;
let parser_path = src_path.join("parser.c");
let mut scanner_path = src_path.join("scanner.c");
@@ -311,7 +320,7 @@ fn build_tree_sitter_library(src_path: &Path, grammar: GrammarConfiguration) ->
.opt_level(3)
.cargo_metadata(false)
.host(BUILD_TARGET)
- .target(BUILD_TARGET);
+ .target(target.unwrap_or(BUILD_TARGET));
let compiler = config.get_compiler();
let mut command = Command::new(compiler.path());
command.current_dir(src_path);