package SPVM::Builder; use strict; use warnings; use Carp 'confess'; use Scalar::Util 'weaken'; use File::Path 'mkpath'; use File::Basename 'dirname', 'basename'; use SPVM (); use SPVM::Builder::CC; use SPVM::Builder::Compiler; use SPVM::Builder::Runtime; use SPVM::Builder::Env; use SPVM::Builder::Stack; # Fields sub build_dir { my $self = shift; if (@_) { $self->{build_dir} = $_[0]; return $self; } else { return $self->{build_dir}; } } sub module_dirs { my $self = shift; if (@_) { $self->{module_dirs} = $_[0]; return $self; } else { return $self->{module_dirs}; } } sub new { my $class = shift; my $self = { module_dirs => [map { "$_/SPVM" } @INC], @_ }; bless $self, ref $class || $class; return $self; } sub build_dynamic_lib_dist { my ($self, $class_name, $category) = @_; # Create the compiler my $compiler = SPVM::Builder::Compiler->new( module_dirs => $self->module_dirs ); my $success = $compiler->compile($class_name, __FILE__, __LINE__); unless ($success) { $compiler->print_error_messages(*STDERR); exit(255); } my $runtime = $compiler->build_runtime; my $cc = SPVM::Builder::CC->new( build_dir => $self->{build_dir}, ); my $module_file = $runtime->get_module_file($class_name); my $method_names = $runtime->get_method_names($class_name, $category); my $anon_class_names = $runtime->get_anon_class_names($class_name); my $precompile_source = $runtime->build_precompile_class_source($class_name); my $dl_func_list = SPVM::Builder::Util::create_dl_func_list($class_name, $method_names, $anon_class_names, {category => $category}); $cc->build_dist($class_name, {category => $category, module_file => $module_file, dl_func_list => $dl_func_list, precompile_source => $precompile_source}); } 1; =encoding utf8 =head1 Name SPVM::Builder - Build SPVM program =head1 Description Build SPVM program. Compile SPVM source codes. Bind native and precompile methods. Generate Perl subrotuines correspoing to SPVM methods. After that, run SPVM program. =head1 Copyright & License Copyright (c) 2023 Yuki Kimoto MIT License