#!perl

use strict;
use warnings;

use SPVM();
use SPVM::Builder::Exe;
use SPVM::Builder::Util;

SPVM::Builder::Util::getopt
  'h|help'          => \my $help,
  'v|version'       => \my $show_version,
  'o|output=s'        => \my $output_file,
  'B|build-dir=s'   => \my $build_dir,
  'I|include-dir=s' => \my @include_dirs,
  'q|quiet'   => \my $quiet,
  'f|force' => \my $force,
  'c|config=s' => \my $config_file,
  'r|required-resources' => \my $print_required_resources,
;

if ($help) {
  print SPVM::Builder::Util::extract_usage;
}
elsif ($show_version) {
  my $version_string = "spvmcc v$SPVM::VERSION";
  print "$version_string\n";
}
else {
  my $module_name = shift;
  unless (defined $module_name) {
    die SPVM::Builder::Util::extract_usage;
  }
  
  my @original_include_dirs = @include_dirs;
  push @include_dirs, map { "$_/SPVM" } @INC;
  unshift @INC, map { $_ =~ s/[\\\/]SPVM$//; $_; } @original_include_dirs;

  my $build_exe = SPVM::Builder::Exe->new(
    module_name => $module_name,
    build_dir => $build_dir,
    include_dirs => \@include_dirs,
    output_file => $output_file,
    quiet => $quiet,
    force => $force,
    config_file => $config_file,
  );
  if ($print_required_resources) {
    my $lines = $build_exe->get_required_resource_json_lines;
    print "$_\n" for @$lines;
  }
  else {
    $build_exe->build_exe_file;
  }
}


=encoding utf8

=head1 Name

spvmcc - Generating Excutable File

=head1 Description

The spvmcc command is a SPVM compiler and linker to generate an executable file.

=head1 Usage

  usage: spvmcc [<options>] <module name>
    
    spvmcc -I lib/SPVM -o myapp Myapp
  
  options:
    -h, --help                     Shows this message
    -v, --version                  Shows the version
    -o, --output                   The output file name
    -I, --include-dir <directory>  Adds a include directory
    -B, --build-dir <directory>    Building diretory
    -q, --quiet                    Stops the output of messages
    -f, --force                    Forces the compile and link
    -c, --config                   The config file
    -r, --required-resources       Prints required resources in JSON lines

=head1 Copyright & License

Copyright 2023 Yuki Kimoto. All Rights Reserved.

MIT License.