This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Silence new warning grep in void context warning in various modules and test files...
[perl5.git] / lib / ExtUtils / MM_Any.pm
CommitLineData
f6d6199c
MS
1package ExtUtils::MM_Any;
2
3use strict;
4use vars qw($VERSION @ISA);
6d6be53e 5$VERSION = '6.42';
f6d6199c 6
2977d345 7use Carp;
f6d6199c 8use File::Spec;
7292dc67
RGS
9BEGIN { @ISA = qw(File::Spec); }
10
11# We need $Verbose
12use ExtUtils::MakeMaker qw($Verbose);
13
14use ExtUtils::MakeMaker::Config;
15
16
17# So we don't have to keep calling the methods over and over again,
18# we have these globals to cache the values. Faster and shrtr.
19my $Curdir = __PACKAGE__->curdir;
20my $Rootdir = __PACKAGE__->rootdir;
21my $Updir = __PACKAGE__->updir;
f6d6199c
MS
22
23
24=head1 NAME
25
30361541 26ExtUtils::MM_Any - Platform-agnostic MM methods
f6d6199c
MS
27
28=head1 SYNOPSIS
29
30 FOR INTERNAL USE ONLY!
31
32 package ExtUtils::MM_SomeOS;
33
34 # Temporarily, you have to subclass both. Put MM_Any first.
35 require ExtUtils::MM_Any;
36 require ExtUtils::MM_Unix;
37 @ISA = qw(ExtUtils::MM_Any ExtUtils::Unix);
38
39=head1 DESCRIPTION
40
41B<FOR INTERNAL USE ONLY!>
42
43ExtUtils::MM_Any is a superclass for the ExtUtils::MM_* set of
44modules. It contains methods which are either inherently
45cross-platform or are written in a cross-platform manner.
46
47Subclass off of ExtUtils::MM_Any I<and> ExtUtils::MM_Unix. This is a
48temporary solution.
49
50B<THIS MAY BE TEMPORARY!>
51
f6d6199c 52
7292dc67 53=head1 METHODS
f6d6199c 54
7292dc67 55Any methods marked I<Abstract> must be implemented by subclasses.
dedf98bc 56
5e719f03 57
7292dc67 58=head2 Cross-platform helper methods
5e719f03 59
7292dc67 60These are methods which help writing cross-platform code.
5e719f03 61
5e719f03 62
5e719f03 63
7292dc67
RGS
64=head3 os_flavor I<Abstract>
65
66 my @os_flavor = $mm->os_flavor;
67
68@os_flavor is the style of operating system this is, usually
69corresponding to the MM_*.pm file we're using.
70
71The first element of @os_flavor is the major family (ie. Unix,
72Windows, VMS, OS/2, etc...) and the rest are sub families.
73
74Some examples:
75
76 Cygwin98 ('Unix', 'Cygwin', 'Cygwin9x')
77 Windows NT ('Win32', 'WinNT')
78 Win98 ('Win32', 'Win9x')
79 Linux ('Unix', 'Linux')
80 MacOS X ('Unix', 'Darwin', 'MacOS', 'MacOS X')
81 OS/2 ('OS/2')
82
83This is used to write code for styles of operating system.
84See os_flavor_is() for use.
85
dedf98bc 86
7292dc67
RGS
87=head3 os_flavor_is
88
89 my $is_this_flavor = $mm->os_flavor_is($this_flavor);
90 my $is_this_flavor = $mm->os_flavor_is(@one_of_these_flavors);
dedf98bc
MS
91
92Checks to see if the current operating system is one of the given flavors.
93
94This is useful for code like:
95
96 if( $mm->os_flavor_is('Unix') ) {
97 $out = `foo 2>&1`;
98 }
99 else {
100 $out = `foo`;
101 }
102
103=cut
104
105sub os_flavor_is {
106 my $self = shift;
107 my %flavors = map { ($_ => 1) } $self->os_flavor;
108 return (grep { $flavors{$_} } @_) ? 1 : 0;
109}
110
5dca256e 111
7292dc67 112=head3 split_command
479d2113
MS
113
114 my @cmds = $MM->split_command($cmd, @args);
115
116Most OS have a maximum command length they can execute at once. Large
117modules can easily generate commands well past that limit. Its
118necessary to split long commands up into a series of shorter commands.
119
7292dc67 120C<split_command> will return a series of @cmds each processing part of
479d2113
MS
121the args. Collectively they will process all the arguments. Each
122individual line in @cmds will not be longer than the
123$self->max_exec_len being careful to take into account macro expansion.
124
125$cmd should include any switches and repeated initial arguments.
126
127If no @args are given, no @cmds will be returned.
128
129Pairs of arguments will always be preserved in a single command, this
130is a heuristic for things like pm_to_blib and pod2man which work on
131pairs of arguments. This makes things like this safe:
132
133 $self->split_command($cmd, %pod2man);
134
f6d6199c
MS
135
136=cut
137
479d2113
MS
138sub split_command {
139 my($self, $cmd, @args) = @_;
140
141 my @cmds = ();
142 return(@cmds) unless @args;
143
144 # If the command was given as a here-doc, there's probably a trailing
145 # newline.
146 chomp $cmd;
147
148 # set aside 20% for macro expansion.
149 my $len_left = int($self->max_exec_len * 0.80);
150 $len_left -= length $self->_expand_macros($cmd);
151
152 do {
153 my $arg_str = '';
154 my @next_args;
155 while( @next_args = splice(@args, 0, 2) ) {
156 # Two at a time to preserve pairs.
157 my $next_arg_str = "\t ". join ' ', @next_args, "\n";
158
159 if( !length $arg_str ) {
160 $arg_str .= $next_arg_str
161 }
162 elsif( length($arg_str) + length($next_arg_str) > $len_left ) {
163 unshift @args, @next_args;
164 last;
165 }
166 else {
167 $arg_str .= $next_arg_str;
168 }
169 }
170 chop $arg_str;
171
a7d1454b 172 push @cmds, $self->escape_newlines("$cmd \n$arg_str");
479d2113
MS
173 } while @args;
174
175 return @cmds;
f6d6199c
MS
176}
177
479d2113
MS
178
179sub _expand_macros {
180 my($self, $cmd) = @_;
181
182 $cmd =~ s{\$\((\w+)\)}{
183 defined $self->{$1} ? $self->{$1} : "\$($1)"
184 }e;
185 return $cmd;
186}
187
188
7292dc67 189=head3 echo
479d2113
MS
190
191 my @commands = $MM->echo($text);
192 my @commands = $MM->echo($text, $file);
193 my @commands = $MM->echo($text, $file, $appending);
194
195Generates a set of @commands which print the $text to a $file.
196
197If $file is not given, output goes to STDOUT.
198
199If $appending is true the $file will be appended to rather than
200overwritten.
f6d6199c
MS
201
202=cut
203
479d2113
MS
204sub echo {
205 my($self, $text, $file, $appending) = @_;
206 $appending ||= 0;
207
208 my @cmds = map { '$(NOECHO) $(ECHO) '.$self->quote_literal($_) }
209 split /\n/, $text;
210 if( $file ) {
211 my $redirect = $appending ? '>>' : '>';
212 $cmds[0] .= " $redirect $file";
213 $_ .= " >> $file" foreach @cmds[1..$#cmds];
214 }
215
216 return @cmds;
f6d6199c
MS
217}
218
479d2113 219
7292dc67 220=head3 wraplist
479d2113 221
7292dc67 222 my $args = $mm->wraplist(@list);
479d2113 223
7292dc67
RGS
224Takes an array of items and turns them into a well-formatted list of
225arguments. In most cases this is simply something like:
479d2113 226
7292dc67
RGS
227 FOO \
228 BAR \
229 BAZ
479d2113 230
7292dc67 231=cut
479d2113 232
7292dc67
RGS
233sub wraplist {
234 my $self = shift;
235 return join " \\\n\t", @_;
236}
479d2113 237
479d2113 238
6d6be53e
RGS
239=head3 maketext_filter
240
241 my $filter_make_text = $mm->maketext_filter($make_text);
242
243The text of the Makefile is run through this method before writing to
244disk. It allows systems a chance to make portability fixes to the
245Makefile.
246
247By default it does nothing.
248
249This method is protected and not intended to be called outside of
250MakeMaker.
251
252=cut
253
254sub maketext_filter { return $_[1] }
255
256
7292dc67 257=head3 cd I<Abstract>
479d2113 258
7292dc67 259 my $subdir_cmd = $MM->cd($subdir, @cmds);
479d2113 260
7292dc67
RGS
261This will generate a make fragment which runs the @cmds in the given
262$dir. The rough equivalent to this, except cross platform.
479d2113 263
7292dc67 264 cd $subdir && $cmd
479d2113 265
7292dc67
RGS
266Currently $dir can only go down one level. "foo" is fine. "foo/bar" is
267not. "../foo" is right out.
479d2113 268
7292dc67
RGS
269The resulting $subdir_cmd has no leading tab nor trailing newline. This
270makes it easier to embed in a make string. For example.
479d2113 271
7292dc67
RGS
272 my $make = sprintf <<'CODE', $subdir_cmd;
273 foo :
274 $(ECHO) what
275 %s
276 $(ECHO) mouche
277 CODE
f6d6199c 278
f6d6199c 279
7292dc67 280=head3 oneliner I<Abstract>
479d2113 281
7292dc67
RGS
282 my $oneliner = $MM->oneliner($perl_code);
283 my $oneliner = $MM->oneliner($perl_code, \@switches);
479d2113 284
7292dc67
RGS
285This will generate a perl one-liner safe for the particular platform
286you're on based on the given $perl_code and @switches (a -e is
287assumed) suitable for using in a make target. It will use the proper
288shell quoting and escapes.
479d2113 289
7292dc67 290$(PERLRUN) will be used as perl.
479d2113 291
7292dc67
RGS
292Any newlines in $perl_code will be escaped. Leading and trailing
293newlines will be stripped. Makes this idiom much easier:
479d2113 294
7292dc67
RGS
295 my $code = $MM->oneliner(<<'CODE', [...switches...]);
296some code here
297another line here
298CODE
479d2113 299
7292dc67 300Usage might be something like:
479d2113 301
7292dc67
RGS
302 # an echo emulation
303 $oneliner = $MM->oneliner('print "Foo\n"');
304 $make = '$oneliner > somefile';
479d2113 305
7292dc67
RGS
306All dollar signs must be doubled in the $perl_code if you expect them
307to be interpreted normally, otherwise it will be considered a make
308macro. Also remember to quote make macros else it might be used as a
309bareword. For example:
479d2113 310
7292dc67
RGS
311 # Assign the value of the $(VERSION_FROM) make macro to $vf.
312 $oneliner = $MM->oneliner('$$vf = "$(VERSION_FROM)"');
f6d6199c 313
7292dc67
RGS
314Its currently very simple and may be expanded sometime in the figure
315to include more flexible code and switches.
479d2113 316
479d2113 317
7292dc67 318=head3 quote_literal I<Abstract>
f6d6199c 319
7292dc67 320 my $safe_text = $MM->quote_literal($text);
f6d6199c 321
7292dc67 322This will quote $text so it is interpreted literally in the shell.
f6d6199c 323
7292dc67
RGS
324For example, on Unix this would escape any single-quotes in $text and
325put single-quotes around the whole thing.
479d2113 326
f6d6199c 327
7292dc67 328=head3 escape_newlines I<Abstract>
f6d6199c 329
7292dc67 330 my $escaped_text = $MM->escape_newlines($text);
479d2113 331
7292dc67 332Shell escapes newlines in $text.
479d2113 333
479d2113 334
7292dc67 335=head3 max_exec_len I<Abstract>
479d2113 336
7292dc67 337 my $max_exec_len = $MM->max_exec_len;
479d2113 338
7292dc67
RGS
339Calculates the maximum command size the OS can exec. Effectively,
340this is the max size of a shell command line.
479d2113 341
7292dc67
RGS
342=for _private
343$self->{_MAX_EXEC_LEN} is set by this method, but only for testing purposes.
f6d6199c 344
479d2113 345
2977d345 346=head3 make
479d2113 347
2977d345
RGS
348 my $make = $MM->make;
349
350Returns the make variant we're generating the Makefile for. This attempts
351to do some normalization on the information from %Config or the user.
352
353=cut
354
355sub make {
356 my $self = shift;
357
358 my $make = lc $self->{MAKE};
359
360 # Truncate anything like foomake6 to just foomake.
361 $make =~ s/^(\w+make).*/$1/;
362
363 # Turn gnumake into gmake.
364 $make =~ s/^gnu/g/;
365
366 return $make;
367}
479d2113 368
f6d6199c 369
7292dc67 370=head2 Targets
f6d6199c 371
7292dc67 372These are methods which produce make targets.
479d2113 373
479d2113 374
7292dc67 375=head3 all_target
479d2113 376
7292dc67 377Generate the default target 'all'.
479d2113 378
7292dc67 379=cut
479d2113 380
7292dc67
RGS
381sub all_target {
382 my $self = shift;
479d2113 383
7292dc67
RGS
384 return <<'MAKE_EXT';
385all :: pure_all
386 $(NOECHO) $(NOOP)
387MAKE_EXT
479d2113 388
f6d6199c
MS
389}
390
479d2113 391
7292dc67 392=head3 blibdirs_target
479d2113 393
7292dc67 394 my $make_frag = $mm->blibdirs_target;
479d2113 395
7292dc67
RGS
396Creates the blibdirs target which creates all the directories we use
397in blib/.
f6d6199c 398
7292dc67 399The blibdirs.ts target is deprecated. Depend on blibdirs instead.
f6d6199c 400
479d2113 401
7292dc67
RGS
402=cut
403
404sub blibdirs_target {
405 my $self = shift;
406
407 my @dirs = map { uc "\$(INST_$_)" } qw(libdir archlib
408 autodir archautodir
409 bin script
410 man1dir man3dir
411 );
f6d6199c 412
7292dc67 413 my @exists = map { $_.'$(DFSEP).exists' } @dirs;
479d2113 414
7292dc67
RGS
415 my $make = sprintf <<'MAKE', join(' ', @exists);
416blibdirs : %s
417 $(NOECHO) $(NOOP)
479d2113 418
7292dc67
RGS
419# Backwards compat with 6.18 through 6.25
420blibdirs.ts : blibdirs
421 $(NOECHO) $(NOOP)
479d2113 422
7292dc67
RGS
423MAKE
424
425 $make .= $self->dir_target(@dirs);
426
427 return $make;
428}
429
430
431=head3 clean (o)
432
433Defines the clean target.
f6d6199c
MS
434
435=cut
436
7292dc67
RGS
437sub clean {
438# --- Cleanup and Distribution Sections ---
479d2113 439
7292dc67
RGS
440 my($self, %attribs) = @_;
441 my @m;
442 push(@m, '
443# Delete temporary files but do not touch installed files. We don\'t delete
444# the Makefile here so a later make realclean still has a makefile to use.
445
446clean :: clean_subdirs
447');
448
449 my @files = values %{$self->{XS}}; # .c files from *.xs files
450 my @dirs = qw(blib);
451
452 # Normally these are all under blib but they might have been
453 # redefined.
454 # XXX normally this would be a good idea, but the Perl core sets
455 # INST_LIB = ../../lib rather than actually installing the files.
456 # So a "make clean" in an ext/ directory would blow away lib.
457 # Until the core is adjusted let's leave this out.
458# push @dirs, qw($(INST_ARCHLIB) $(INST_LIB)
459# $(INST_BIN) $(INST_SCRIPT)
460# $(INST_MAN1DIR) $(INST_MAN3DIR)
461# $(INST_LIBDIR) $(INST_ARCHLIBDIR) $(INST_AUTODIR)
462# $(INST_STATIC) $(INST_DYNAMIC) $(INST_BOOT)
463# );
464
465
466 if( $attribs{FILES} ) {
467 # Use @dirs because we don't know what's in here.
468 push @dirs, ref $attribs{FILES} ?
469 @{$attribs{FILES}} :
470 split /\s+/, $attribs{FILES} ;
471 }
479d2113 472
7292dc67
RGS
473 push(@files, qw[$(MAKE_APERL_FILE)
474 perlmain.c tmon.out mon.out so_locations
475 blibdirs.ts pm_to_blib pm_to_blib.ts
476 *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT)
477 $(BOOTSTRAP) $(BASEEXT).bso
478 $(BASEEXT).def lib$(BASEEXT).def
479 $(BASEEXT).exp $(BASEEXT).x
480 ]);
479d2113 481
7292dc67
RGS
482 push(@files, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
483 push(@files, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.ld'));
479d2113 484
7292dc67
RGS
485 # core files
486 push(@files, qw[core core.*perl.*.? *perl.core]);
487 push(@files, map { "core." . "[0-9]"x$_ } (1..5));
479d2113 488
7292dc67
RGS
489 # OS specific things to clean up. Use @dirs since we don't know
490 # what might be in here.
491 push @dirs, $self->extra_clean_files;
f6d6199c 492
7292dc67
RGS
493 # Occasionally files are repeated several times from different sources
494 { my(%f) = map { ($_ => 1) } @files; @files = keys %f; }
495 { my(%d) = map { ($_ => 1) } @dirs; @dirs = keys %d; }
f6d6199c 496
7292dc67
RGS
497 push @m, map "\t$_\n", $self->split_command('- $(RM_F)', @files);
498 push @m, map "\t$_\n", $self->split_command('- $(RM_RF)', @dirs);
f6d6199c 499
7292dc67
RGS
500 # Leave Makefile.old around for realclean
501 push @m, <<'MAKE';
502 - $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL)
503MAKE
479d2113 504
7292dc67 505 push(@m, "\t$attribs{POSTOP}\n") if $attribs{POSTOP};
479d2113 506
7292dc67
RGS
507 join("", @m);
508}
509
510
511=head3 clean_subdirs_target
512
513 my $make_frag = $MM->clean_subdirs_target;
514
515Returns the clean_subdirs target. This is used by the clean target to
516call clean on any subdirectories which contain Makefiles.
479d2113
MS
517
518=cut
519
7292dc67
RGS
520sub clean_subdirs_target {
521 my($self) = shift;
479d2113 522
7292dc67
RGS
523 # No subdirectories, no cleaning.
524 return <<'NOOP_FRAG' unless @{$self->{DIR}};
525clean_subdirs :
526 $(NOECHO) $(NOOP)
527NOOP_FRAG
528
529
530 my $clean = "clean_subdirs :\n";
531
532 for my $dir (@{$self->{DIR}}) {
533 my $subclean = $self->oneliner(sprintf <<'CODE', $dir);
534chdir '%s'; system '$(MAKE) clean' if -f '$(FIRST_MAKEFILE)';
535CODE
536
537 $clean .= "\t$subclean\n";
538 }
539
540 return $clean;
479d2113 541}
f6d6199c 542
f6d6199c 543
7292dc67 544=head3 dir_target
f6d6199c 545
7292dc67 546 my $make_frag = $mm->dir_target(@directories);
f6d6199c 547
7292dc67
RGS
548Generates targets to create the specified directories and set its
549permission to 0755.
f6d6199c 550
7292dc67
RGS
551Because depending on a directory to just ensure it exists doesn't work
552too well (the modified time changes too often) dir_target() creates a
553.exists file in the created directory. It is this you should depend on.
554For portability purposes you should use the $(DIRFILESEP) macro rather
555than a '/' to seperate the directory from the file.
556
557 yourdirectory$(DIRFILESEP).exists
f6d6199c
MS
558
559=cut
560
7292dc67
RGS
561sub dir_target {
562 my($self, @dirs) = @_;
f6d6199c 563
7292dc67
RGS
564 my $make = '';
565 foreach my $dir (@dirs) {
566 $make .= sprintf <<'MAKE', ($dir) x 7;
087dded7 567%s$(DFSEP).exists :: Makefile.PL
7292dc67
RGS
568 $(NOECHO) $(MKPATH) %s
569 $(NOECHO) $(CHMOD) 755 %s
570 $(NOECHO) $(TOUCH) %s$(DFSEP).exists
f6d6199c 571
7292dc67 572MAKE
f6d6199c 573
7292dc67 574 }
f6d6199c 575
7292dc67
RGS
576 return $make;
577}
f6d6199c 578
7292dc67
RGS
579
580=head3 distdir
581
582Defines the scratch directory target that will hold the distribution
583before tar-ing (or shar-ing).
f6d6199c
MS
584
585=cut
586
7292dc67
RGS
587# For backwards compatibility.
588*dist_dir = *distdir;
f6d6199c 589
7292dc67
RGS
590sub distdir {
591 my($self) = shift;
479d2113 592
7292dc67
RGS
593 my $meta_target = $self->{NO_META} ? '' : 'distmeta';
594 my $sign_target = !$self->{SIGN} ? '' : 'distsignature';
479d2113 595
7292dc67
RGS
596 return sprintf <<'MAKE_FRAG', $meta_target, $sign_target;
597create_distdir :
598 $(RM_RF) $(DISTVNAME)
599 $(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \
600 -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');"
479d2113 601
7292dc67
RGS
602distdir : create_distdir %s %s
603 $(NOECHO) $(NOOP)
604
605MAKE_FRAG
606
607}
608
609
610=head3 dist_test
611
612Defines a target that produces the distribution in the
613scratchdirectory, and runs 'perl Makefile.PL; make ;make test' in that
614subdirectory.
479d2113
MS
615
616=cut
617
7292dc67
RGS
618sub dist_test {
619 my($self) = shift;
620
621 my $mpl_args = join " ", map qq["$_"], @ARGV;
622
623 my $test = $self->cd('$(DISTVNAME)',
624 '$(ABSPERLRUN) Makefile.PL '.$mpl_args,
625 '$(MAKE) $(PASTHRU)',
626 '$(MAKE) test $(PASTHRU)'
627 );
628
629 return sprintf <<'MAKE_FRAG', $test;
630disttest : distdir
631 %s
632
633MAKE_FRAG
634
479d2113 635
479d2113
MS
636}
637
479d2113 638
7292dc67
RGS
639=head3 dynamic (o)
640
641Defines the dynamic target.
479d2113
MS
642
643=cut
644
7292dc67
RGS
645sub dynamic {
646# --- Dynamic Loading Sections ---
479d2113 647
7292dc67
RGS
648 my($self) = shift;
649 '
650dynamic :: $(FIRST_MAKEFILE) $(INST_DYNAMIC) $(INST_BOOT)
651 $(NOECHO) $(NOOP)
652';
653}
479d2113 654
479d2113 655
7292dc67
RGS
656=head3 makemakerdflt_target
657
658 my $make_frag = $mm->makemakerdflt_target
659
660Returns a make fragment with the makemakerdeflt_target specified.
661This target is the first target in the Makefile, is the default target
662and simply points off to 'all' just in case any make variant gets
663confused or something gets snuck in before the real 'all' target.
479d2113 664
7292dc67
RGS
665=cut
666
667sub makemakerdflt_target {
668 return <<'MAKE_FRAG';
3a0105ce 669makemakerdflt : all
7292dc67 670 $(NOECHO) $(NOOP)
479d2113
MS
671MAKE_FRAG
672
673}
674
675
7292dc67 676=head3 manifypods_target
479d2113 677
7292dc67
RGS
678 my $manifypods_target = $self->manifypods_target;
679
680Generates the manifypods target. This target generates man pages from
681all POD files in MAN1PODS and MAN3PODS.
479d2113
MS
682
683=cut
684
7292dc67
RGS
685sub manifypods_target {
686 my($self) = shift;
479d2113 687
7292dc67
RGS
688 my $man1pods = '';
689 my $man3pods = '';
690 my $dependencies = '';
691
692 # populate manXpods & dependencies:
693 foreach my $name (keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}}) {
694 $dependencies .= " \\\n\t$name";
695 }
696
7292dc67
RGS
697 my $manify = <<END;
698manifypods : pure_all $dependencies
699END
700
701 my @man_cmds;
702 foreach my $section (qw(1 3)) {
703 my $pods = $self->{"MAN${section}PODS"};
704 push @man_cmds, $self->split_command(<<CMD, %$pods);
705 \$(NOECHO) \$(POD2MAN) --section=$section --perm_rw=\$(PERM_RW)
706CMD
707 }
708
709 $manify .= "\t\$(NOECHO) \$(NOOP)\n" unless @man_cmds;
710 $manify .= join '', map { "$_\n" } @man_cmds;
479d2113 711
7292dc67 712 return $manify;
479d2113
MS
713}
714
715
7292dc67 716=head3 metafile_target
479d2113
MS
717
718 my $target = $mm->metafile_target;
719
720Generate the metafile target.
721
7292dc67
RGS
722Writes the file META.yml YAML encoded meta-data about the module in
723the distdir. The format follows Module::Build's as closely as
562c8117 724possible.
479d2113
MS
725
726=cut
727
728sub metafile_target {
729 my $self = shift;
730
431b0fc4 731 return <<'MAKE_FRAG' if $self->{NO_META};
3a0105ce 732metafile :
431b0fc4
MS
733 $(NOECHO) $(NOOP)
734MAKE_FRAG
735
479d2113 736 my $prereq_pm = '';
0fdc96ff
JH
737 foreach my $mod ( sort { lc $a cmp lc $b } keys %{$self->{PREREQ_PM}} ) {
738 my $ver = $self->{PREREQ_PM}{$mod};
2977d345 739 $prereq_pm .= sprintf "\n %-30s %s", "$mod:", $ver;
479d2113 740 }
a7d1454b 741
c8d65f10
RGS
742 my $author_value = defined $self->{AUTHOR}
743 ? "\n - $self->{AUTHOR}"
744 : undef;
745
2977d345
RGS
746 # Use a list to preserve order.
747 my @meta_to_mm = (
748 name => $self->{DISTNAME},
749 version => $self->{VERSION},
750 abstract => $self->{ABSTRACT},
562c8117 751 license => $self->{LICENSE},
c8d65f10 752 author => $author_value,
2977d345
RGS
753 generated_by =>
754 "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
2977d345
RGS
755 distribution_type => $self->{PM} ? 'module' : 'script',
756 );
757
758 my $meta = "--- #YAML:1.0\n";
759
760 while( @meta_to_mm ) {
761 my($key, $val) = splice @meta_to_mm, 0, 2;
762
763 $val = '~' unless defined $val;
764
765 $meta .= sprintf "%-20s %s\n", "$key:", $val;
766 };
767
562c8117 768 $meta .= <<"YAML";
2977d345
RGS
769requires: $prereq_pm
770meta-spec:
c8d65f10
RGS
771 url: http://module-build.sourceforge.net/META-spec-v1.3.html
772 version: 1.3
479d2113
MS
773YAML
774
2977d345
RGS
775 $meta .= $self->{EXTRA_META} if $self->{EXTRA_META};
776
a7d1454b 777 my @write_meta = $self->echo($meta, 'META_new.yml');
a7d1454b 778
7292dc67
RGS
779 return sprintf <<'MAKE_FRAG', join("\n\t", @write_meta);
780metafile : create_distdir
a7d1454b 781 $(NOECHO) $(ECHO) Generating META.yml
479d2113 782 %s
7292dc67 783 -$(NOECHO) $(MV) META_new.yml $(DISTVNAME)/META.yml
479d2113
MS
784MAKE_FRAG
785
786}
787
788
7292dc67 789=head3 distmeta_target
bb68fe9e 790
7292dc67 791 my $make_frag = $mm->distmeta_target;
bb68fe9e 792
7292dc67
RGS
793Generates the distmeta target to add META.yml to the MANIFEST in the
794distdir.
bb68fe9e
AT
795
796=cut
797
7292dc67 798sub distmeta_target {
bb68fe9e
AT
799 my $self = shift;
800
7292dc67
RGS
801 my $add_meta = $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']);
802eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) }
803 or print "Could not add META.yml to MANIFEST: $${'@'}\n"
804CODE
bb68fe9e 805
7292dc67 806 my $add_meta_to_distdir = $self->cd('$(DISTVNAME)', $add_meta);
bb68fe9e 807
7292dc67
RGS
808 return sprintf <<'MAKE', $add_meta_to_distdir;
809distmeta : create_distdir metafile
810 $(NOECHO) %s
811
812MAKE
bb68fe9e 813
7292dc67 814}
bb68fe9e 815
479d2113 816
7292dc67 817=head3 realclean (o)
479d2113 818
7292dc67 819Defines the realclean target.
479d2113
MS
820
821=cut
822
7292dc67
RGS
823sub realclean {
824 my($self, %attribs) = @_;
479d2113 825
7292dc67
RGS
826 my @dirs = qw($(DISTVNAME));
827 my @files = qw($(FIRST_MAKEFILE) $(MAKEFILE_OLD));
431b0fc4 828
76ca89ed
RGS
829 # Special exception for the perl core where INST_* is not in blib.
830 # This cleans up the files built from the ext/ directory (all XS).
831 if( $self->{PERL_CORE} ) {
7292dc67 832 push @dirs, qw($(INST_AUTODIR) $(INST_ARCHAUTODIR));
76ca89ed 833 push @files, values %{$self->{PM}};
7292dc67 834 }
479d2113 835
7292dc67
RGS
836 if( $self->has_link_code ){
837 push @files, qw($(OBJECT));
838 }
839
840 if( $attribs{FILES} ) {
841 if( ref $attribs{FILES} ) {
842 push @dirs, @{ $attribs{FILES} };
843 }
844 else {
845 push @dirs, split /\s+/, $attribs{FILES};
846 }
847 }
848
849 # Occasionally files are repeated several times from different sources
850 { my(%f) = map { ($_ => 1) } @files; @files = keys %f; }
851 { my(%d) = map { ($_ => 1) } @dirs; @dirs = keys %d; }
852
853 my $rm_cmd = join "\n\t", map { "$_" }
854 $self->split_command('- $(RM_F)', @files);
855 my $rmf_cmd = join "\n\t", map { "$_" }
856 $self->split_command('- $(RM_RF)', @dirs);
857
858 my $m = sprintf <<'MAKE', $rm_cmd, $rmf_cmd;
859# Delete temporary files (via clean) and also delete dist files
860realclean purge :: clean realclean_subdirs
861 %s
862 %s
863MAKE
864
865 $m .= "\t$attribs{POSTOP}\n" if $attribs{POSTOP};
479d2113 866
7292dc67 867 return $m;
479d2113
MS
868}
869
870
7292dc67 871=head3 realclean_subdirs_target
bb68fe9e 872
7292dc67 873 my $make_frag = $MM->realclean_subdirs_target;
bb68fe9e 874
7292dc67
RGS
875Returns the realclean_subdirs target. This is used by the realclean
876target to call realclean on any subdirectories which contain Makefiles.
bb68fe9e
AT
877
878=cut
879
7292dc67 880sub realclean_subdirs_target {
bb68fe9e
AT
881 my $self = shift;
882
7292dc67
RGS
883 return <<'NOOP_FRAG' unless @{$self->{DIR}};
884realclean_subdirs :
bb68fe9e 885 $(NOECHO) $(NOOP)
7292dc67 886NOOP_FRAG
bb68fe9e 887
7292dc67
RGS
888 my $rclean = "realclean_subdirs :\n";
889
890 foreach my $dir (@{$self->{DIR}}) {
891 foreach my $makefile ('$(MAKEFILE_OLD)', '$(FIRST_MAKEFILE)' ) {
892 my $subrclean .= $self->oneliner(sprintf <<'CODE', $dir, ($makefile) x 2);
893chdir '%s'; system '$(MAKE) $(USEMAKEFILE) %s realclean' if -f '%s';
bb68fe9e
AT
894CODE
895
7292dc67
RGS
896 $rclean .= sprintf <<'RCLEAN', $subrclean;
897 - %s
898RCLEAN
bb68fe9e 899
7292dc67
RGS
900 }
901 }
bb68fe9e 902
7292dc67
RGS
903 return $rclean;
904}
bb68fe9e 905
479d2113 906
7292dc67 907=head3 signature_target
479d2113 908
7292dc67 909 my $target = $mm->signature_target;
479d2113 910
7292dc67 911Generate the signature target.
479d2113 912
7292dc67 913Writes the file SIGNATURE with "cpansign -s".
479d2113 914
7292dc67 915=cut
479d2113 916
7292dc67
RGS
917sub signature_target {
918 my $self = shift;
479d2113 919
7292dc67
RGS
920 return <<'MAKE_FRAG';
921signature :
922 cpansign -s
923MAKE_FRAG
479d2113 924
7292dc67 925}
479d2113 926
7292dc67
RGS
927
928=head3 distsignature_target
929
930 my $make_frag = $mm->distsignature_target;
931
932Generates the distsignature target to add SIGNATURE to the MANIFEST in the
933distdir.
934
935=cut
936
937sub distsignature_target {
938 my $self = shift;
939
940 my $add_sign = $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']);
941eval { maniadd({q{SIGNATURE} => q{Public-key signature (added by MakeMaker)}}) }
942 or print "Could not add SIGNATURE to MANIFEST: $${'@'}\n"
479d2113
MS
943CODE
944
7292dc67 945 my $sign_dist = $self->cd('$(DISTVNAME)' => 'cpansign -s');
479d2113 946
7292dc67
RGS
947 # cpansign -s complains if SIGNATURE is in the MANIFEST yet does not
948 # exist
949 my $touch_sig = $self->cd('$(DISTVNAME)' => '$(TOUCH) SIGNATURE');
950 my $add_sign_to_dist = $self->cd('$(DISTVNAME)' => $add_sign );
479d2113 951
7292dc67
RGS
952 return sprintf <<'MAKE', $add_sign_to_dist, $touch_sig, $sign_dist
953distsignature : create_distdir
954 $(NOECHO) %s
955 $(NOECHO) %s
956 %s
479d2113 957
7292dc67 958MAKE
479d2113 959
7292dc67 960}
479d2113
MS
961
962
7292dc67 963=head3 special_targets
479d2113 964
7292dc67 965 my $make_frag = $mm->special_targets
479d2113 966
7292dc67
RGS
967Returns a make fragment containing any targets which have special
968meaning to make. For example, .SUFFIXES and .PHONY.
479d2113 969
7292dc67 970=cut
479d2113 971
7292dc67
RGS
972sub special_targets {
973 my $make_frag = <<'MAKE_FRAG';
974.SUFFIXES : .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
479d2113 975
7292dc67 976.PHONY: all config static dynamic test linkext manifest blibdirs clean realclean disttest distdir
479d2113 977
7292dc67 978MAKE_FRAG
479d2113 979
7292dc67
RGS
980 $make_frag .= <<'MAKE_FRAG' if $ENV{CLEARCASE_ROOT};
981.NO_CONFIG_REC: Makefile
479d2113 982
7292dc67 983MAKE_FRAG
479d2113 984
7292dc67
RGS
985 return $make_frag;
986}
479d2113 987
479d2113 988
479d2113 989
479d2113 990
7292dc67
RGS
991=head2 Init methods
992
993Methods which help initialize the MakeMaker object and macros.
994
995
2977d345
RGS
996=head3 init_ABSTRACT
997
998 $mm->init_ABSTRACT
999
1000=cut
1001
1002sub init_ABSTRACT {
1003 my $self = shift;
1004
1005 if( $self->{ABSTRACT_FROM} and $self->{ABSTRACT} ) {
1006 warn "Both ABSTRACT_FROM and ABSTRACT are set. ".
1007 "Ignoring ABSTRACT_FROM.\n";
1008 return;
1009 }
1010
1011 if ($self->{ABSTRACT_FROM}){
1012 $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or
1013 carp "WARNING: Setting ABSTRACT via file ".
1014 "'$self->{ABSTRACT_FROM}' failed\n";
1015 }
1016}
1017
7292dc67
RGS
1018=head3 init_INST
1019
1020 $mm->init_INST;
1021
1022Called by init_main. Sets up all INST_* variables except those related
1023to XS code. Those are handled in init_xs.
1024
1025=cut
1026
1027sub init_INST {
1028 my($self) = shift;
1029
1030 $self->{INST_ARCHLIB} ||= $self->catdir($Curdir,"blib","arch");
1031 $self->{INST_BIN} ||= $self->catdir($Curdir,'blib','bin');
1032
1033 # INST_LIB typically pre-set if building an extension after
1034 # perl has been built and installed. Setting INST_LIB allows
1035 # you to build directly into, say $Config{privlibexp}.
1036 unless ($self->{INST_LIB}){
1037 if ($self->{PERL_CORE}) {
1038 if (defined $Cross::platform) {
1039 $self->{INST_LIB} = $self->{INST_ARCHLIB} =
1040 $self->catdir($self->{PERL_LIB},"..","xlib",
1041 $Cross::platform);
1042 }
1043 else {
1044 $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
1045 }
1046 } else {
1047 $self->{INST_LIB} = $self->catdir($Curdir,"blib","lib");
1048 }
1049 }
1050
1051 my @parentdir = split(/::/, $self->{PARENT_NAME});
1052 $self->{INST_LIBDIR} = $self->catdir('$(INST_LIB)', @parentdir);
1053 $self->{INST_ARCHLIBDIR} = $self->catdir('$(INST_ARCHLIB)', @parentdir);
1054 $self->{INST_AUTODIR} = $self->catdir('$(INST_LIB)', 'auto',
1055 '$(FULLEXT)');
1056 $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)', 'auto',
1057 '$(FULLEXT)');
1058
1059 $self->{INST_SCRIPT} ||= $self->catdir($Curdir,'blib','script');
1060
1061 $self->{INST_MAN1DIR} ||= $self->catdir($Curdir,'blib','man1');
1062 $self->{INST_MAN3DIR} ||= $self->catdir($Curdir,'blib','man3');
1063
1064 return 1;
1065}
1066
1067
1068=head3 init_INSTALL
1069
1070 $mm->init_INSTALL;
1071
1072Called by init_main. Sets up all INSTALL_* variables (except
1073INSTALLDIRS) and *PREFIX.
1074
1075=cut
1076
1077sub init_INSTALL {
1078 my($self) = shift;
1079
2977d345
RGS
1080 if( $self->{ARGS}{INSTALL_BASE} and $self->{ARGS}{PREFIX} ) {
1081 die "Only one of PREFIX or INSTALL_BASE can be given. Not both.\n";
7292dc67
RGS
1082 }
1083
2977d345
RGS
1084 if( $self->{ARGS}{INSTALL_BASE} ) {
1085 $self->init_INSTALL_from_INSTALL_BASE;
7292dc67
RGS
1086 }
1087 else {
1088 $self->init_INSTALL_from_PREFIX;
1089 }
1090}
1091
1092
1093=head3 init_INSTALL_from_PREFIX
1094
1095 $mm->init_INSTALL_from_PREFIX;
1096
1097=cut
1098
1099sub init_INSTALL_from_PREFIX {
1100 my $self = shift;
1101
1102 $self->init_lib2arch;
1103
1104 # There are often no Config.pm defaults for these new man variables so
1105 # we fall back to the old behavior which is to use installman*dir
1106 foreach my $num (1, 3) {
1107 my $k = 'installsiteman'.$num.'dir';
1108
1109 $self->{uc $k} ||= uc "\$(installman${num}dir)"
1110 unless $Config{$k};
1111 }
1112
1113 foreach my $num (1, 3) {
1114 my $k = 'installvendorman'.$num.'dir';
1115
1116 unless( $Config{$k} ) {
1117 $self->{uc $k} ||= $Config{usevendorprefix}
1118 ? uc "\$(installman${num}dir)"
1119 : '';
1120 }
1121 }
1122
1123 $self->{INSTALLSITEBIN} ||= '$(INSTALLBIN)'
1124 unless $Config{installsitebin};
002b9267
RGS
1125 $self->{INSTALLSITESCRIPT} ||= '$(INSTALLSCRIPT)'
1126 unless $Config{installsitescript};
7292dc67
RGS
1127
1128 unless( $Config{installvendorbin} ) {
1129 $self->{INSTALLVENDORBIN} ||= $Config{usevendorprefix}
1130 ? $Config{installbin}
1131 : '';
1132 }
002b9267
RGS
1133 unless( $Config{installvendorscript} ) {
1134 $self->{INSTALLVENDORSCRIPT} ||= $Config{usevendorprefix}
1135 ? $Config{installscript}
1136 : '';
1137 }
7292dc67
RGS
1138
1139
1140 my $iprefix = $Config{installprefixexp} || $Config{installprefix} ||
1141 $Config{prefixexp} || $Config{prefix} || '';
1142 my $vprefix = $Config{usevendorprefix} ? $Config{vendorprefixexp} : '';
1143 my $sprefix = $Config{siteprefixexp} || '';
1144
1145 # 5.005_03 doesn't have a siteprefix.
1146 $sprefix = $iprefix unless $sprefix;
1147
1148
1149 $self->{PREFIX} ||= '';
1150
1151 if( $self->{PREFIX} ) {
1152 @{$self}{qw(PERLPREFIX SITEPREFIX VENDORPREFIX)} =
1153 ('$(PREFIX)') x 3;
1154 }
1155 else {
1156 $self->{PERLPREFIX} ||= $iprefix;
1157 $self->{SITEPREFIX} ||= $sprefix;
1158 $self->{VENDORPREFIX} ||= $vprefix;
1159
1160 # Lots of MM extension authors like to use $(PREFIX) so we
1161 # put something sensible in there no matter what.
1162 $self->{PREFIX} = '$('.uc $self->{INSTALLDIRS}.'PREFIX)';
1163 }
1164
1165 my $arch = $Config{archname};
1166 my $version = $Config{version};
1167
1168 # default style
1169 my $libstyle = $Config{installstyle} || 'lib/perl5';
1170 my $manstyle = '';
1171
1172 if( $self->{LIBSTYLE} ) {
1173 $libstyle = $self->{LIBSTYLE};
1174 $manstyle = $self->{LIBSTYLE} eq 'lib/perl5' ? 'lib/perl5' : '';
1175 }
1176
1177 # Some systems, like VOS, set installman*dir to '' if they can't
1178 # read man pages.
1179 for my $num (1, 3) {
1180 $self->{'INSTALLMAN'.$num.'DIR'} ||= 'none'
1181 unless $Config{'installman'.$num.'dir'};
1182 }
1183
1184 my %bin_layouts =
1185 (
1186 bin => { s => $iprefix,
1187 t => 'perl',
1188 d => 'bin' },
1189 vendorbin => { s => $vprefix,
1190 t => 'vendor',
1191 d => 'bin' },
1192 sitebin => { s => $sprefix,
1193 t => 'site',
1194 d => 'bin' },
1195 script => { s => $iprefix,
1196 t => 'perl',
1197 d => 'bin' },
002b9267
RGS
1198 vendorscript=> { s => $vprefix,
1199 t => 'vendor',
1200 d => 'bin' },
1201 sitescript => { s => $sprefix,
1202 t => 'site',
1203 d => 'bin' },
7292dc67
RGS
1204 );
1205
1206 my %man_layouts =
1207 (
1208 man1dir => { s => $iprefix,
1209 t => 'perl',
1210 d => 'man/man1',
1211 style => $manstyle, },
1212 siteman1dir => { s => $sprefix,
1213 t => 'site',
1214 d => 'man/man1',
1215 style => $manstyle, },
1216 vendorman1dir => { s => $vprefix,
1217 t => 'vendor',
1218 d => 'man/man1',
1219 style => $manstyle, },
1220
1221 man3dir => { s => $iprefix,
1222 t => 'perl',
1223 d => 'man/man3',
1224 style => $manstyle, },
1225 siteman3dir => { s => $sprefix,
1226 t => 'site',
1227 d => 'man/man3',
1228 style => $manstyle, },
1229 vendorman3dir => { s => $vprefix,
1230 t => 'vendor',
1231 d => 'man/man3',
1232 style => $manstyle, },
1233 );
1234
1235 my %lib_layouts =
1236 (
1237 privlib => { s => $iprefix,
1238 t => 'perl',
1239 d => '',
1240 style => $libstyle, },
1241 vendorlib => { s => $vprefix,
1242 t => 'vendor',
1243 d => '',
1244 style => $libstyle, },
1245 sitelib => { s => $sprefix,
1246 t => 'site',
1247 d => 'site_perl',
1248 style => $libstyle, },
1249
1250 archlib => { s => $iprefix,
1251 t => 'perl',
1252 d => "$version/$arch",
1253 style => $libstyle },
1254 vendorarch => { s => $vprefix,
1255 t => 'vendor',
1256 d => "$version/$arch",
1257 style => $libstyle },
1258 sitearch => { s => $sprefix,
1259 t => 'site',
1260 d => "site_perl/$version/$arch",
1261 style => $libstyle },
1262 );
1263
1264
1265 # Special case for LIB.
1266 if( $self->{LIB} ) {
1267 foreach my $var (keys %lib_layouts) {
1268 my $Installvar = uc "install$var";
1269
1270 if( $var =~ /arch/ ) {
1271 $self->{$Installvar} ||=
1272 $self->catdir($self->{LIB}, $Config{archname});
1273 }
1274 else {
1275 $self->{$Installvar} ||= $self->{LIB};
1276 }
1277 }
1278 }
1279
1280 my %type2prefix = ( perl => 'PERLPREFIX',
1281 site => 'SITEPREFIX',
1282 vendor => 'VENDORPREFIX'
1283 );
1284
1285 my %layouts = (%bin_layouts, %man_layouts, %lib_layouts);
1286 while( my($var, $layout) = each(%layouts) ) {
1287 my($s, $t, $d, $style) = @{$layout}{qw(s t d style)};
1288 my $r = '$('.$type2prefix{$t}.')';
1289
1290 print STDERR "Prefixing $var\n" if $Verbose >= 2;
1291
1292 my $installvar = "install$var";
1293 my $Installvar = uc $installvar;
1294 next if $self->{$Installvar};
1295
1296 $d = "$style/$d" if $style;
1297 $self->prefixify($installvar, $s, $r, $d);
1298
1299 print STDERR " $Installvar == $self->{$Installvar}\n"
1300 if $Verbose >= 2;
1301 }
1302
1303 # Generate these if they weren't figured out.
1304 $self->{VENDORARCHEXP} ||= $self->{INSTALLVENDORARCH};
1305 $self->{VENDORLIBEXP} ||= $self->{INSTALLVENDORLIB};
1306
1307 return 1;
1308}
1309
1310
2977d345 1311=head3 init_from_INSTALL_BASE
7292dc67 1312
2977d345 1313 $mm->init_from_INSTALL_BASE
7292dc67
RGS
1314
1315=cut
1316
1317my %map = (
1318 lib => [qw(lib perl5)],
1319 arch => [('lib', 'perl5', $Config{archname})],
1320 bin => [qw(bin)],
1321 man1dir => [qw(man man1)],
1322 man3dir => [qw(man man3)]
1323 );
1324$map{script} = $map{bin};
1325
2977d345 1326sub init_INSTALL_from_INSTALL_BASE {
7292dc67
RGS
1327 my $self = shift;
1328
1329 @{$self}{qw(PREFIX VENDORPREFIX SITEPREFIX PERLPREFIX)} =
2977d345 1330 '$(INSTALL_BASE)';
7292dc67
RGS
1331
1332 my %install;
1333 foreach my $thing (keys %map) {
1334 foreach my $dir (('', 'SITE', 'VENDOR')) {
1335 my $uc_thing = uc $thing;
1336 my $key = "INSTALL".$dir.$uc_thing;
1337
1338 $install{$key} ||=
2977d345 1339 $self->catdir('$(INSTALL_BASE)', @{$map{$thing}});
7292dc67
RGS
1340 }
1341 }
1342
1343 # Adjust for variable quirks.
1344 $install{INSTALLARCHLIB} ||= delete $install{INSTALLARCH};
1345 $install{INSTALLPRIVLIB} ||= delete $install{INSTALLLIB};
7292dc67
RGS
1346
1347 foreach my $key (keys %install) {
1348 $self->{$key} ||= $install{$key};
1349 }
1350
1351 return 1;
1352}
1353
1354
1355=head3 init_VERSION I<Abstract>
1356
1357 $mm->init_VERSION
1358
1359Initialize macros representing versions of MakeMaker and other tools
1360
1361MAKEMAKER: path to the MakeMaker module.
1362
1363MM_VERSION: ExtUtils::MakeMaker Version
1364
1365MM_REVISION: ExtUtils::MakeMaker version control revision (for backwards
1366 compat)
1367
1368VERSION: version of your module
1369
1370VERSION_MACRO: which macro represents the version (usually 'VERSION')
1371
1372VERSION_SYM: like version but safe for use as an RCS revision number
1373
1374DEFINE_VERSION: -D line to set the module version when compiling
1375
1376XS_VERSION: version in your .xs file. Defaults to $(VERSION)
1377
1378XS_VERSION_MACRO: which macro represents the XS version.
1379
1380XS_DEFINE_VERSION: -D line to set the xs version when compiling.
1381
1382Called by init_main.
1383
1384=cut
1385
1386sub init_VERSION {
1387 my($self) = shift;
1388
1389 $self->{MAKEMAKER} = $ExtUtils::MakeMaker::Filename;
1390 $self->{MM_VERSION} = $ExtUtils::MakeMaker::VERSION;
1391 $self->{MM_REVISION}= $ExtUtils::MakeMaker::Revision;
1392 $self->{VERSION_FROM} ||= '';
1393
1394 if ($self->{VERSION_FROM}){
1395 $self->{VERSION} = $self->parse_version($self->{VERSION_FROM});
1396 if( $self->{VERSION} eq 'undef' ) {
2977d345
RGS
1397 carp("WARNING: Setting VERSION via file ".
1398 "'$self->{VERSION_FROM}' failed\n");
7292dc67
RGS
1399 }
1400 }
1401
1402 # strip blanks
1403 if (defined $self->{VERSION}) {
1404 $self->{VERSION} =~ s/^\s+//;
1405 $self->{VERSION} =~ s/\s+$//;
1406 }
1407 else {
1408 $self->{VERSION} = '';
1409 }
1410
1411
1412 $self->{VERSION_MACRO} = 'VERSION';
1413 ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
1414 $self->{DEFINE_VERSION} = '-D$(VERSION_MACRO)=\"$(VERSION)\"';
1415
1416
1417 # Graham Barr and Paul Marquess had some ideas how to ensure
1418 # version compatibility between the *.pm file and the
1419 # corresponding *.xs file. The bottomline was, that we need an
1420 # XS_VERSION macro that defaults to VERSION:
1421 $self->{XS_VERSION} ||= $self->{VERSION};
1422
1423 $self->{XS_VERSION_MACRO} = 'XS_VERSION';
1424 $self->{XS_DEFINE_VERSION} = '-D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\"';
1425
1426}
1427
1428
1429=head3 init_others I<Abstract>
479d2113
MS
1430
1431 $MM->init_others();
1432
1433Initializes the macro definitions used by tools_other() and places them
1434in the $MM object.
1435
1436If there is no description, its the same as the parameter to
1437WriteMakefile() documented in ExtUtils::MakeMaker.
1438
1439Defines at least these macros.
1440
1441 Macro Description
1442
dedf98bc
MS
1443 NOOP Do nothing
1444 NOECHO Tell make not to display the command itself
479d2113
MS
1445
1446 MAKEFILE
1447 FIRST_MAKEFILE
1448 MAKEFILE_OLD
1449 MAKE_APERL_FILE File used by MAKE_APERL
1450
2977d345 1451 SHELL Program used to run shell commands
479d2113 1452
dedf98bc 1453 ECHO Print text adding a newline on the end
479d2113
MS
1454 RM_F Remove a file
1455 RM_RF Remove a directory
1456 TOUCH Update a file's timestamp
1457 TEST_F Test for a file's existence
1458 CP Copy a file
1459 MV Move a file
1460 CHMOD Change permissions on a
1461 file
1462
1463 UMASK_NULL Nullify umask
3c4b39be 1464 DEV_NULL Suppress all command output
479d2113 1465
7292dc67
RGS
1466
1467=head3 init_DIRFILESEP I<Abstract>
479d2113
MS
1468
1469 $MM->init_DIRFILESEP;
1470 my $dirfilesep = $MM->{DIRFILESEP};
1471
1472Initializes the DIRFILESEP macro which is the seperator between the
1473directory and filename in a filepath. ie. / on Unix, \ on Win32 and
1474nothing on VMS.
1475
1476For example:
1477
1478 # instead of $(INST_ARCHAUTODIR)/extralibs.ld
1479 $(INST_ARCHAUTODIR)$(DIRFILESEP)extralibs.ld
1480
1481Something of a hack but it prevents a lot of code duplication between
1482MM_* variants.
1483
1484Do not use this as a seperator between directories. Some operating
1485systems use different seperators between subdirectories as between
1486directories and filenames (for example: VOLUME:[dir1.dir2]file on VMS).
1487
7292dc67 1488=head3 init_linker I<Abstract>
479d2113
MS
1489
1490 $mm->init_linker;
1491
1492Initialize macros which have to do with linking.
1493
1494PERL_ARCHIVE: path to libperl.a equivalent to be linked to dynamic
1495extensions.
1496
1497PERL_ARCHIVE_AFTER: path to a library which should be put on the
1498linker command line I<after> the external libraries to be linked to
1499dynamic extensions. This may be needed if the linker is one-pass, and
1500Perl includes some overrides for C RTL functions, such as malloc().
1501
1502EXPORT_LIST: name of a file that is passed to linker to define symbols
1503to be exported.
1504
1505Some OSes do not need these in which case leave it blank.
1506
1507
7292dc67 1508=head3 init_platform
479d2113
MS
1509
1510 $mm->init_platform
1511
1512Initialize any macros which are for platform specific use only.
1513
1514A typical one is the version number of your OS specific mocule.
1515(ie. MM_Unix_VERSION or MM_VMS_VERSION).
1516
7292dc67 1517=cut
479d2113 1518
7292dc67
RGS
1519sub init_platform {
1520 return '';
1521}
479d2113 1522
7292dc67 1523
2977d345
RGS
1524=head3 init_MAKE
1525
1526 $mm->init_MAKE
7292dc67 1527
2977d345
RGS
1528Initialize MAKE from either a MAKE environment variable or $Config{make}.
1529
1530=cut
1531
1532sub init_MAKE {
1533 my $self = shift;
1534
1535 $self->{MAKE} ||= $ENV{MAKE} || $Config{make};
1536}
7292dc67
RGS
1537
1538
1539=head2 Tools
1540
1541A grab bag of methods to generate specific macros and commands.
1542
1543
1544
1545=head3 manifypods
1546
1547Defines targets and routines to translate the pods into manpages and
1548put them into the INST_* directories.
479d2113
MS
1549
1550=cut
1551
7292dc67
RGS
1552sub manifypods {
1553 my $self = shift;
1554
1555 my $POD2MAN_macro = $self->POD2MAN_macro();
1556 my $manifypods_target = $self->manifypods_target();
1557
1558 return <<END_OF_TARGET;
1559
1560$POD2MAN_macro
1561
1562$manifypods_target
1563
1564END_OF_TARGET
1565
479d2113
MS
1566}
1567
7292dc67
RGS
1568
1569=head3 POD2MAN_macro
1570
1571 my $pod2man_macro = $self->POD2MAN_macro
1572
1573Returns a definition for the POD2MAN macro. This is a program
1574which emulates the pod2man utility. You can add more switches to the
1575command by simply appending them on the macro.
1576
1577Typical usage:
1578
1579 $(POD2MAN) --section=3 --perm_rw=$(PERM_RW) podfile1 man_page1 ...
1580
1581=cut
1582
1583sub POD2MAN_macro {
1584 my $self = shift;
1585
1586# Need the trailing '--' so perl stops gobbling arguments and - happens
1587# to be an alternative end of line seperator on VMS so we quote it
1588 return <<'END_OF_DEF';
1589POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--"
1590POD2MAN = $(POD2MAN_EXE)
1591END_OF_DEF
479d2113
MS
1592}
1593
dedf98bc 1594
7292dc67 1595=head3 test_via_harness
dedf98bc 1596
7292dc67 1597 my $command = $mm->test_via_harness($perl, $tests);
dedf98bc 1598
7292dc67
RGS
1599Returns a $command line which runs the given set of $tests with
1600Test::Harness and the given $perl.
dedf98bc 1601
7292dc67 1602Used on the t/*.t files.
dedf98bc 1603
7292dc67 1604=cut
dedf98bc 1605
7292dc67
RGS
1606sub test_via_harness {
1607 my($self, $perl, $tests) = @_;
1608
1609 return qq{\t$perl "-MExtUtils::Command::MM" }.
1610 qq{"-e" "test_harness(\$(TEST_VERBOSE), '\$(INST_LIB)', '\$(INST_ARCHLIB)')" $tests\n};
1611}
1612
1613=head3 test_via_script
1614
1615 my $command = $mm->test_via_script($perl, $script);
1616
1617Returns a $command line which just runs a single test without
1618Test::Harness. No checks are done on the results, they're just
1619printed.
dedf98bc 1620
7292dc67
RGS
1621Used for test.pl, since they don't always follow Test::Harness
1622formatting.
1623
1624=cut
1625
1626sub test_via_script {
1627 my($self, $perl, $script) = @_;
1628 return qq{\t$perl "-I\$(INST_LIB)" "-I\$(INST_ARCHLIB)" $script\n};
1629}
1630
1631
1632=head3 tool_autosplit
1633
1634Defines a simple perl call that runs autosplit. May be deprecated by
1635pm_to_blib soon.
1636
1637=cut
1638
1639sub tool_autosplit {
1640 my($self, %attribs) = @_;
1641
1642 my $maxlen = $attribs{MAXLEN} ? '$$AutoSplit::Maxlen=$attribs{MAXLEN};'
1643 : '';
1644
1645 my $asplit = $self->oneliner(sprintf <<'PERL_CODE', $maxlen);
1646use AutoSplit; %s autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)
1647PERL_CODE
1648
1649 return sprintf <<'MAKE_FRAG', $asplit;
1650# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
1651AUTOSPLITFILE = %s
1652
1653MAKE_FRAG
1654
1655}
1656
1657
1658
1659
1660=head2 File::Spec wrappers
1661
1662ExtUtils::MM_Any is a subclass of File::Spec. The methods noted here
1663override File::Spec.
1664
1665
1666
1667=head3 catfile
1668
1669File::Spec <= 0.83 has a bug where the file part of catfile is not
1670canonicalized. This override fixes that bug.
1671
1672=cut
1673
1674sub catfile {
1675 my $self = shift;
1676 return $self->canonpath($self->SUPER::catfile(@_));
1677}
1678
1679
1680
1681=head2 Misc
1682
1683Methods I can't really figure out where they should go yet.
1684
1685
1686=head3 find_tests
1687
1688 my $test = $mm->find_tests;
1689
1690Returns a string suitable for feeding to the shell to return all
1691tests in t/*.t.
1692
1693=cut
1694
1695sub find_tests {
1696 my($self) = shift;
1697 return -d 't' ? 't/*.t' : '';
1698}
1699
1700
1701=head3 extra_clean_files
1702
1703 my @files_to_clean = $MM->extra_clean_files;
1704
1705Returns a list of OS specific files to be removed in the clean target in
1706addition to the usual set.
1707
1708=cut
1709
1710# An empty method here tickled a perl 5.8.1 bug and would return its object.
1711sub extra_clean_files {
1712 return;
1713}
1714
1715
1716=head3 installvars
1717
1718 my @installvars = $mm->installvars;
1719
1720A list of all the INSTALL* variables without the INSTALL prefix. Useful
1721for iteration or building related variable sets.
1722
1723=cut
1724
1725sub installvars {
1726 return qw(PRIVLIB SITELIB VENDORLIB
1727 ARCHLIB SITEARCH VENDORARCH
1728 BIN SITEBIN VENDORBIN
002b9267 1729 SCRIPT SITESCRIPT VENDORSCRIPT
7292dc67
RGS
1730 MAN1DIR SITEMAN1DIR VENDORMAN1DIR
1731 MAN3DIR SITEMAN3DIR VENDORMAN3DIR
1732 );
1733}
1734
1735
1736=head3 libscan
1737
1738 my $wanted = $self->libscan($path);
1739
1740Takes a path to a file or dir and returns an empty string if we don't
1741want to include this file in the library. Otherwise it returns the
1742the $path unchanged.
1743
1744Mainly used to exclude version control administrative directories from
1745installation.
1746
1747=cut
1748
1749sub libscan {
1750 my($self,$path) = @_;
1751 my($dirs,$file) = ($self->splitpath($path))[1,2];
1752 return '' if grep /^(?:RCS|CVS|SCCS|\.svn|_darcs)$/,
1753 $self->splitdir($dirs), $file;
1754
1755 return $path;
1756}
1757
1758
1759=head3 platform_constants
1760
1761 my $make_frag = $mm->platform_constants
1762
1763Returns a make fragment defining all the macros initialized in
1764init_platform() rather than put them in constants().
1765
1766=cut
1767
1768sub platform_constants {
1769 return '';
1770}
479d2113 1771
f6d6199c
MS
1772
1773=head1 AUTHOR
1774
479d2113
MS
1775Michael G Schwern <schwern@pobox.com> and the denizens of
1776makemaker@perl.org with code from ExtUtils::MM_Unix and
1777ExtUtils::MM_Win32.
f6d6199c
MS
1778
1779
1780=cut
1781
17821;