1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
|
use inc::Module::Install 0.97;
use strict;
use warnings;
use POSIX ();
use 5.008001;
use FindBin;
use lib "$FindBin::Bin/lib";
# adjust ENV for $AUTHOR system() calls
use Config;
$ENV{PERL5LIB} = join ($Config{path_sep}, @INC);
use Getopt::Long qw/:config gnu_getopt bundling_override no_ignore_case pass_through/;
my $args = {
skip_author_deps => undef,
};
GetOptions ($args, 'skip_author_deps');
if (@ARGV) {
warn "\nIgnoring unrecognized option(s): @ARGV\n\n";
}
###
### DO NOT ADD OPTIONAL DEPENDENCIES HERE, EVEN AS recommends()
### All of them should go to DBIx::Class::Optional::Dependencies
###
name 'DBIx-Class';
perl_version '5.008001';
all_from 'lib/DBIx/Class.pm';
my $build_requires = {
'DBD::SQLite' => '1.25',
};
my $test_requires = {
'File::Temp' => '0.22',
'Test::Builder' => '0.33',
'Test::Exception' => '0',
'Test::More' => '0.92',
'Test::Warn' => '0.21',
};
my $runtime_requires = {
'Carp::Clan' => '6.0',
'Class::Accessor::Grouped' => '0.09003',
'Class::C3::Componentised' => '1.0005',
'Class::Inspector' => '1.24',
'Data::Page' => '2.00',
'DBI' => '1.609',
'File::Path' => '2.07',
'MRO::Compat' => '0.09',
'Module::Find' => '0.06',
'Path::Class' => '0.18',
'SQL::Abstract' => '1.67',
'SQL::Abstract::Limit' => '0.13',
'Sub::Name' => '0.04',
'Data::Dumper::Concise' => '1.000',
'Scope::Guard' => '0.03',
'Context::Preserve' => '0.01',
'Try::Tiny' => '0.04',
'namespace::clean' => '0.14',
'Math::BigInt' => '1.89',
'Math::Base36' => '0.07',
};
# this is so we can order requires alphabetically
# copies are needed for author requires injection
my $reqs = {
build_requires => { %$build_requires },
requires => { %$runtime_requires },
test_requires => { %$test_requires },
};
# require extra modules for testing if we're in a checkout
my $optdep_msg;
if ($Module::Install::AUTHOR) {
if ($args->{skip_author_deps}) {
$optdep_msg = <<'EOW';
******************************************************************************
******************************************************************************
*** ***
*** IGNORING AUTHOR MODE: no optional test dependencies will be forced. ***
*** ***
*** If you are using this checkout with the intention of submitting a DBIC ***
*** patch, you are *STRONGLY ENCOURAGED* to install all dependencies, so ***
*** that every possible unit-test will run. ***
*** ***
******************************************************************************
******************************************************************************
EOW
}
else {
$optdep_msg = <<'EOW';
******************************************************************************
******************************************************************************
*** ***
*** AUTHOR MODE: all optional test dependencies converted to hard requires ***
*** ( to disabled re-run Makefile.PL with --skip_author_deps ) ***
*** ***
******************************************************************************
******************************************************************************
EOW
require DBIx::Class::Optional::Dependencies;
$reqs->{test_requires} = {
%{$reqs->{test_requires}},
map { %$_ } (values %{DBIx::Class::Optional::Dependencies->req_group_list}),
};
}
}
# compose final req list, for alphabetical ordering
my %final_req;
for my $rtype (keys %$reqs) {
for my $mod (keys %{$reqs->{$rtype}} ) {
# sanity check req duplications
if ($final_req{$mod}) {
die "$mod specified as both a '$rtype' and a '$final_req{$mod}[0]'\n";
}
$final_req{$mod} = [ $rtype, $reqs->{$rtype}{$mod}||0 ],
}
}
# actual require
for my $mod (sort keys %final_req) {
my ($rtype, $ver) = @{$final_req{$mod}};
no strict 'refs';
$rtype->($mod, $ver);
}
# output twice since the deplist is > 70 lines
warn $optdep_msg if $Module::Install::AUTHOR;
auto_install();
warn $optdep_msg if $Module::Install::AUTHOR;
# re-create various autogenerated documentation bits
if ($Module::Install::AUTHOR) {
print "Regenerating README\n";
system('pod2text lib/DBIx/Class.pm > README');
if (-f 'MANIFEST') {
print "Removing MANIFEST\n";
unlink 'MANIFEST';
}
print "Regenerating Optional/Dependencies.pod\n";
require DBIx::Class::Optional::Dependencies;
DBIx::Class::Optional::Dependencies->_gen_pod;
# FIXME Disabled due to unsolved issues, ask theorbtwo
# require Module::Install::Pod::Inherit;
# PodInherit();
}
tests_recursive (qw|
t
|);
# temporary(?) until I get around to fix M::I wrt xt/
# needs Module::Install::AuthorTests
eval {
recursive_author_tests (qw/xt/);
1;
} || do {
unless ($args->{skip_author_deps}) {
my $err = $@;
eval { require Module::Install::AuthorTests }
|| die "\nYou need Module::Install::AuthorTests installed to run this Makefile.PL in author mode (or supply --skip_author_deps):\n\n$@\n";
die $@;
}
};
install_script (qw|
script/dbicadmin
|);
### Mangle makefile - read the comments for more info
#
postamble <<"EOP";
# This will add an extra dep-spec for the distdir target,
# which `make` will fold together in a first-come first-serve
# fashion. What we do here is essentially adding extra
# commands to execute once the distdir is assembled (via
# create_distdir), but before control is returned to a higher
# calling rule.
distdir : dbicadmin_pod_inject
# The pod self-injection code is in fact a hidden option in
# dbicadmin itself
dbicadmin_pod_inject :
\tcd \$(DISTVNAME) && \$(ABSPERL) -Ilib script/dbicadmin --selfinject-pod
# Regenerate manifest before running create_distdir.
create_distdir : manifest
EOP
homepage 'http://www.dbix-class.org/';
resources 'IRC' => 'irc://irc.perl.org/#dbix-class';
resources 'license' => 'http://dev.perl.org/licenses/';
resources 'repository' => 'git://git.shadowcat.co.uk/dbsrgits/DBIx-Class.git';
resources 'MailingList' => 'http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class';
# Deprecated/internal modules need no exposure
no_index directory => $_ for (qw|
lib/DBIx/Class/Admin
lib/DBIx/Class/SQLAHacks
lib/DBIx/Class/PK/Auto
lib/DBIx/Class/CDBICompat
|);
no_index package => $_ for (qw/
DBIx::Class::SQLAHacks DBIx::Class::Storage::DBIHacks
/);
WriteAll();
# Re-write META.yml to _exclude_ all forced requires (we do not want to ship this)
# We are also not using M::I::AuthorRequires as this will be an extra dep, and
# deps in Makefile.PL suck (no autoinstall)
if ($Module::Install::AUTHOR && ! $args->{skip_author_deps} ) {
# FIXME test_requires is not yet part of META
my %original_build_requires = ( %$build_requires, %$test_requires );
my @all_build_requires = @{delete Meta->{values}{build_requires}};
my %removed_build_requires;
for (@all_build_requires) {
if ($original_build_requires{$_->[0]}) {
push @{Meta->{values}{build_requires}}, $_;
}
else {
$removed_build_requires{$_->[0]} = $_->[1]
unless $_->[0] eq 'ExtUtils::MakeMaker';
}
}
print "Regenerating META with author requires excluded\n";
Meta->write;
# test that we really took things away (just in case)
my $meta = do { local @ARGV = 'META.yml'; local $/; <> };
for (keys %removed_build_requires) {
delete $removed_build_requires{$_}
unless $meta =~ /^ \s+ $_: \s+ $removed_build_requires{$_} \s* $/mx
}
if (keys %removed_build_requires) {
die join ("\n", "\n\nFATAL FAIL! It looks like some author dependencies made it to the META.yml:\n",
map { "\t$_" } (keys %removed_build_requires)
) . "\n\n";
}
}
|