1
0

Makefile.pm 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. #line 1
  2. package Module::Install::Makefile;
  3. use strict 'vars';
  4. use ExtUtils::MakeMaker ();
  5. use Module::Install::Base ();
  6. use Fcntl qw/:flock :seek/;
  7. use vars qw{$VERSION @ISA $ISCORE};
  8. BEGIN {
  9. $VERSION = '1.01';
  10. @ISA = 'Module::Install::Base';
  11. $ISCORE = 1;
  12. }
  13. sub Makefile { $_[0] }
  14. my %seen = ();
  15. sub prompt {
  16. shift;
  17. # Infinite loop protection
  18. my @c = caller();
  19. if ( ++$seen{"$c[1]|$c[2]|$_[0]"} > 3 ) {
  20. die "Caught an potential prompt infinite loop ($c[1]|$c[2]|$_[0])";
  21. }
  22. # In automated testing or non-interactive session, always use defaults
  23. if ( ($ENV{AUTOMATED_TESTING} or -! -t STDIN) and ! $ENV{PERL_MM_USE_DEFAULT} ) {
  24. local $ENV{PERL_MM_USE_DEFAULT} = 1;
  25. goto &ExtUtils::MakeMaker::prompt;
  26. } else {
  27. goto &ExtUtils::MakeMaker::prompt;
  28. }
  29. }
  30. # Store a cleaned up version of the MakeMaker version,
  31. # since we need to behave differently in a variety of
  32. # ways based on the MM version.
  33. my $makemaker = eval $ExtUtils::MakeMaker::VERSION;
  34. # If we are passed a param, do a "newer than" comparison.
  35. # Otherwise, just return the MakeMaker version.
  36. sub makemaker {
  37. ( @_ < 2 or $makemaker >= eval($_[1]) ) ? $makemaker : 0
  38. }
  39. # Ripped from ExtUtils::MakeMaker 6.56, and slightly modified
  40. # as we only need to know here whether the attribute is an array
  41. # or a hash or something else (which may or may not be appendable).
  42. my %makemaker_argtype = (
  43. C => 'ARRAY',
  44. CONFIG => 'ARRAY',
  45. # CONFIGURE => 'CODE', # ignore
  46. DIR => 'ARRAY',
  47. DL_FUNCS => 'HASH',
  48. DL_VARS => 'ARRAY',
  49. EXCLUDE_EXT => 'ARRAY',
  50. EXE_FILES => 'ARRAY',
  51. FUNCLIST => 'ARRAY',
  52. H => 'ARRAY',
  53. IMPORTS => 'HASH',
  54. INCLUDE_EXT => 'ARRAY',
  55. LIBS => 'ARRAY', # ignore ''
  56. MAN1PODS => 'HASH',
  57. MAN3PODS => 'HASH',
  58. META_ADD => 'HASH',
  59. META_MERGE => 'HASH',
  60. PL_FILES => 'HASH',
  61. PM => 'HASH',
  62. PMLIBDIRS => 'ARRAY',
  63. PMLIBPARENTDIRS => 'ARRAY',
  64. PREREQ_PM => 'HASH',
  65. CONFIGURE_REQUIRES => 'HASH',
  66. SKIP => 'ARRAY',
  67. TYPEMAPS => 'ARRAY',
  68. XS => 'HASH',
  69. # VERSION => ['version',''], # ignore
  70. # _KEEP_AFTER_FLUSH => '',
  71. clean => 'HASH',
  72. depend => 'HASH',
  73. dist => 'HASH',
  74. dynamic_lib=> 'HASH',
  75. linkext => 'HASH',
  76. macro => 'HASH',
  77. postamble => 'HASH',
  78. realclean => 'HASH',
  79. test => 'HASH',
  80. tool_autosplit => 'HASH',
  81. # special cases where you can use makemaker_append
  82. CCFLAGS => 'APPENDABLE',
  83. DEFINE => 'APPENDABLE',
  84. INC => 'APPENDABLE',
  85. LDDLFLAGS => 'APPENDABLE',
  86. LDFROM => 'APPENDABLE',
  87. );
  88. sub makemaker_args {
  89. my ($self, %new_args) = @_;
  90. my $args = ( $self->{makemaker_args} ||= {} );
  91. foreach my $key (keys %new_args) {
  92. if ($makemaker_argtype{$key}) {
  93. if ($makemaker_argtype{$key} eq 'ARRAY') {
  94. $args->{$key} = [] unless defined $args->{$key};
  95. unless (ref $args->{$key} eq 'ARRAY') {
  96. $args->{$key} = [$args->{$key}]
  97. }
  98. push @{$args->{$key}},
  99. ref $new_args{$key} eq 'ARRAY'
  100. ? @{$new_args{$key}}
  101. : $new_args{$key};
  102. }
  103. elsif ($makemaker_argtype{$key} eq 'HASH') {
  104. $args->{$key} = {} unless defined $args->{$key};
  105. foreach my $skey (keys %{ $new_args{$key} }) {
  106. $args->{$key}{$skey} = $new_args{$key}{$skey};
  107. }
  108. }
  109. elsif ($makemaker_argtype{$key} eq 'APPENDABLE') {
  110. $self->makemaker_append($key => $new_args{$key});
  111. }
  112. }
  113. else {
  114. if (defined $args->{$key}) {
  115. warn qq{MakeMaker attribute "$key" is overriden; use "makemaker_append" to append values\n};
  116. }
  117. $args->{$key} = $new_args{$key};
  118. }
  119. }
  120. return $args;
  121. }
  122. # For mm args that take multiple space-seperated args,
  123. # append an argument to the current list.
  124. sub makemaker_append {
  125. my $self = shift;
  126. my $name = shift;
  127. my $args = $self->makemaker_args;
  128. $args->{$name} = defined $args->{$name}
  129. ? join( ' ', $args->{$name}, @_ )
  130. : join( ' ', @_ );
  131. }
  132. sub build_subdirs {
  133. my $self = shift;
  134. my $subdirs = $self->makemaker_args->{DIR} ||= [];
  135. for my $subdir (@_) {
  136. push @$subdirs, $subdir;
  137. }
  138. }
  139. sub clean_files {
  140. my $self = shift;
  141. my $clean = $self->makemaker_args->{clean} ||= {};
  142. %$clean = (
  143. %$clean,
  144. FILES => join ' ', grep { length $_ } ($clean->{FILES} || (), @_),
  145. );
  146. }
  147. sub realclean_files {
  148. my $self = shift;
  149. my $realclean = $self->makemaker_args->{realclean} ||= {};
  150. %$realclean = (
  151. %$realclean,
  152. FILES => join ' ', grep { length $_ } ($realclean->{FILES} || (), @_),
  153. );
  154. }
  155. sub libs {
  156. my $self = shift;
  157. my $libs = ref $_[0] ? shift : [ shift ];
  158. $self->makemaker_args( LIBS => $libs );
  159. }
  160. sub inc {
  161. my $self = shift;
  162. $self->makemaker_args( INC => shift );
  163. }
  164. sub _wanted_t {
  165. }
  166. sub tests_recursive {
  167. my $self = shift;
  168. my $dir = shift || 't';
  169. unless ( -d $dir ) {
  170. die "tests_recursive dir '$dir' does not exist";
  171. }
  172. my %tests = map { $_ => 1 } split / /, ($self->tests || '');
  173. require File::Find;
  174. File::Find::find(
  175. sub { /\.t$/ and -f $_ and $tests{"$File::Find::dir/*.t"} = 1 },
  176. $dir
  177. );
  178. $self->tests( join ' ', sort keys %tests );
  179. }
  180. sub write {
  181. my $self = shift;
  182. die "&Makefile->write() takes no arguments\n" if @_;
  183. # Check the current Perl version
  184. my $perl_version = $self->perl_version;
  185. if ( $perl_version ) {
  186. eval "use $perl_version; 1"
  187. or die "ERROR: perl: Version $] is installed, "
  188. . "but we need version >= $perl_version";
  189. }
  190. # Make sure we have a new enough MakeMaker
  191. require ExtUtils::MakeMaker;
  192. if ( $perl_version and $self->_cmp($perl_version, '5.006') >= 0 ) {
  193. # MakeMaker can complain about module versions that include
  194. # an underscore, even though its own version may contain one!
  195. # Hence the funny regexp to get rid of it. See RT #35800
  196. # for details.
  197. my $v = $ExtUtils::MakeMaker::VERSION =~ /^(\d+\.\d+)/;
  198. $self->build_requires( 'ExtUtils::MakeMaker' => $v );
  199. $self->configure_requires( 'ExtUtils::MakeMaker' => $v );
  200. } else {
  201. # Allow legacy-compatibility with 5.005 by depending on the
  202. # most recent EU:MM that supported 5.005.
  203. $self->build_requires( 'ExtUtils::MakeMaker' => 6.42 );
  204. $self->configure_requires( 'ExtUtils::MakeMaker' => 6.42 );
  205. }
  206. # Generate the MakeMaker params
  207. my $args = $self->makemaker_args;
  208. $args->{DISTNAME} = $self->name;
  209. $args->{NAME} = $self->module_name || $self->name;
  210. $args->{NAME} =~ s/-/::/g;
  211. $args->{VERSION} = $self->version or die <<'EOT';
  212. ERROR: Can't determine distribution version. Please specify it
  213. explicitly via 'version' in Makefile.PL, or set a valid $VERSION
  214. in a module, and provide its file path via 'version_from' (or
  215. 'all_from' if you prefer) in Makefile.PL.
  216. EOT
  217. $DB::single = 1;
  218. if ( $self->tests ) {
  219. my @tests = split ' ', $self->tests;
  220. my %seen;
  221. $args->{test} = {
  222. TESTS => (join ' ', grep {!$seen{$_}++} @tests),
  223. };
  224. } elsif ( $Module::Install::ExtraTests::use_extratests ) {
  225. # Module::Install::ExtraTests doesn't set $self->tests and does its own tests via harness.
  226. # So, just ignore our xt tests here.
  227. } elsif ( -d 'xt' and ($Module::Install::AUTHOR or $ENV{RELEASE_TESTING}) ) {
  228. $args->{test} = {
  229. TESTS => join( ' ', map { "$_/*.t" } grep { -d $_ } qw{ t xt } ),
  230. };
  231. }
  232. if ( $] >= 5.005 ) {
  233. $args->{ABSTRACT} = $self->abstract;
  234. $args->{AUTHOR} = join ', ', @{$self->author || []};
  235. }
  236. if ( $self->makemaker(6.10) ) {
  237. $args->{NO_META} = 1;
  238. #$args->{NO_MYMETA} = 1;
  239. }
  240. if ( $self->makemaker(6.17) and $self->sign ) {
  241. $args->{SIGN} = 1;
  242. }
  243. unless ( $self->is_admin ) {
  244. delete $args->{SIGN};
  245. }
  246. if ( $self->makemaker(6.31) and $self->license ) {
  247. $args->{LICENSE} = $self->license;
  248. }
  249. my $prereq = ($args->{PREREQ_PM} ||= {});
  250. %$prereq = ( %$prereq,
  251. map { @$_ } # flatten [module => version]
  252. map { @$_ }
  253. grep $_,
  254. ($self->requires)
  255. );
  256. # Remove any reference to perl, PREREQ_PM doesn't support it
  257. delete $args->{PREREQ_PM}->{perl};
  258. # Merge both kinds of requires into BUILD_REQUIRES
  259. my $build_prereq = ($args->{BUILD_REQUIRES} ||= {});
  260. %$build_prereq = ( %$build_prereq,
  261. map { @$_ } # flatten [module => version]
  262. map { @$_ }
  263. grep $_,
  264. ($self->configure_requires, $self->build_requires)
  265. );
  266. # Remove any reference to perl, BUILD_REQUIRES doesn't support it
  267. delete $args->{BUILD_REQUIRES}->{perl};
  268. # Delete bundled dists from prereq_pm, add it to Makefile DIR
  269. my $subdirs = ($args->{DIR} || []);
  270. if ($self->bundles) {
  271. my %processed;
  272. foreach my $bundle (@{ $self->bundles }) {
  273. my ($mod_name, $dist_dir) = @$bundle;
  274. delete $prereq->{$mod_name};
  275. $dist_dir = File::Basename::basename($dist_dir); # dir for building this module
  276. if (not exists $processed{$dist_dir}) {
  277. if (-d $dist_dir) {
  278. # List as sub-directory to be processed by make
  279. push @$subdirs, $dist_dir;
  280. }
  281. # Else do nothing: the module is already present on the system
  282. $processed{$dist_dir} = undef;
  283. }
  284. }
  285. }
  286. unless ( $self->makemaker('6.55_03') ) {
  287. %$prereq = (%$prereq,%$build_prereq);
  288. delete $args->{BUILD_REQUIRES};
  289. }
  290. if ( my $perl_version = $self->perl_version ) {
  291. eval "use $perl_version; 1"
  292. or die "ERROR: perl: Version $] is installed, "
  293. . "but we need version >= $perl_version";
  294. if ( $self->makemaker(6.48) ) {
  295. $args->{MIN_PERL_VERSION} = $perl_version;
  296. }
  297. }
  298. if ($self->installdirs) {
  299. warn qq{old INSTALLDIRS (probably set by makemaker_args) is overriden by installdirs\n} if $args->{INSTALLDIRS};
  300. $args->{INSTALLDIRS} = $self->installdirs;
  301. }
  302. my %args = map {
  303. ( $_ => $args->{$_} ) } grep {defined($args->{$_} )
  304. } keys %$args;
  305. my $user_preop = delete $args{dist}->{PREOP};
  306. if ( my $preop = $self->admin->preop($user_preop) ) {
  307. foreach my $key ( keys %$preop ) {
  308. $args{dist}->{$key} = $preop->{$key};
  309. }
  310. }
  311. my $mm = ExtUtils::MakeMaker::WriteMakefile(%args);
  312. $self->fix_up_makefile($mm->{FIRST_MAKEFILE} || 'Makefile');
  313. }
  314. sub fix_up_makefile {
  315. my $self = shift;
  316. my $makefile_name = shift;
  317. my $top_class = ref($self->_top) || '';
  318. my $top_version = $self->_top->VERSION || '';
  319. my $preamble = $self->preamble
  320. ? "# Preamble by $top_class $top_version\n"
  321. . $self->preamble
  322. : '';
  323. my $postamble = "# Postamble by $top_class $top_version\n"
  324. . ($self->postamble || '');
  325. local *MAKEFILE;
  326. open MAKEFILE, "+< $makefile_name" or die "fix_up_makefile: Couldn't open $makefile_name: $!";
  327. eval { flock MAKEFILE, LOCK_EX };
  328. my $makefile = do { local $/; <MAKEFILE> };
  329. $makefile =~ s/\b(test_harness\(\$\(TEST_VERBOSE\), )/$1'inc', /;
  330. $makefile =~ s/( -I\$\(INST_ARCHLIB\))/ -Iinc$1/g;
  331. $makefile =~ s/( "-I\$\(INST_LIB\)")/ "-Iinc"$1/g;
  332. $makefile =~ s/^(FULLPERL = .*)/$1 "-Iinc"/m;
  333. $makefile =~ s/^(PERL = .*)/$1 "-Iinc"/m;
  334. # Module::Install will never be used to build the Core Perl
  335. # Sometimes PERL_LIB and PERL_ARCHLIB get written anyway, which breaks
  336. # PREFIX/PERL5LIB, and thus, install_share. Blank them if they exist
  337. $makefile =~ s/^PERL_LIB = .+/PERL_LIB =/m;
  338. #$makefile =~ s/^PERL_ARCHLIB = .+/PERL_ARCHLIB =/m;
  339. # Perl 5.005 mentions PERL_LIB explicitly, so we have to remove that as well.
  340. $makefile =~ s/(\"?)-I\$\(PERL_LIB\)\1//g;
  341. # XXX - This is currently unused; not sure if it breaks other MM-users
  342. # $makefile =~ s/^pm_to_blib\s+:\s+/pm_to_blib :: /mg;
  343. seek MAKEFILE, 0, SEEK_SET;
  344. truncate MAKEFILE, 0;
  345. print MAKEFILE "$preamble$makefile$postamble" or die $!;
  346. close MAKEFILE or die $!;
  347. 1;
  348. }
  349. sub preamble {
  350. my ($self, $text) = @_;
  351. $self->{preamble} = $text . $self->{preamble} if defined $text;
  352. $self->{preamble};
  353. }
  354. sub postamble {
  355. my ($self, $text) = @_;
  356. $self->{postamble} ||= $self->admin->postamble;
  357. $self->{postamble} .= $text if defined $text;
  358. $self->{postamble}
  359. }
  360. 1;
  361. __END__
  362. #line 541