name             = MarpaX-ESLIF
author           = Jean-Damien Durand <jeandamiendurand@free.fr>
license          = Perl_5
copyright_holder = Jean-Damien Durand
copyright_year   = 2017

; -- This is 95% Dagolden remarquable dist.ini

; version provider
[Git::NextVersion]  ; get version from last release tag
; Historically, tags started with a v, then I moved to a version without v
version_regexp = ^v?(\d+\.\d+\.\d+)$
 
; collect contributors list
[Git::Contributors]
 
; choose files to include
[Git::GatherDir]         ; everything from git ls-files
exclude_filename = META.json    ; skip this generated file
exclude_filename = Changes      ; skip this generated file

[Encoding]
encoding = bytes
filename = src/3rdparty/github/tconv/3rdparty/tar/cchardet-1.0.0.tar.gz
filename = src/3rdparty/github/tconv/3rdparty/tar/libiconv-1.15.tar.gz
filename = src/3rdparty/tar/pcre2-10.22.tar.gz
filename = src/3rdparty/tar/pcre2-10.23.tar.gz
filename = src/3rdparty/tar/pcre2-10.23-patched.tar.gz

; Why does it copy cmake/* under src if I say
; [GatherDir / SpecFiles]
; root   = src
; prefix = src
; !?

[GatherDir / src]
root   = src
prefix = src/.

[GatherFile]
; These PODs are generated
filename = lib/MarpaX/ESLIF/BNF.pod
filename = lib/MarpaX/ESLIF/Introduction.pod

[PruneCruft]        ; default stuff to skip
[ManifestSkip]      ; if -f MANIFEST.SKIP, skip those, too
 
; file modifications
[OurPkgVersion]     ; add $VERSION = ... to all files
[InsertCopyright]   ; add copyright at "# COPYRIGHT"
[PodnameFromClassname] ; For Moops
[PodWeaver]         ; generate Pod
config_plugin = @RJBS
[Authority]
authority = cpan:JDDPAUSE
locate_comment = 1

; generated files
[License]           ; boilerplate license
[ReadmeFromPod]     ; from Pod (runs after PodWeaver)
[ChangelogFromGit::CPAN::Changes] ; Generated Changes from git
file_name = Changes
group_by_author = 1 ; default 0
show_author_email = 1 ; default 0
tag_regexp  = ^v?(\d+\.\d+\.\d+)$
 
; t tests
[Test::Compile]     ; make sure .pm files all compile
fake_home = 1       ; fakes $ENV{HOME} just in case
[Test::Portability] ; xt/release/portability.t (of file name)
options = test_one_dot = 0
[Test::PodSpelling] ; xt/author/pod-spell.t

[@TestingMania]
disable = Test::UnusedVars  ; Not fatal IMHO and there are cases where this cannot be avoided
disable = Test::Compile     ; Already done before
disable = Test::Portability ; Already done before
disable = Test::PodSpelling ; Already done before (not int, but just in case)

[Test::ReportPrereqs] ; show prereqs in automated test output
 
; metadata
[AutoPrereqs]       ; find prereqs from code
# skip = ^MarpaX::ESLIF::Test$
 
[Prereqs / ConfigureRequires]
; CMakeObjects.PL and MakeMaker::Awesome stuff
diagnostics = 0
strict = 0
Archive::Tar = 0
Config = 0
Config::AutoConf = 0
Config::AutoConf::INI = 0.005
; 0.280224 is to make sure we have the support of $ENV{CXX}
ExtUtils::CBuilder = 0.280224
ExtUtils::Constant = 0
File::chdir = 0
File::Basename = 0
File::Copy = 0
File::Copy::Recursive = 0
File::Find = 0
File::Path = 0
File::Spec = 0
IO::Handle = 0
IPC::Run = 0
Perl::OSType = 0
POSIX = 0
Try::Tiny = 0
; If we use our local ExtUtils::CppGuess we will need its dependencies
Capture::Tiny = 0

[Prereqs / ConfigureSuggests]
; Well, ExtUtils::CppGuess does not install everywhere, in particular there is a problem on solaris
; This is why we have an explicit copy in our inc that we enclose with a try/catch
ExtUtils::CppGuess = 0

[Prereqs / TestRequires]
; t/test.t depend on Log::Any::Adapter::Log4perl that is "hiden"
Log::Any::Adapter::Log4perl = 0
; And the dependencies of the later are not automatically detected by dzil build, I do not know why
Log::Log4perl = 1.32
Log::Any::Adapter::Util = 1.03

[MinimumPerl]       ; determine minimum perl version
 
[MetaNoIndex]       ; sets 'no_index' in META
directory = t
directory = xt
directory = examples
directory = blog
directory = src
directory = etc
file = README.solaris
; Although documented, not used in the perl interface.
file = lib/MarpaX/ESLIF/Value/Type.pm
  
[AutoMetaResources] ; set META resources
bugtracker.rt      = 1
repository.github  = user:jddurand;dist:c-marpaESLIF;lcdist:c-marpaeslif
homepage           = https://metacpan.org/release/%{dist}
 
[MetaProvides::Package] ; add 'provides' to META files
meta_noindex = 1        ; respect prior no_index directives
 
[MetaYAML]          ; generate META.yml
[MetaJSON]          ; generate META.json
 
; build system
[ExecDir]           ; include 'bin/*' as executables
[ShareDir]          ; include shared resources for File::ShareDir
; dir = share/dist/MarpaX-ESLIF
[MakeMaker::Awesome]
eumm_version = 7.20  ; C.f. https://github.com/Perl-Toolchain-Gang/ExtUtils-MakeMaker/pull/275
; But the build platforms might have different internals.
; For example the isblank stuff.
delimiter = |
header = |BEGIN {
header = |  use File::Spec;                     # Formally it is not necessary I believe to do it here
header = |  # Make sure we have our 'inc' directory in the perl search path
header = |  my $inc_dir = File::Spec->catdir(File::Spec->curdir, 'inc');
header = |  push(@INC, $inc_dir);
header = |  #
header = |  # ExtUtils::CppGuess does not install everywhere.
header = |  # This is why we provide it explicitely, we are ok if it fails at run-time
header = |  # (eg. on solaris).
header = |  #
header = |  eval 'use ExtUtils::CppGuess; 1;' || die "$@";
header = |}
header = |use Config;
header = |use Config::AutoConf;
header = |use ExtUtils::CBuilder;
header = |use ExtUtils::Constant qw /constant_types C_constant XS_constant autoload/;
header = |use File::Basename;
header = |use File::Find;
header = |use IO::Handle;
header = |use IPC::Run qw/run/;
header = |use Perl::OSType qw/is_os_type/;
header = |use Try::Tiny;
header = |
header = |autoflush STDOUT 1;
header = |
header = |#
header = |# Our distribution have both C and CPP files, and we want to make sure that modifying
header = |# CFLAGS will not affect cpp files. Since we require a version of ExtUtils::CBuilder
header = |# that support the environment variables, explicitely setting the environment variables
header = |# from default ExtUtils::Cbuilder will ensure cc and cpp settings will become independant
header = |# if we are doing to modify any of them.
header = |# We do that for linker settings as well for coherency although we will NEVER touch them.
header = |# OTHERLDFLAGS will be specific to this makefile.
header = |#
header = |# Take care: with ExtUtils::CBuilder, $ENV{CFLAGS} and $ENV{LDFLAGS} are appended to default perl compile flags, not the others
header = |#
header = |#
header = |my %cbuilder_config = ExtUtils::CBuilder->new()->get_config;
header = |$ENV{CC} = $cbuilder_config{cc} // 'cc';
header = |$ENV{CFLAGS} //= '';
header = |$ENV{CXX} = $cbuilder_config{cxx} // $ENV{CC};
header = |$ENV{CXXFLAGS} = $cbuilder_config{cxxflags} // $cbuilder_config{ccflags} // '';
header = |$ENV{LD} = $cbuilder_config{ld} // $ENV{CC};
header = |$ENV{LDFLAGS} //= '';
header = |# OTHERLDFLAGS remains local and must affect ONLY this process, not sub-processes
header = |my @OTHERLDFLAGS = ();
header = |#
header = |print "\n";
header = |print "==========================================\n";
header = |print "Original compilers and linker settings as per ExtUtils::CBuilder\n";
header = |print "\n";
header = |print "\$ENV{CC}       (overwrite) " . ($ENV{CC} // '') . "\n";
header = |print "\$ENV{CFLAGS}   (   append) " . ($ENV{CFLAGS} // '') . "\n";
header = |print "\$ENV{CXX}      (overwrite) " . ($ENV{CXX} // '') . "\n";
header = |print "\$ENV{CXXFLAGS} (overwrite) " . ($ENV{CXXFLAGS} // '') . "\n";
header = |print "\$ENV{LD}       (overwrite) " . ($ENV{LD} // '') . "\n";
header = |print "\$ENV{LDFLAGS}  (   append) " . ($ENV{LDFLAGS} // '') . "\n";
header = |print "==========================================\n";
header = |print "\n";
header = |
header = |my $ac = Config::AutoConf->new();
header = |$ac->check_cc;
header = |
header = |# -------------
header = |# CC and CFLAGS
header = |# --------------
header = |#
header = |if (is_os_type('Windows')) {
header = |  print "# Windows platform: in case of MINGW headers, force -D__NO_INLINE__\n";
header = |  $ENV{CFLAGS} .= ' -D__NO_INLINE__';
header = |  $ENV{CXXFLAGS} .= ' -D__NO_INLINE__';
header = |}
header = |
header = |#
header = |# When the compiler is clang, there is a bug with inlining, c.f. for example
header = |# https://sourceforge.net/p/resil/tickets/6/
header = |#
header = |# if (is_os_type('Unix', 'darwin'))
header = |{
header = |  $ac->msg_checking(sprintf "if this is clang compiler");
header = |  if ($ac->link_if_else("#ifndef __clang__\n#error \"this is not clang compiler\"\n#endif\nint main() { return 0; }")) {
header = |      $ac->msg_result('yes');
header = |      #
header = |      # C.f. http://clang.llvm.org/compatibility.html#inline
header = |      #      https://bugzilla.mozilla.org/show_bug.cgi?id=917526
header = |      #
header = |      $ac->msg_notice("Adding -std=gnu89 to CFLAGS for inline semantics");
header = |      $ENV{CFLAGS} .= ' -std=gnu89';
header = |  } else {
header = |      $ac->msg_result('no');
header = |  }
header = |}
header = |
header = |# ----------------
header = |# CXX and CXXFLAGS
header = |# ----------------
header = |try {
header = |   my ($cxx_guess, $extra_cxxflags_guess, $extra_ldflags_guess) = guess_compiler();
header = |   $ENV{CXX} = $cxx_guess;
header = |   $ENV{CXXFLAGS} = ($cbuilder_config{ccflags} // '') . " $extra_cxxflags_guess";
header = |   push(@OTHERLDFLAGS, $extra_ldflags_guess) if $extra_ldflags_guess;
header = |} catch {
header = |   $ac->msg_checking(sprintf "if this is solaris compiler");
header = |   if ($ac->link_if_else("#if defined(__sun) && defined(__SVR4)\n#else\n#error \"this is not solaris compiler\"\n#endif\nint main() { return 0; }")) {
header = |      $ac->msg_result('yes');
header = |      $ac->msg_notice("Forcing CXX to CC");
header = |      $ENV{CXX} = 'CC';
header = |      # We know that ExtUtils::CBuilder will get that wrong...
header = |      # Since a cpp compiler can always compile c code, it is quite safe to assume that the cpp compiler shipped by the same c compiler vendor will accept all CFLAGS
header = |      $ac->msg_notice("Forcing CXXFLAGS to original perl CFLAGS");
header = |      $ENV{CXXFLAGS} = $cbuilder_config{ccflags} // '';
header = |      $ac->msg_notice("Adding -lCrun to OTHERLDFLAGS");
header = |      push(@OTHERLDFLAGS, '-lCrun');
header = |  } else {
header = |      $ac->msg_result('no');
header = |  }
header = |};
header = |
header = |#
header = |# On windows we are using dlfcn-win32 that will imply a dependency on psapi. We verify this library is available
header = |#
header = |if (is_os_type('Windows')) {
header = |  print "# Determining the need for -lpsapi\n";
header = |  $ac->push_libraries('psapi');
header = |  if ($ac->link_if_else("#include <windows.h>\n#include <psapi.h>\nint main() { EnumProcessModules(NULL, NULL, 0, NULL); }")) {
header = |    if (basename($Config{cc}) =~ /^cl/i) {
header = |      $ac->msg_notice("Adding psapi.lib to OTHERLDFLAGS");
header = |      push(@OTHERLDFLAGS, "psapi.lib");
header = |    } else {
header = |      $ac->msg_notice("Adding -lpsapi to OTHERLDFLAGS");
header = |      push(@OTHERLDFLAGS, "-lpsapi");
header = |    }
header = |  }
header = |}
header = |
header = |my $OTHERLDFLAGS = join(' ', @OTHERLDFLAGS);
header = |print "\n";
header = |print "==========================================\n";
header = |print "Tweaked compilers and linker settings\n";
header = |print "\n";
header = |print "\$ENV{CC}       (overwrite) " . ($ENV{CC} // '') . "\n";
header = |print "\$ENV{CFLAGS}   (   append) " . ($ENV{CFLAGS} // '') . "\n";
header = |print "\$ENV{CXX}      (overwrite) " . ($ENV{CXX} // '') . "\n";
header = |print "\$ENV{CXXFLAGS} (overwrite) " . ($ENV{CXXFLAGS} // '') . "\n";
header = |print "\$ENV{LD}       (overwrite) " . ($ENV{LD} // '') . "\n";
header = |print "\$ENV{LDFLAGS}  (   append) " . ($ENV{LDFLAGS} // '') . "\n";
header = |print "OTHERLDFLAGS               $OTHERLDFLAGS\n";
header = |print "==========================================\n";
header = |print "\n";
header = |
header = |my $fh;
header = |print "Generating constant types\n";
header = |open($fh, '>', 'c-constant-types.inc') || die "Cannot open c-constant-types.inc, $!";
header = |print $fh constant_types();
header = |close($fh) || warn "Failed to close c-constant-types.inc, $!";
header = |
header = |my %types = ( 'event' => { pkg => 'MarpaX::ESLIF::Event::Type', constants => [qw/MARPAESLIF_EVENTTYPE_NONE MARPAESLIF_EVENTTYPE_COMPLETED MARPAESLIF_EVENTTYPE_NULLED MARPAESLIF_EVENTTYPE_PREDICTED MARPAESLIF_EVENTTYPE_BEFORE MARPAESLIF_EVENTTYPE_AFTER MARPAESLIF_EVENTTYPE_EXHAUSTED MARPAESLIF_EVENTTYPE_DISCARD/] }, 'value' => { pkg => 'MarpaX::ESLIF::Value::Type', constants => [qw/MARPAESLIF_VALUE_TYPE_UNDEF MARPAESLIF_VALUE_TYPE_CHAR MARPAESLIF_VALUE_TYPE_SHORT MARPAESLIF_VALUE_TYPE_INT MARPAESLIF_VALUE_TYPE_LONG MARPAESLIF_VALUE_TYPE_FLOAT MARPAESLIF_VALUE_TYPE_DOUBLE MARPAESLIF_VALUE_TYPE_PTR MARPAESLIF_VALUE_TYPE_ARRAY/] }, 'loggerLevel' => { pkg => 'MarpaX::ESLIF::Logger::Level', constants => [qw/GENERICLOGGER_LOGLEVEL_TRACE GENERICLOGGER_LOGLEVEL_DEBUG GENERICLOGGER_LOGLEVEL_INFO GENERICLOGGER_LOGLEVEL_NOTICE GENERICLOGGER_LOGLEVEL_WARNING GENERICLOGGER_LOGLEVEL_ERROR GENERICLOGGER_LOGLEVEL_CRITICAL GENERICLOGGER_LOGLEVEL_ALERT GENERICLOGGER_LOGLEVEL_EMERGENCY/] }, 'rulePropertyBitSet' => { pkg => 'MarpaX::ESLIF::Rule::PropertyBitSet', constants => [qw/MARPAESLIF_RULE_IS_ACCESSIBLE MARPAESLIF_RULE_IS_NULLABLE MARPAESLIF_RULE_IS_NULLING MARPAESLIF_RULE_IS_LOOP MARPAESLIF_RULE_IS_PRODUCTIVE/] }, 'symbolPropertyBitSet' => { pkg => 'MarpaX::ESLIF::Symbol::PropertyBitSet', constants => [qw/MARPAESLIF_SYMBOL_IS_ACCESSIBLE MARPAESLIF_SYMBOL_IS_NULLABLE MARPAESLIF_SYMBOL_IS_NULLING MARPAESLIF_SYMBOL_IS_PRODUCTIVE MARPAESLIF_SYMBOL_IS_START MARPAESLIF_SYMBOL_IS_TERMINAL/] }, 'symbol' => { pkg => 'MarpaX::ESLIF::Symbol::Type', constants => [qw/MARPAESLIF_SYMBOLTYPE_TERMINAL MARPAESLIF_SYMBOLTYPE_META/] });
header = |
header = |foreach (sort keys %types) {
header = |  my $pkg = $types{$_}->{pkg};
header = |  print "Generating $pkg C $_ types\n";
header = |  open($fh, '>', "c-$_-types.inc") || die "Cannot open c-$_-types.inc, $!";
header = |  print $fh C_constant($pkg, "${_}_constant", undef, undef, undef, undef, @{$types{$_}->{constants}});
header = |  close($fh) || warn "Failed to close c-$_-types.inc, $!";
header = |
header = |  # This is a bit vicious but in our case these are NOT macros but ENUMS !
header = |  # We know what were are doing and replace all #ifdef MARPAESLIF_xxx and #ifdef GENERICLOGGER_xxx by #if 1
header = |
header = |  print "Tweaking $pkg C $_ types to work with enums\n";
header = |  open($fh, '<', "c-$_-types.inc") || die "Failed to open c-$_-types.inc, $!";
header = |  my $content = do { local $/; <$fh> };
header = |  close($fh) || warn "Failed to close c-$_-types.inc, $!";
header = |  $content =~ s/^#\s*ifdef\s+(?:MARPAESLIF_|GENERICLOGGER_).*?$/#if 1/smg;
header = |  open($fh, '>', "c-$_-types.inc") || die "Failed to open c-$_-types.inc, $!";
header = |  print $fh $content;
header = |  close($fh) || warn "Failed to close c-$_-types.inc, $!";
header = |
header = |  print "Generating $pkg XS $_ types\n";
header = |  open($fh, '>', "xs-$_-types.inc") || die "Cannot open xs-$_-types.inc, $!";
header = |  print $fh XS_constant($pkg, 'IV', 'constant', "${_}_constant");
header = |  close($fh) || warn "Failed to close xs-$_-types.inc, $!";
header = |
header = |  print "Generating $pkg AUTOLOAD\n";
header = |  my $autoload = autoload($pkg, '5.10', 1);
header = |
header = |  my @pkg = split(/::/, $pkg);
header = |  $pkg[-1] .= '.pm';
header = |  my $pkgfile = File::Spec->catfile('lib', @pkg);
header = |  print "Pushing AUTOLOAD into $pkgfile\n";
header = |  open($fh, '<', $pkgfile) || die "Failed to open $pkgfile, $!";
header = |  $content = do { local $/; <$fh> };
header = |  close($fh) || warn "Failed to close $pkgfile, $!";
header = |  $content =~ s/^#\s*AUTOLOAD.*?$/\n$autoload\n/sm;
header = |  open($fh, '>', $pkgfile) || die "Failed to open $pkgfile, $!";
header = |  print $fh $content;
header = |  close($fh) || warn "Failed to close $pkgfile, $!";
header = |}
header = |
header = |run([$^X, File::Spec->catfile('src', 'CMakeObjects.PL')]) or die "src/CMakeObjects.PL: $?";
header = |my @ldfrom = ();
header = |my %unique = ();
header = |
header = |find({ wanted => sub {
header = |                       if (-f $_) {
header = |                         my $cpath = File::Spec->canonpath($_);
header = |                         if (basename(dirname($cpath)) eq 'obj4perl') {
header = |                           if (! ${unique}{basename($cpath)}++) {
header = |                             push(@ldfrom, $cpath);
header = |                           }
header = |                         }
header = |                       }
header = |                     },
header = |      no_chdir => 1 }, File::Spec->curdir);
header = |
header = |print "Linking ESLIF\$(OBJ_EXT) using: @ldfrom\n";
header = |
header = |#
header = |# Inspired by Inline-CPP-0.74/inc/ILCPPConfig/CompilerGuess.pm
header = |#
header = |sub guess_compiler {
header = |
header = |  my ($cxx_guess, $extra_cxxflags_guess, $extra_ldflags_guess, $guesser, %configuration);
header = |
header = |  if( $Config::Config{osname} eq 'freebsd'
header = |    && $Config::Config{osvers} =~ /^(\d+)/
header = |    && $1 >= 10
header = |  ){
header = |    if( $ENV{CC} =~ /\bclang\b/ ) {
header = |      $cxx_guess = $ENV{CC};
header = |      $cxx_guess =~ s/\bclang\b/clang++/;
header = |    } else {
header = |      $cxx_guess = 'clang++';
header = |    }
header = |    $extra_cxxflags_guess = '';     # Extra compile flag moved to compiler command -;
header = |    $extra_ldflags_guess = '-lc++'; # Extra linker flag
header = |  }
header = |  else {
header = |    $guesser = ExtUtils::CppGuess->new(cc => $ENV{CC});
header = |    %configuration = $guesser->module_build_options;
header = |    $extra_cxxflags_guess = $configuration{extra_compiler_flags};
header = |    $extra_ldflags_guess = $configuration{extra_linker_flags};
header = |    if( $guesser->is_gcc ) {
header = |      if( $ENV{CC} =~ /\bclang\b/ ) {
header = |        $cxx_guess = $ENV{CC};
header = |        $cxx_guess =~ s/\bclang\b/clang++/;
header = |      } else {
header = |        if( $ENV{CC} =~ /\bgcc\b/ ) {
header = |          $cxx_guess = $ENV{CC};
header = |          $cxx_guess =~ s/\bgcc\b/g++/;
header = |        } else {
header = |          $cxx_guess = 'g++';
header = |        }
header = |      }
header = |      $extra_cxxflags_guess = '';    # Extra compile flag moved to compiler command, extra linker flag untouched -;
header = |    }
header = |
header = |    ( $cxx_guess, $extra_cxxflags_guess, $extra_ldflags_guess ) = map { _trim_whitespace($_) } ( $cxx_guess, $extra_cxxflags_guess, $extra_ldflags_guess );
header = |  }
header = |  return ( $cxx_guess, $extra_cxxflags_guess, $extra_ldflags_guess );
header = |}
header = |
header = |sub _trim_whitespace {
header = |  my $string = shift;
header = |  $string =~ s/^\s+|\s+$//g;
header = |  return $string;
header = |}
WriteMakefile_arg = OBJECT => 'ESLIF$(OBJ_EXT)'
WriteMakefile_arg = LDFROM => join(' ', '$(OBJECT)', @ldfrom)
WriteMakefile_arg = dynamic_lib => { OTHERLDFLAGS => join(' ', @OTHERLDFLAGS) }
WriteMakefile_arg = INC => join(' ', map { "-I$_ " } (File::Spec->catdir('src', 'output', 'include'), File::Spec->catdir('src', 'include'), File::Spec->catdir('src', 'output', '3rdparty', 'genericLogger', 'output', 'include'), File::Spec->catdir('src', 'output', '3rdparty', 'genericLogger', 'include'), File::Spec->catdir('src', 'output', '3rdparty', 'genericStack', 'include'), File::Spec->catdir('src', 'output', '3rdparty', 'genericHash', 'include') ) )

[DynamicPrereqs]
-delimiter = |
-raw = |use Config;
-raw = |if (! $Config{usethreads}) {
-raw = |  foreach (qw/PREREQ_PM BUILD_REQUIRES TEST_REQUIRES/) {
-raw = |    delete($WriteMakefileArgs{$_}{Thread}) if (exists($WriteMakefileArgs{$_}));
-raw = |    delete($FallbackPrereqs{$_}{Thread})   if (exists($FallbackPrereqs{$_}));
-raw = |  }
-raw = |}

; manifest (after all generated files)
[Manifest]          ; create MANIFEST
 
; copy META.json back to repo dis
[CopyFilesFromBuild]
copy = META.json
copy = Changes
 
; before release
[Git::Check]        ; ensure all files checked in except those generated during dzil
allow_dirty = Changes
allow_dirty = META.json
allow_dirty = dist.ini
untracked_files = ignore

[CheckMetaResources]     ; ensure META has 'resources' data
[CheckPrereqsIndexed]    ; ensure prereqs are on CPAN
; [CheckChangesHasContent] ; ensure Changes has been updated
; [CheckExtraTests]   ; ensure xt/ tests pass
[TestRelease]       ; ensure t/ tests pass
[ConfirmRelease]    ; prompt before uploading
 
; releaser
; [FakeRelease]
[UploadToCPAN]      ; uploads to CPAN
 
; after release
[Git::Commit] ; commit Changes (as released)
allow_dirty = Changes
allow_dirty = META.json
commit_msg  = Release of version %v
 
[Git::Tag]          ; tag repo with custom tag
tag_format = %v
 
; NextRelease acts *during* pre-release to write $VERSION and
; timestamp to Changes and  *after* release to add a new {{$NEXT}}
; section, so to act at the right time after release, it must actually
; come after Commit_Dirty_Files but before Commit_Changes in the
; dist.ini.  It will still act during pre-release as usual
 
[NextRelease]

[Git::Commit / Commit_Changes] ; commit Changes (for new dev)
changelog = Changes
allow_dirty = META.json
 
[Git::Push]         ; push repo to remote
push_to = origin
[Clean]