diff --git a/helix-loader/src/grammar.rs b/helix-loader/src/grammar.rs index 8ff1ebe84..231ecf348 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) -> 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> { fn run_parallel(grammars: Vec, 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 @@ fn git(repository_dir: &Path, args: I) -> Result } } -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); diff --git a/helix-term/build.rs b/helix-term/build.rs index 974f4b5ed..74c35a3a3 100644 --- a/helix-term/build.rs +++ b/helix-term/build.rs @@ -19,7 +19,8 @@ fn main() { if std::env::var("HELIX_DISABLE_AUTO_GRAMMAR_BUILD").is_err() { fetch_grammars().expect("Failed to fetch tree-sitter grammars"); - build_grammars().expect("Failed to compile tree-sitter grammars"); + build_grammars(Some(std::env::var("TARGET").unwrap())) + .expect("Failed to compile tree-sitter grammars"); } println!("cargo:rerun-if-changed=../runtime/grammars/"); diff --git a/helix-term/src/main.rs b/helix-term/src/main.rs index eb186d78e..83af75882 100644 --- a/helix-term/src/main.rs +++ b/helix-term/src/main.rs @@ -108,7 +108,7 @@ async fn main_impl() -> Result { } if args.build_grammars { - helix_loader::grammar::build_grammars()?; + helix_loader::grammar::build_grammars(None)?; return Ok(0); }