#!perl

use strict;
use warnings;

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

SPVM::Builder::Util::getopt
  'h|help'          => \my $help,
  'v|version'       => \my $show_version,
  'q|quiet'   => \my $quiet,
  'f|force' => \my $force,
  'native=s' => \my $native,
  'precompile' => \my $precompile,
  'resource' => \my $resource,
  'interface' => \my $interface,
  'only-lib-files' => \my $only_lib_files,
  'no-pm-file' => \my $no_pm_file,
  'genlib' => \my $genlib,
  'user-name=s' => \my $user_name,
  'user-email=s' => \my $user_email,
  'version_from=s' => \my $version_from,
;

if ($help) {
  print SPVM::Builder::Util::extract_usage;
}
elsif ($show_version) {
  my $version_string = "spvmdist v$SPVM::VERSION";
  print "$version_string\n";
}
else {
  my ($class_name, $output_dir) = @ARGV;
  unless (defined $class_name) {
    die SPVM::Builder::Util::extract_usage;
  }
  
  if ($genlib) {
    $only_lib_files = 1;
    $no_pm_file = 1;
  }
  
  my $gendist= SPVM::Dist->new(
    class_name => $class_name,
    quiet => $quiet,
    force => $force,
    output_dir => $output_dir,
    native => $native,
    precompile => $precompile,
    only_lib_files => $only_lib_files,
    no_pm_file => $no_pm_file,
    interface => $interface,
    resource => $resource,
    user_name => $user_name,
    user_email => $user_email,
    version_from => $version_from,
  );
  
  $gendist->generate_dist;
}

=encoding utf8

=head1 Name

spvmdist - Generating SPVM Distribution

=head1 Usage

  Usage: spvmdist [OPTIONS] CLASS_NAME [DIR]
    
    spvmdist Foo
    spvmdist Foo My-Foo
    spvmdist Foo::Bar::Baz
    spvmdist --native c Foo
    spvmdist --native c++ Foo
    spvmdist --precompile Foo
    spvmdist --resource Foo

  Options:
    -h, --help                     Show this message
    -v, --version                  Show the version
    -q, --quiet                    Quiet output
    -f, --force                    Force to generate files
    --native LANGUAGE              Output a distributioon for a native class
    --precompile                   Add precompilattion setting
    --only-lib-files               Output only the files in "lib" directory
    --no-pm-file                   Don't output Perl module(.pm) file
    --resource                     Output a distributioon for for a resource
    --genlib                       Shortcut for --only-lib-files --no-pm-file
    --user-name NAME               User name
    --user-email EMAIL             User email
    --version_from CLASS_NAME      Add version_from statement


=head1 Description

C<spvmdist> is the command to generate a SPVM distribution.

=head1 Details

  spvmdist [OPTIONS] CLASS_NAME [DIR]

I<OPTIONS> are L<options|/"Options">. These are optional.

C<E<lt>class nameE<gt>> is the name of the class contained in the distribution.

I<DIR> is the output directory. This is optional. The default is the current directory.

These are the output files when C<E<lt>class nameE<gt>> is C<MyClass>.

  SPVM-MyClass
  SPVM-MyClass/.gitattributes
  SPVM-MyClass/MANIFEST.SKIP
  SPVM-MyClass/.gitignore
  SPVM-MyClass/LICENSE
  SPVM-MyClass/Makefile.PL
  SPVM-MyClass/t
  SPVM-MyClass/t/basic.t
  SPVM-MyClass/t/lib
  SPVM-MyClass/t/lib/SPVM
  SPVM-MyClass/t/lib/SPVM/TestCase
  SPVM-MyClass/t/lib/SPVM/TestCase/MyClass.spvm
  SPVM-MyClass/README.md
  SPVM-MyClass/Changes
  SPVM-MyClass/lib
  SPVM-MyClass/lib/SPVM
  SPVM-MyClass/lib/SPVM/MyClass.spvm
  SPVM-MyClass/lib/SPVM/MyClass.pm

If a file is already exists, the file is not overwritten.

=head1 Options

=head2 --help

  --help

Outputs how to use the C<spvmdist> command to standard output.

=head2 -h

  -h

Same as L</"--help">.

=head2 --version

  --version

Outputs the version of the C<spvmdist> command to standard output. This version is the same as the version of L<SPVM>.

=head2 -v

  -v

Same as L</"--version">.

=head2 --quiet

  --quiet

Suppresses messages from the C<spvmdist> command.

=head2 -q

  -q

Same as L</"--quiet">.

=head2 --force

  --force

If this option is specified and files as the same name as the files output by the C<spvmdist> command are exists, the files are overwritten.

=head2 -f

  -f

Same as L</"--force">.

=head2 --native

  --native LANGUAGE

Outputs a distribution for a L<native class|SPVM::Document::NativeClass> specified in I<LANGUAGE>.

The default is C<c>.

The List of Option Values:

=over 2

=item * C<c>

The C language.

=item * C<c++>

C++

=back

=head2 --precompile

  --precompile

Adds precompilation setting. If the class has precompilation methods, it is good to specify this option.

=head2 --only-lib-files

  --only-lib-files

Output only files output to the C<lib> directory. These files are a SPVM class file (.spvm) and a Perl module file (.pm).

=head2 --no-pm-file

  --no-pm-file

Dose not output a Perl module file (.pm).

=head2 --resource

  --resource

Output a distribution for a L<resource|SPVM::Document::Resource>.

=head2 --genlib

  --genlib

Specifies both L</"--only-lib-files"> and L<"--no-pm-file">.

=head2 --user-name

  --user-name NAME

Specifies the user name I<NAME>.

=head2 --user-email

  --user-email EMAIL

Specifies the user email I<EMAIL>.

=head2 --version_from

  --version_from CLASS_NAME

Add version_from statement given I<CLASS_NAME>.

=head1 Copyright & License

Copyright 2023 Yuki Kimoto. All Rights Reserved.

MIT License.