From 5d571193d22135eb10f4efd40b588dbfb89ae308 Mon Sep 17 00:00:00 2001 From: ivanlele Date: Thu, 25 Jun 2026 14:22:23 +0300 Subject: [PATCH] add target option for compilation --- src/main.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7a870034..c5a0db2e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,13 +2,16 @@ use base64::display::Base64Display; use base64::engine::general_purpose::STANDARD; use clap::{Arg, ArgAction, Command}; -use simplicityhl::ast::ElementsJetHinter; +use simplicityhl::ast::{CoreJetHinter, ElementsJetHinter, JetHinter}; +#[cfg(feature = "external-jets")] +use simplicityhl::jet::external::{init_external_jet_lib, ExternalJetHinter}; use simplicityhl::{ resolution::DependencyMapBuilder, source::CanonPath, source::CanonSourceFile, AbiMeta, CompiledProgram, }; use simplicityhl::{UnstableFeature, UnstableFeatures}; use std::path::Path; +use std::str::FromStr; use std::{env, fmt}; #[cfg_attr(feature = "serde", derive(serde::Serialize))] @@ -38,6 +41,46 @@ impl fmt::Display for Output { } } +enum Target { + Elements, + Core, + #[cfg(feature = "external-jets")] + External(String), +} + +impl Target { + #[allow(clippy::unnecessary_wraps)] + fn jet_hinter(&self) -> Result, Box> { + match self { + Target::Elements => Ok(Box::new(ElementsJetHinter::new())), + Target::Core => Ok(Box::new(CoreJetHinter::new())), + #[cfg(feature = "external-jets")] + Target::External(path) => { + unsafe { + init_external_jet_lib(path)?; + } + + Ok(Box::new(ExternalJetHinter::new())) + } + } + } +} + +impl FromStr for Target { + type Err = Box; + + fn from_str(s: &str) -> Result { + match s { + "elements" => Ok(Target::Elements), + "core" => Ok(Target::Core), + #[cfg(feature = "external-jets")] + _ => Ok(Target::External(s.to_string())), + #[cfg(not(feature = "external-jets"))] + _ => Err(format!("Unknown target: {}", s).into()), + } + } +} + fn main() -> Result<(), Box> { let command = { Command::new(env!("CARGO_BIN_NAME")) @@ -105,6 +148,15 @@ fn main() -> Result<(), Box> { .value_parser(clap::value_parser!(UnstableFeature)) .help(simplicityhl::UnstableFeature::help_message()), ) + .arg( + Arg::new("target") + .long("target") + .short('t') + .value_name("TARGET") + .default_value("elements") + .action(ArgAction::Set) + .help("Target platform for compilation, or file path to external target (e.g., --target=elements|core or --target=./my_target.dylib)"), + ) }; let matches = command.get_matches(); @@ -141,6 +193,12 @@ fn main() -> Result<(), Box> { simplicityhl::Arguments::default() }; + let target_arg = matches + .get_one::("target") + .expect("target argument should have a default value"); + + let target = Target::from_str(target_arg).expect("target argument should be valid"); + let dep_args = matches .get_many::("dependencies") .unwrap_or_default(); @@ -191,7 +249,7 @@ fn main() -> Result<(), Box> { &unstable_features, args_opt, include_debug_symbols, - Box::new(ElementsJetHinter::new()), + target.jet_hinter()?, ) { Ok(program) => program, Err(e) => {