1 package ExtUtils::MM_Any;
9 BEGIN { our @ISA = qw(File::Spec); }
12 use ExtUtils::MakeMaker qw($Verbose);
14 use ExtUtils::MakeMaker::Config;
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.
19 my $Curdir = __PACKAGE__->curdir;
20 my $Rootdir = __PACKAGE__->rootdir;
21 my $Updir = __PACKAGE__->updir;
26 ExtUtils::MM_Any - Platform-agnostic MM methods
30 FOR INTERNAL USE ONLY!
32 package ExtUtils::MM_SomeOS;
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);
41 B<FOR INTERNAL USE ONLY!>
43 ExtUtils::MM_Any is a superclass for the ExtUtils::MM_* set of
44 modules. It contains methods which are either inherently
45 cross-platform or are written in a cross-platform manner.
47 Subclass off of ExtUtils::MM_Any I<and> ExtUtils::MM_Unix. This is a
50 B<THIS MAY BE TEMPORARY!>
55 Any methods marked I<Abstract> must be implemented by subclasses.
58 =head2 Cross-platform helper methods
60 These are methods which help writing cross-platform code.
64 =head3 os_flavor I<Abstract>
66 my @os_flavor = $mm->os_flavor;
68 @os_flavor is the style of operating system this is, usually
69 corresponding to the MM_*.pm file we're using.
71 The first element of @os_flavor is the major family (ie. Unix,
72 Windows, VMS, OS/2, etc...) and the rest are sub families.
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')
83 This is used to write code for styles of operating system.
84 See os_flavor_is() for use.
89 my $is_this_flavor = $mm->os_flavor_is($this_flavor);
90 my $is_this_flavor = $mm->os_flavor_is(@one_of_these_flavors);
92 Checks to see if the current operating system is one of the given flavors.
94 This is useful for code like:
96 if( $mm->os_flavor_is('Unix') ) {
107 my %flavors = map { ($_ => 1) } $self->os_flavor;
108 return (grep { $flavors{$_} } @_) ? 1 : 0;
114 my @cmds = $MM->split_command($cmd, @args);
116 Most OS have a maximum command length they can execute at once. Large
117 modules can easily generate commands well past that limit. Its
118 necessary to split long commands up into a series of shorter commands.
120 C<split_command> will return a series of @cmds each processing part of
121 the args. Collectively they will process all the arguments. Each
122 individual line in @cmds will not be longer than the
123 $self->max_exec_len being careful to take into account macro expansion.
125 $cmd should include any switches and repeated initial arguments.
127 If no @args are given, no @cmds will be returned.
129 Pairs of arguments will always be preserved in a single command, this
130 is a heuristic for things like pm_to_blib and pod2man which work on
131 pairs of arguments. This makes things like this safe:
133 $self->split_command($cmd, %pod2man);
139 my($self, $cmd, @args) = @_;
142 return(@cmds) unless @args;
144 # If the command was given as a here-doc, there's probably a trailing
148 # set aside 30% for macro expansion.
149 my $len_left = int($self->max_exec_len * 0.70);
150 $len_left -= length $self->_expand_macros($cmd);
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";
159 if( !length $arg_str ) {
160 $arg_str .= $next_arg_str
162 elsif( length($arg_str) + length($next_arg_str) > $len_left ) {
163 unshift @args, @next_args;
167 $arg_str .= $next_arg_str;
172 push @cmds, $self->escape_newlines("$cmd \n$arg_str");
180 my($self, $cmd) = @_;
182 $cmd =~ s{\$\((\w+)\)}{
183 defined $self->{$1} ? $self->{$1} : "\$($1)"
191 my @commands = $MM->echo($text);
192 my @commands = $MM->echo($text, $file);
193 my @commands = $MM->echo($text, $file, $appending);
195 Generates a set of @commands which print the $text to a $file.
197 If $file is not given, output goes to STDOUT.
199 If $appending is true the $file will be appended to rather than
205 my($self, $text, $file, $appending) = @_;
208 my @cmds = map { '$(NOECHO) $(ECHO) '.$self->quote_literal($_) }
211 my $redirect = $appending ? '>>' : '>';
212 $cmds[0] .= " $redirect $file";
213 $_ .= " >> $file" foreach @cmds[1..$#cmds];
222 my $args = $mm->wraplist(@list);
224 Takes an array of items and turns them into a well-formatted list of
225 arguments. In most cases this is simply something like:
235 return join " \\\n\t", @_;
239 =head3 maketext_filter
241 my $filter_make_text = $mm->maketext_filter($make_text);
243 The text of the Makefile is run through this method before writing to
244 disk. It allows systems a chance to make portability fixes to the
247 By default it does nothing.
249 This method is protected and not intended to be called outside of
254 sub maketext_filter { return $_[1] }
257 =head3 cd I<Abstract>
259 my $subdir_cmd = $MM->cd($subdir, @cmds);
261 This will generate a make fragment which runs the @cmds in the given
262 $dir. The rough equivalent to this, except cross platform.
266 Currently $dir can only go down one level. "foo" is fine. "foo/bar" is
267 not. "../foo" is right out.
269 The resulting $subdir_cmd has no leading tab nor trailing newline. This
270 makes it easier to embed in a make string. For example.
272 my $make = sprintf <<'CODE', $subdir_cmd;
280 =head3 oneliner I<Abstract>
282 my $oneliner = $MM->oneliner($perl_code);
283 my $oneliner = $MM->oneliner($perl_code, \@switches);
285 This will generate a perl one-liner safe for the particular platform
286 you're on based on the given $perl_code and @switches (a -e is
287 assumed) suitable for using in a make target. It will use the proper
288 shell quoting and escapes.
290 $(PERLRUN) will be used as perl.
292 Any newlines in $perl_code will be escaped. Leading and trailing
293 newlines will be stripped. Makes this idiom much easier:
295 my $code = $MM->oneliner(<<'CODE', [...switches...]);
300 Usage might be something like:
303 $oneliner = $MM->oneliner('print "Foo\n"');
304 $make = '$oneliner > somefile';
306 All dollar signs must be doubled in the $perl_code if you expect them
307 to be interpreted normally, otherwise it will be considered a make
308 macro. Also remember to quote make macros else it might be used as a
309 bareword. For example:
311 # Assign the value of the $(VERSION_FROM) make macro to $vf.
312 $oneliner = $MM->oneliner('$$vf = "$(VERSION_FROM)"');
314 Its currently very simple and may be expanded sometime in the figure
315 to include more flexible code and switches.
318 =head3 quote_literal I<Abstract>
320 my $safe_text = $MM->quote_literal($text);
322 This will quote $text so it is interpreted literally in the shell.
324 For example, on Unix this would escape any single-quotes in $text and
325 put single-quotes around the whole thing.
328 =head3 escape_newlines I<Abstract>
330 my $escaped_text = $MM->escape_newlines($text);
332 Shell escapes newlines in $text.
335 =head3 max_exec_len I<Abstract>
337 my $max_exec_len = $MM->max_exec_len;
339 Calculates the maximum command size the OS can exec. Effectively,
340 this is the max size of a shell command line.
343 $self->{_MAX_EXEC_LEN} is set by this method, but only for testing purposes.
348 my $make = $MM->make;
350 Returns the make variant we're generating the Makefile for. This attempts
351 to do some normalization on the information from %Config or the user.
358 my $make = lc $self->{MAKE};
360 # Truncate anything like foomake6 to just foomake.
361 $make =~ s/^(\w+make).*/$1/;
363 # Turn gnumake into gmake.
372 These are methods which produce make targets.
377 Generate the default target 'all'.
392 =head3 blibdirs_target
394 my $make_frag = $mm->blibdirs_target;
396 Creates the blibdirs target which creates all the directories we use
399 The blibdirs.ts target is deprecated. Depend on blibdirs instead.
404 sub blibdirs_target {
407 my @dirs = map { uc "\$(INST_$_)" } qw(libdir archlib
413 my @exists = map { $_.'$(DFSEP).exists' } @dirs;
415 my $make = sprintf <<'MAKE', join(' ', @exists);
419 # Backwards compat with 6.18 through 6.25
420 blibdirs.ts : blibdirs
425 $make .= $self->dir_target(@dirs);
433 Defines the clean target.
438 # --- Cleanup and Distribution Sections ---
440 my($self, %attribs) = @_;
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.
446 clean :: clean_subdirs
449 my @files = values %{$self->{XS}}; # .c files from *.xs files
452 # Normally these are all under blib but they might have been
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)
466 if( $attribs{FILES} ) {
467 # Use @dirs because we don't know what's in here.
468 push @dirs, ref $attribs{FILES} ?
470 split /\s+/, $attribs{FILES} ;
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
482 push(@files, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
483 push(@files, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.ld'));
486 push(@files, qw[core core.*perl.*.? *perl.core]);
487 push(@files, map { "core." . "[0-9]"x$_ } (1..5));
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;
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; }
497 push @m, map "\t$_\n", $self->split_command('- $(RM_F)', @files);
498 push @m, map "\t$_\n", $self->split_command('- $(RM_RF)', @dirs);
500 # Leave Makefile.old around for realclean
502 - $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL)
505 push(@m, "\t$attribs{POSTOP}\n") if $attribs{POSTOP};
511 =head3 clean_subdirs_target
513 my $make_frag = $MM->clean_subdirs_target;
515 Returns the clean_subdirs target. This is used by the clean target to
516 call clean on any subdirectories which contain Makefiles.
520 sub clean_subdirs_target {
523 # No subdirectories, no cleaning.
524 return <<'NOOP_FRAG' unless @{$self->{DIR}};
530 my $clean = "clean_subdirs :\n";
532 for my $dir (@{$self->{DIR}}) {
533 my $subclean = $self->oneliner(sprintf <<'CODE', $dir);
534 chdir '%s'; system '$(MAKE) clean' if -f '$(FIRST_MAKEFILE)';
537 $clean .= "\t$subclean\n";
546 my $make_frag = $mm->dir_target(@directories);
548 Generates targets to create the specified directories and set its
549 permission to PERM_DIR.
551 Because depending on a directory to just ensure it exists doesn't work
552 too 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.
554 For portability purposes you should use the $(DIRFILESEP) macro rather
555 than a '/' to seperate the directory from the file.
557 yourdirectory$(DIRFILESEP).exists
562 my($self, @dirs) = @_;
565 foreach my $dir (@dirs) {
566 $make .= sprintf <<'MAKE', ($dir) x 7;
567 %s$(DFSEP).exists :: Makefile.PL
568 $(NOECHO) $(MKPATH) %s
569 $(NOECHO) $(CHMOD) $(PERM_DIR) %s
570 $(NOECHO) $(TOUCH) %s$(DFSEP).exists
582 Defines the scratch directory target that will hold the distribution
583 before tar-ing (or shar-ing).
587 # For backwards compatibility.
588 *dist_dir = *distdir;
593 my $meta_target = $self->{NO_META} ? '' : 'distmeta';
594 my $sign_target = !$self->{SIGN} ? '' : 'distsignature';
596 return sprintf <<'MAKE_FRAG', $meta_target, $sign_target;
598 $(RM_RF) $(DISTVNAME)
599 $(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \
600 -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');"
602 distdir : create_distdir %s %s
612 Defines a target that produces the distribution in the
613 scratchdirectory, and runs 'perl Makefile.PL; make ;make test' in that
621 my $mpl_args = join " ", map qq["$_"], @ARGV;
623 my $test = $self->cd('$(DISTVNAME)',
624 '$(ABSPERLRUN) Makefile.PL '.$mpl_args,
625 '$(MAKE) $(PASTHRU)',
626 '$(MAKE) test $(PASTHRU)'
629 return sprintf <<'MAKE_FRAG', $test;
641 Defines the dynamic target.
646 # --- Dynamic Loading Sections ---
650 dynamic :: $(FIRST_MAKEFILE) $(INST_DYNAMIC) $(INST_BOOT)
656 =head3 makemakerdflt_target
658 my $make_frag = $mm->makemakerdflt_target
660 Returns a make fragment with the makemakerdeflt_target specified.
661 This target is the first target in the Makefile, is the default target
662 and simply points off to 'all' just in case any make variant gets
663 confused or something gets snuck in before the real 'all' target.
667 sub makemakerdflt_target {
668 return <<'MAKE_FRAG';
676 =head3 manifypods_target
678 my $manifypods_target = $self->manifypods_target;
680 Generates the manifypods target. This target generates man pages from
681 all POD files in MAN1PODS and MAN3PODS.
685 sub manifypods_target {
690 my $dependencies = '';
692 # populate manXpods & dependencies:
693 foreach my $name (keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}}) {
694 $dependencies .= " \\\n\t$name";
698 manifypods : pure_all $dependencies
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)
709 $manify .= "\t\$(NOECHO) \$(NOOP)\n" unless @man_cmds;
710 $manify .= join '', map { "$_\n" } @man_cmds;
716 =head3 metafile_target
718 my $target = $mm->metafile_target;
720 Generate the metafile target.
722 Writes the file META.yml YAML encoded meta-data about the module in
723 the distdir. The format follows Module::Build's as closely as
728 sub metafile_target {
731 return <<'MAKE_FRAG' if $self->{NO_META};
736 my @metadata = $self->metafile_data(
737 $self->{META_ADD} || {},
738 $self->{META_MERGE} || {},
740 my $meta = $self->metafile_file(@metadata);
741 my @write_meta = $self->echo($meta, 'META_new.yml');
743 return sprintf <<'MAKE_FRAG', join("\n\t", @write_meta);
744 metafile : create_distdir
745 $(NOECHO) $(ECHO) Generating META.yml
747 -$(NOECHO) $(MV) META_new.yml $(DISTVNAME)/META.yml
757 my @pairs = _sort_pairs($sort_sub, \%hash);
759 Sorts the pairs of a hash based on keys ordered according
769 return map { $_ => $pairs->{$_} }
775 # Taken from Module::Build::Base
777 my ($self, $h, $k, $v) = @_;
778 if (ref $h->{$k} eq 'ARRAY') {
779 push @{$h->{$k}}, ref $v ? @$v : $v;
780 } elsif (ref $h->{$k} eq 'HASH') {
781 $self->_hash_merge($h->{$k}, $_, $v->{$_}) foreach keys %$v;
790 my @metadata_pairs = $mm->metafile_data(\%meta_add, \%meta_merge);
792 Returns the data which MakeMaker turns into the META.yml file.
794 Values of %meta_add will overwrite any existing metadata in those
795 keys. %meta_merge will be merged with them.
801 my($meta_add, $meta_merge) = @_;
803 # The order in which standard meta keys should be written.
825 my $configure_requires;
826 if( $self->{CONFIGURE_REQUIRES} and ref($self->{CONFIGURE_REQUIRES}) eq 'HASH' ) {
827 $configure_requires = $self->{CONFIGURE_REQUIRES};
829 $configure_requires = {
830 'ExtUtils::MakeMaker' => 0,
835 name => $self->{DISTNAME},
836 version => $self->{VERSION},
837 abstract => $self->{ABSTRACT},
838 license => $self->{LICENSE} || 'unknown',
839 distribution_type => $self->{PM} ? 'module' : 'script',
841 configure_requires => $configure_requires,
844 'ExtUtils::MakeMaker' => 0
848 directory => [qw(t inc)]
851 generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
853 url => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
858 # The author key is required and it takes a list.
859 $meta{author} = defined $self->{AUTHOR} ? [$self->{AUTHOR}] : [];
861 $meta{requires} = $self->{PREREQ_PM} if defined $self->{PREREQ_PM};
862 $meta{requires}{perl} = $self->{MIN_PERL_VERSION} if $self->{MIN_PERL_VERSION};
864 while( my($key, $val) = each %$meta_add ) {
868 while( my($key, $val) = each %$meta_merge ) {
869 $self->_hash_merge(\%meta, $key, $val);
874 # Put the standard keys first in the proper order.
875 for my $key (@meta_order) {
876 next unless exists $meta{$key};
878 push @meta_pairs, $key, delete $meta{$key};
881 # Then tack everything else onto the end, alpha sorted.
882 for my $key (sort {lc $a cmp lc $b} keys %meta) {
883 push @meta_pairs, $key, $meta{$key};
893 $yaml = _dump_hash(\%options, %hash);
895 Implements a fake YAML dumper for a hash given
896 as a list of pairs. No quoting/escaping is done. Keys
897 are supposed to be strings. Values are undef, strings,
898 hash refs or array refs of strings.
900 Supported options are:
902 delta => STR - indentation delta
903 use_header => BOOL - whether to include a YAML header
904 indent => STR - a string of spaces
907 max_key_length => INT - maximum key length used to align
908 keys and values of the same hash
910 key_sort => CODE - a sort sub
911 It may be undef, which means no sorting by keys
912 default: sub { lc $a cmp lc $b }
914 customs => HASH - special options for certain keys
915 (whose values are hashes themselves)
916 may contain: max_key_length, key_sort, customs
923 croak "first argument should be a hash ref" unless ref $_[0] eq 'HASH';
927 # Use a list to preserve order.
931 = exists $options->{key_sort} ? $options->{key_sort}
932 : sub { lc $a cmp lc $b };
934 croak "'key_sort' should be a coderef" unless ref $k_sort eq 'CODE';
935 @pairs = _sort_pairs($k_sort, \%hash);
936 } else { # list of pairs, no sorting
940 my $yaml = $options->{use_header} ? "--- #YAML:1.0\n" : '';
941 my $indent = $options->{indent} || '';
943 ($options->{max_key_length} || 20),
944 max(map { length($_) + 1 } grep { !ref $hash{$_} } keys %hash)
946 my $customs = $options->{customs} || {};
948 # printf format for key
949 my $k_format = "%-${k_length}s";
952 my($key, $val) = splice @pairs, 0, 2;
953 $val = '~' unless defined $val;
954 if(ref $val eq 'HASH') {
956 my %k_options = ( # options for recursive call
957 delta => $options->{delta},
959 indent => $indent . $options->{delta},
961 if (exists $customs->{$key}) {
962 my %k_custom = %{$customs->{$key}};
963 foreach my $k qw(key_sort max_key_length customs) {
964 $k_options{$k} = $k_custom{$k} if exists $k_custom{$k};
967 $yaml .= $indent . "$key:\n"
968 . _dump_hash(\%k_options, %$val);
971 $yaml .= $indent . "$key: {}\n";
974 elsif (ref $val eq 'ARRAY') {
976 $yaml .= $indent . "$key:\n";
979 croak "only nested arrays of non-refs are supported" if ref $_;
980 $yaml .= $indent . $options->{delta} . "- $_\n";
984 $yaml .= $indent . "$key: []\n";
987 elsif( ref $val and !blessed($val) ) {
988 croak "only nested hashes, arrays and objects are supported";
990 else { # if it's an object, just stringify it
991 $yaml .= $indent . sprintf "$k_format %s\n", "$key:", $val;
1000 return eval { $_[0]->isa("UNIVERSAL"); };
1004 return (sort { $b <=> $a } @_)[0];
1008 return (sort { $a <=> $b } @_)[0];
1011 =head3 metafile_file
1013 my $meta_yml = $mm->metafile_file(@metadata_pairs);
1015 Turns the @metadata_pairs into YAML.
1017 This method does not implement a complete YAML dumper, being limited
1018 to dump a hash with values which are strings, undef's or nested hashes
1019 and arrays of strings. No quoting/escaping is done.
1026 my %dump_options = (
1031 return _dump_hash(\%dump_options, @_);
1036 =head3 distmeta_target
1038 my $make_frag = $mm->distmeta_target;
1040 Generates the distmeta target to add META.yml to the MANIFEST in the
1045 sub distmeta_target {
1048 my $add_meta = $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']);
1049 eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) }
1050 or print "Could not add META.yml to MANIFEST: $${'@'}\n"
1053 my $add_meta_to_distdir = $self->cd('$(DISTVNAME)', $add_meta);
1055 return sprintf <<'MAKE', $add_meta_to_distdir;
1056 distmeta : create_distdir metafile
1064 =head3 realclean (o)
1066 Defines the realclean target.
1071 my($self, %attribs) = @_;
1073 my @dirs = qw($(DISTVNAME));
1074 my @files = qw($(FIRST_MAKEFILE) $(MAKEFILE_OLD));
1076 # Special exception for the perl core where INST_* is not in blib.
1077 # This cleans up the files built from the ext/ directory (all XS).
1078 if( $self->{PERL_CORE} ) {
1079 push @dirs, qw($(INST_AUTODIR) $(INST_ARCHAUTODIR));
1080 push @files, values %{$self->{PM}};
1083 if( $self->has_link_code ){
1084 push @files, qw($(OBJECT));
1087 if( $attribs{FILES} ) {
1088 if( ref $attribs{FILES} ) {
1089 push @dirs, @{ $attribs{FILES} };
1092 push @dirs, split /\s+/, $attribs{FILES};
1096 # Occasionally files are repeated several times from different sources
1097 { my(%f) = map { ($_ => 1) } @files; @files = keys %f; }
1098 { my(%d) = map { ($_ => 1) } @dirs; @dirs = keys %d; }
1100 my $rm_cmd = join "\n\t", map { "$_" }
1101 $self->split_command('- $(RM_F)', @files);
1102 my $rmf_cmd = join "\n\t", map { "$_" }
1103 $self->split_command('- $(RM_RF)', @dirs);
1105 my $m = sprintf <<'MAKE', $rm_cmd, $rmf_cmd;
1106 # Delete temporary files (via clean) and also delete dist files
1107 realclean purge :: clean realclean_subdirs
1112 $m .= "\t$attribs{POSTOP}\n" if $attribs{POSTOP};
1118 =head3 realclean_subdirs_target
1120 my $make_frag = $MM->realclean_subdirs_target;
1122 Returns the realclean_subdirs target. This is used by the realclean
1123 target to call realclean on any subdirectories which contain Makefiles.
1127 sub realclean_subdirs_target {
1130 return <<'NOOP_FRAG' unless @{$self->{DIR}};
1135 my $rclean = "realclean_subdirs :\n";
1137 foreach my $dir (@{$self->{DIR}}) {
1138 foreach my $makefile ('$(MAKEFILE_OLD)', '$(FIRST_MAKEFILE)' ) {
1139 my $subrclean .= $self->oneliner(sprintf <<'CODE', $dir, ($makefile) x 2);
1140 chdir '%s'; system '$(MAKE) $(USEMAKEFILE) %s realclean' if -f '%s';
1143 $rclean .= sprintf <<'RCLEAN', $subrclean;
1154 =head3 signature_target
1156 my $target = $mm->signature_target;
1158 Generate the signature target.
1160 Writes the file SIGNATURE with "cpansign -s".
1164 sub signature_target {
1167 return <<'MAKE_FRAG';
1175 =head3 distsignature_target
1177 my $make_frag = $mm->distsignature_target;
1179 Generates the distsignature target to add SIGNATURE to the MANIFEST in the
1184 sub distsignature_target {
1187 my $add_sign = $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']);
1188 eval { maniadd({q{SIGNATURE} => q{Public-key signature (added by MakeMaker)}}) }
1189 or print "Could not add SIGNATURE to MANIFEST: $${'@'}\n"
1192 my $sign_dist = $self->cd('$(DISTVNAME)' => 'cpansign -s');
1194 # cpansign -s complains if SIGNATURE is in the MANIFEST yet does not
1196 my $touch_sig = $self->cd('$(DISTVNAME)' => '$(TOUCH) SIGNATURE');
1197 my $add_sign_to_dist = $self->cd('$(DISTVNAME)' => $add_sign );
1199 return sprintf <<'MAKE', $add_sign_to_dist, $touch_sig, $sign_dist
1200 distsignature : create_distdir
1210 =head3 special_targets
1212 my $make_frag = $mm->special_targets
1214 Returns a make fragment containing any targets which have special
1215 meaning to make. For example, .SUFFIXES and .PHONY.
1219 sub special_targets {
1220 my $make_frag = <<'MAKE_FRAG';
1221 .SUFFIXES : .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
1223 .PHONY: all config static dynamic test linkext manifest blibdirs clean realclean disttest distdir
1227 $make_frag .= <<'MAKE_FRAG' if $ENV{CLEARCASE_ROOT};
1228 .NO_CONFIG_REC: Makefile
1240 Methods which help initialize the MakeMaker object and macros.
1243 =head3 init_ABSTRACT
1252 if( $self->{ABSTRACT_FROM} and $self->{ABSTRACT} ) {
1253 warn "Both ABSTRACT_FROM and ABSTRACT are set. ".
1254 "Ignoring ABSTRACT_FROM.\n";
1258 if ($self->{ABSTRACT_FROM}){
1259 $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or
1260 carp "WARNING: Setting ABSTRACT via file ".
1261 "'$self->{ABSTRACT_FROM}' failed\n";
1269 Called by init_main. Sets up all INST_* variables except those related
1270 to XS code. Those are handled in init_xs.
1277 $self->{INST_ARCHLIB} ||= $self->catdir($Curdir,"blib","arch");
1278 $self->{INST_BIN} ||= $self->catdir($Curdir,'blib','bin');
1280 # INST_LIB typically pre-set if building an extension after
1281 # perl has been built and installed. Setting INST_LIB allows
1282 # you to build directly into, say $Config{privlibexp}.
1283 unless ($self->{INST_LIB}){
1284 if ($self->{PERL_CORE}) {
1285 if (defined $Cross::platform) {
1286 $self->{INST_LIB} = $self->{INST_ARCHLIB} =
1287 $self->catdir($self->{PERL_LIB},"..","xlib",
1291 $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
1294 $self->{INST_LIB} = $self->catdir($Curdir,"blib","lib");
1298 my @parentdir = split(/::/, $self->{PARENT_NAME});
1299 $self->{INST_LIBDIR} = $self->catdir('$(INST_LIB)', @parentdir);
1300 $self->{INST_ARCHLIBDIR} = $self->catdir('$(INST_ARCHLIB)', @parentdir);
1301 $self->{INST_AUTODIR} = $self->catdir('$(INST_LIB)', 'auto',
1303 $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)', 'auto',
1306 $self->{INST_SCRIPT} ||= $self->catdir($Curdir,'blib','script');
1308 $self->{INST_MAN1DIR} ||= $self->catdir($Curdir,'blib','man1');
1309 $self->{INST_MAN3DIR} ||= $self->catdir($Curdir,'blib','man3');
1319 Called by init_main. Sets up all INSTALL_* variables (except
1320 INSTALLDIRS) and *PREFIX.
1327 if( $self->{ARGS}{INSTALL_BASE} and $self->{ARGS}{PREFIX} ) {
1328 die "Only one of PREFIX or INSTALL_BASE can be given. Not both.\n";
1331 if( $self->{ARGS}{INSTALL_BASE} ) {
1332 $self->init_INSTALL_from_INSTALL_BASE;
1335 $self->init_INSTALL_from_PREFIX;
1340 =head3 init_INSTALL_from_PREFIX
1342 $mm->init_INSTALL_from_PREFIX;
1346 sub init_INSTALL_from_PREFIX {
1349 $self->init_lib2arch;
1351 # There are often no Config.pm defaults for these new man variables so
1352 # we fall back to the old behavior which is to use installman*dir
1353 foreach my $num (1, 3) {
1354 my $k = 'installsiteman'.$num.'dir';
1356 $self->{uc $k} ||= uc "\$(installman${num}dir)"
1360 foreach my $num (1, 3) {
1361 my $k = 'installvendorman'.$num.'dir';
1363 unless( $Config{$k} ) {
1364 $self->{uc $k} ||= $Config{usevendorprefix}
1365 ? uc "\$(installman${num}dir)"
1370 $self->{INSTALLSITEBIN} ||= '$(INSTALLBIN)'
1371 unless $Config{installsitebin};
1372 $self->{INSTALLSITESCRIPT} ||= '$(INSTALLSCRIPT)'
1373 unless $Config{installsitescript};
1375 unless( $Config{installvendorbin} ) {
1376 $self->{INSTALLVENDORBIN} ||= $Config{usevendorprefix}
1377 ? $Config{installbin}
1380 unless( $Config{installvendorscript} ) {
1381 $self->{INSTALLVENDORSCRIPT} ||= $Config{usevendorprefix}
1382 ? $Config{installscript}
1387 my $iprefix = $Config{installprefixexp} || $Config{installprefix} ||
1388 $Config{prefixexp} || $Config{prefix} || '';
1389 my $vprefix = $Config{usevendorprefix} ? $Config{vendorprefixexp} : '';
1390 my $sprefix = $Config{siteprefixexp} || '';
1392 # 5.005_03 doesn't have a siteprefix.
1393 $sprefix = $iprefix unless $sprefix;
1396 $self->{PREFIX} ||= '';
1398 if( $self->{PREFIX} ) {
1399 @{$self}{qw(PERLPREFIX SITEPREFIX VENDORPREFIX)} =
1403 $self->{PERLPREFIX} ||= $iprefix;
1404 $self->{SITEPREFIX} ||= $sprefix;
1405 $self->{VENDORPREFIX} ||= $vprefix;
1407 # Lots of MM extension authors like to use $(PREFIX) so we
1408 # put something sensible in there no matter what.
1409 $self->{PREFIX} = '$('.uc $self->{INSTALLDIRS}.'PREFIX)';
1412 my $arch = $Config{archname};
1413 my $version = $Config{version};
1416 my $libstyle = $Config{installstyle} || 'lib/perl5';
1419 if( $self->{LIBSTYLE} ) {
1420 $libstyle = $self->{LIBSTYLE};
1421 $manstyle = $self->{LIBSTYLE} eq 'lib/perl5' ? 'lib/perl5' : '';
1424 # Some systems, like VOS, set installman*dir to '' if they can't
1426 for my $num (1, 3) {
1427 $self->{'INSTALLMAN'.$num.'DIR'} ||= 'none'
1428 unless $Config{'installman'.$num.'dir'};
1433 bin => { s => $iprefix,
1436 vendorbin => { s => $vprefix,
1439 sitebin => { s => $sprefix,
1442 script => { s => $iprefix,
1445 vendorscript=> { s => $vprefix,
1448 sitescript => { s => $sprefix,
1455 man1dir => { s => $iprefix,
1458 style => $manstyle, },
1459 siteman1dir => { s => $sprefix,
1462 style => $manstyle, },
1463 vendorman1dir => { s => $vprefix,
1466 style => $manstyle, },
1468 man3dir => { s => $iprefix,
1471 style => $manstyle, },
1472 siteman3dir => { s => $sprefix,
1475 style => $manstyle, },
1476 vendorman3dir => { s => $vprefix,
1479 style => $manstyle, },
1484 privlib => { s => $iprefix,
1487 style => $libstyle, },
1488 vendorlib => { s => $vprefix,
1491 style => $libstyle, },
1492 sitelib => { s => $sprefix,
1495 style => $libstyle, },
1497 archlib => { s => $iprefix,
1499 d => "$version/$arch",
1500 style => $libstyle },
1501 vendorarch => { s => $vprefix,
1503 d => "$version/$arch",
1504 style => $libstyle },
1505 sitearch => { s => $sprefix,
1507 d => "site_perl/$version/$arch",
1508 style => $libstyle },
1512 # Special case for LIB.
1513 if( $self->{LIB} ) {
1514 foreach my $var (keys %lib_layouts) {
1515 my $Installvar = uc "install$var";
1517 if( $var =~ /arch/ ) {
1518 $self->{$Installvar} ||=
1519 $self->catdir($self->{LIB}, $Config{archname});
1522 $self->{$Installvar} ||= $self->{LIB};
1527 my %type2prefix = ( perl => 'PERLPREFIX',
1528 site => 'SITEPREFIX',
1529 vendor => 'VENDORPREFIX'
1532 my %layouts = (%bin_layouts, %man_layouts, %lib_layouts);
1533 while( my($var, $layout) = each(%layouts) ) {
1534 my($s, $t, $d, $style) = @{$layout}{qw(s t d style)};
1535 my $r = '$('.$type2prefix{$t}.')';
1537 print STDERR "Prefixing $var\n" if $Verbose >= 2;
1539 my $installvar = "install$var";
1540 my $Installvar = uc $installvar;
1541 next if $self->{$Installvar};
1543 $d = "$style/$d" if $style;
1544 $self->prefixify($installvar, $s, $r, $d);
1546 print STDERR " $Installvar == $self->{$Installvar}\n"
1550 # Generate these if they weren't figured out.
1551 $self->{VENDORARCHEXP} ||= $self->{INSTALLVENDORARCH};
1552 $self->{VENDORLIBEXP} ||= $self->{INSTALLVENDORLIB};
1558 =head3 init_from_INSTALL_BASE
1560 $mm->init_from_INSTALL_BASE
1565 lib => [qw(lib perl5)],
1566 arch => [('lib', 'perl5', $Config{archname})],
1568 man1dir => [qw(man man1)],
1569 man3dir => [qw(man man3)]
1571 $map{script} = $map{bin};
1573 sub init_INSTALL_from_INSTALL_BASE {
1576 @{$self}{qw(PREFIX VENDORPREFIX SITEPREFIX PERLPREFIX)} =
1580 foreach my $thing (keys %map) {
1581 foreach my $dir (('', 'SITE', 'VENDOR')) {
1582 my $uc_thing = uc $thing;
1583 my $key = "INSTALL".$dir.$uc_thing;
1586 $self->catdir('$(INSTALL_BASE)', @{$map{$thing}});
1590 # Adjust for variable quirks.
1591 $install{INSTALLARCHLIB} ||= delete $install{INSTALLARCH};
1592 $install{INSTALLPRIVLIB} ||= delete $install{INSTALLLIB};
1594 foreach my $key (keys %install) {
1595 $self->{$key} ||= $install{$key};
1602 =head3 init_VERSION I<Abstract>
1606 Initialize macros representing versions of MakeMaker and other tools
1608 MAKEMAKER: path to the MakeMaker module.
1610 MM_VERSION: ExtUtils::MakeMaker Version
1612 MM_REVISION: ExtUtils::MakeMaker version control revision (for backwards
1615 VERSION: version of your module
1617 VERSION_MACRO: which macro represents the version (usually 'VERSION')
1619 VERSION_SYM: like version but safe for use as an RCS revision number
1621 DEFINE_VERSION: -D line to set the module version when compiling
1623 XS_VERSION: version in your .xs file. Defaults to $(VERSION)
1625 XS_VERSION_MACRO: which macro represents the XS version.
1627 XS_DEFINE_VERSION: -D line to set the xs version when compiling.
1629 Called by init_main.
1636 $self->{MAKEMAKER} = $ExtUtils::MakeMaker::Filename;
1637 $self->{MM_VERSION} = $ExtUtils::MakeMaker::VERSION;
1638 $self->{MM_REVISION}= $ExtUtils::MakeMaker::Revision;
1639 $self->{VERSION_FROM} ||= '';
1641 if ($self->{VERSION_FROM}){
1642 $self->{VERSION} = $self->parse_version($self->{VERSION_FROM});
1643 if( $self->{VERSION} eq 'undef' ) {
1644 carp("WARNING: Setting VERSION via file ".
1645 "'$self->{VERSION_FROM}' failed\n");
1650 if (defined $self->{VERSION}) {
1651 $self->{VERSION} =~ s/^\s+//;
1652 $self->{VERSION} =~ s/\s+$//;
1655 $self->{VERSION} = '';
1659 $self->{VERSION_MACRO} = 'VERSION';
1660 ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
1661 $self->{DEFINE_VERSION} = '-D$(VERSION_MACRO)=\"$(VERSION)\"';
1664 # Graham Barr and Paul Marquess had some ideas how to ensure
1665 # version compatibility between the *.pm file and the
1666 # corresponding *.xs file. The bottomline was, that we need an
1667 # XS_VERSION macro that defaults to VERSION:
1668 $self->{XS_VERSION} ||= $self->{VERSION};
1670 $self->{XS_VERSION_MACRO} = 'XS_VERSION';
1671 $self->{XS_DEFINE_VERSION} = '-D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\"';
1680 Initializes the macro definitions used by tools_other() and places them
1683 If there is no description, its the same as the parameter to
1684 WriteMakefile() documented in ExtUtils::MakeMaker.
1686 Defines at least these macros.
1691 NOECHO Tell make not to display the command itself
1696 MAKE_APERL_FILE File used by MAKE_APERL
1698 SHELL Program used to run shell commands
1700 ECHO Print text adding a newline on the end
1702 RM_RF Remove a directory
1703 TOUCH Update a file's timestamp
1704 TEST_F Test for a file's existence
1707 CHMOD Change permissions on a file
1708 FALSE Exit with non-zero
1711 UMASK_NULL Nullify umask
1712 DEV_NULL Suppress all command output
1719 $self->{ECHO} ||= $self->oneliner('print qq{@ARGV}', ['-l']);
1720 $self->{ECHO_N} ||= $self->oneliner('print qq{@ARGV}');
1722 $self->{TOUCH} ||= $self->oneliner('touch', ["-MExtUtils::Command"]);
1723 $self->{CHMOD} ||= $self->oneliner('chmod', ["-MExtUtils::Command"]);
1724 $self->{RM_F} ||= $self->oneliner('rm_f', ["-MExtUtils::Command"]);
1725 $self->{RM_RF} ||= $self->oneliner('rm_rf', ["-MExtUtils::Command"]);
1726 $self->{TEST_F} ||= $self->oneliner('test_f', ["-MExtUtils::Command"]);
1727 $self->{FALSE} ||= $self->oneliner('exit 1');
1728 $self->{TRUE} ||= $self->oneliner('exit 0');
1730 $self->{MKPATH} ||= $self->oneliner('mkpath', ["-MExtUtils::Command"]);
1732 $self->{CP} ||= $self->oneliner('cp', ["-MExtUtils::Command"]);
1733 $self->{MV} ||= $self->oneliner('mv', ["-MExtUtils::Command"]);
1735 $self->{MOD_INSTALL} ||=
1736 $self->oneliner(<<'CODE', ['-MExtUtils::Install']);
1737 install([ from_to => {@ARGV}, verbose => '$(VERBINST)', uninstall_shadows => '$(UNINST)', dir_mode => '$(PERM_DIR)' ]);
1739 $self->{DOC_INSTALL} ||= $self->oneliner('perllocal_install', ["-MExtUtils::Command::MM"]);
1740 $self->{UNINSTALL} ||= $self->oneliner('uninstall', ["-MExtUtils::Command::MM"]);
1741 $self->{WARN_IF_OLD_PACKLIST} ||=
1742 $self->oneliner('warn_if_old_packlist', ["-MExtUtils::Command::MM"]);
1743 $self->{FIXIN} ||= $self->oneliner('MY->fixin(shift)', ["-MExtUtils::MY"]);
1744 $self->{EQUALIZE_TIMESTAMP} ||= $self->oneliner('eqtime', ["-MExtUtils::Command"]);
1746 $self->{UNINST} ||= 0;
1747 $self->{VERBINST} ||= 0;
1749 $self->{FIRST_MAKEFILE} ||= $self->{MAKEFILE} || 'Makefile';
1750 $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
1751 $self->{MAKEFILE_OLD} ||= $self->{MAKEFILE}.'.old';
1752 $self->{MAKE_APERL_FILE} ||= $self->{MAKEFILE}.'.aperl';
1754 # Not everybody uses -f to indicate "use this Makefile instead"
1755 $self->{USEMAKEFILE} ||= '-f';
1757 # Some makes require a wrapper around macros passed in on the command
1759 $self->{MACROSTART} ||= '';
1760 $self->{MACROEND} ||= '';
1762 $self->{SHELL} ||= $Config{sh};
1764 # UMASK_NULL is not used by MakeMaker but some CPAN modules
1766 $self->{UMASK_NULL} ||= "umask 0";
1768 # Not the greatest default, but its something.
1769 $self->{DEV_NULL} ||= "> /dev/null 2>&1";
1771 $self->{NOOP} ||= '$(TRUE)';
1772 $self->{NOECHO} = '@' unless defined $self->{NOECHO};
1774 $self->{LD_RUN_PATH} = "";
1776 # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
1777 # Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
1778 # undefined. In any case we turn it into an anon array:
1780 # May check $Config{libs} too, thus not empty.
1781 $self->{LIBS} = [$self->{LIBS}] unless ref $self->{LIBS};
1783 $self->{LIBS} = [''] unless @{$self->{LIBS}} && defined $self->{LIBS}[0];
1785 foreach my $libs ( @{$self->{LIBS}} ){
1786 $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
1787 my(@libs) = $self->extliblist($libs);
1788 if ($libs[0] or $libs[1] or $libs[2]){
1789 # LD_RUN_PATH now computed by ExtUtils::Liblist
1790 ($self->{EXTRALIBS}, $self->{BSLOADLIBS},
1791 $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
1796 if ( $self->{OBJECT} ) {
1797 $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
1799 # init_dirscan should have found out, if we have C files
1800 $self->{OBJECT} = "";
1801 $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
1803 $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
1805 $self->{BOOTDEP} = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
1806 $self->{PERLMAINCC} ||= '$(CC)';
1807 $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
1809 # Sanity check: don't define LINKTYPE = dynamic if we're skipping
1810 # the 'dynamic' section of MM. We don't have this problem with
1811 # 'static', since we either must use it (%Config says we can't
1812 # use dynamic loading) or the caller asked for it explicitly.
1813 if (!$self->{LINKTYPE}) {
1814 $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
1816 : ($Config{usedl} ? 'dynamic' : 'static');
1825 my $make_frag = $MM->tools_other;
1827 Returns a make fragment containing definitions for the macros init_others()
1836 # We set PM_FILTER as late as possible so it can see all the earlier
1837 # on macro-order sensitive makes such as nmake.
1838 for my $tool (qw{ SHELL CHMOD CP MV NOOP NOECHO RM_F RM_RF TEST_F TOUCH
1839 UMASK_NULL DEV_NULL MKPATH EQUALIZE_TIMESTAMP
1843 MOD_INSTALL DOC_INSTALL UNINSTALL
1844 WARN_IF_OLD_PACKLIST
1851 next unless defined $self->{$tool};
1852 push @m, "$tool = $self->{$tool}\n";
1859 =head3 init_DIRFILESEP I<Abstract>
1861 $MM->init_DIRFILESEP;
1862 my $dirfilesep = $MM->{DIRFILESEP};
1864 Initializes the DIRFILESEP macro which is the seperator between the
1865 directory and filename in a filepath. ie. / on Unix, \ on Win32 and
1870 # instead of $(INST_ARCHAUTODIR)/extralibs.ld
1871 $(INST_ARCHAUTODIR)$(DIRFILESEP)extralibs.ld
1873 Something of a hack but it prevents a lot of code duplication between
1876 Do not use this as a seperator between directories. Some operating
1877 systems use different seperators between subdirectories as between
1878 directories and filenames (for example: VOLUME:[dir1.dir2]file on VMS).
1880 =head3 init_linker I<Abstract>
1884 Initialize macros which have to do with linking.
1886 PERL_ARCHIVE: path to libperl.a equivalent to be linked to dynamic
1889 PERL_ARCHIVE_AFTER: path to a library which should be put on the
1890 linker command line I<after> the external libraries to be linked to
1891 dynamic extensions. This may be needed if the linker is one-pass, and
1892 Perl includes some overrides for C RTL functions, such as malloc().
1894 EXPORT_LIST: name of a file that is passed to linker to define symbols
1897 Some OSes do not need these in which case leave it blank.
1900 =head3 init_platform
1904 Initialize any macros which are for platform specific use only.
1906 A typical one is the version number of your OS specific mocule.
1907 (ie. MM_Unix_VERSION or MM_VMS_VERSION).
1920 Initialize MAKE from either a MAKE environment variable or $Config{make}.
1927 $self->{MAKE} ||= $ENV{MAKE} || $Config{make};
1933 A grab bag of methods to generate specific macros and commands.
1939 Defines targets and routines to translate the pods into manpages and
1940 put them into the INST_* directories.
1947 my $POD2MAN_macro = $self->POD2MAN_macro();
1948 my $manifypods_target = $self->manifypods_target();
1950 return <<END_OF_TARGET;
1961 =head3 POD2MAN_macro
1963 my $pod2man_macro = $self->POD2MAN_macro
1965 Returns a definition for the POD2MAN macro. This is a program
1966 which emulates the pod2man utility. You can add more switches to the
1967 command by simply appending them on the macro.
1971 $(POD2MAN) --section=3 --perm_rw=$(PERM_RW) podfile1 man_page1 ...
1978 # Need the trailing '--' so perl stops gobbling arguments and - happens
1979 # to be an alternative end of line seperator on VMS so we quote it
1980 return <<'END_OF_DEF';
1981 POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--"
1982 POD2MAN = $(POD2MAN_EXE)
1987 =head3 test_via_harness
1989 my $command = $mm->test_via_harness($perl, $tests);
1991 Returns a $command line which runs the given set of $tests with
1992 Test::Harness and the given $perl.
1994 Used on the t/*.t files.
1998 sub test_via_harness {
1999 my($self, $perl, $tests) = @_;
2001 return qq{\t$perl "-MExtUtils::Command::MM" }.
2002 qq{"-e" "test_harness(\$(TEST_VERBOSE), '\$(INST_LIB)', '\$(INST_ARCHLIB)')" $tests\n};
2005 =head3 test_via_script
2007 my $command = $mm->test_via_script($perl, $script);
2009 Returns a $command line which just runs a single test without
2010 Test::Harness. No checks are done on the results, they're just
2013 Used for test.pl, since they don't always follow Test::Harness
2018 sub test_via_script {
2019 my($self, $perl, $script) = @_;
2020 return qq{\t$perl "-I\$(INST_LIB)" "-I\$(INST_ARCHLIB)" $script\n};
2024 =head3 tool_autosplit
2026 Defines a simple perl call that runs autosplit. May be deprecated by
2031 sub tool_autosplit {
2032 my($self, %attribs) = @_;
2034 my $maxlen = $attribs{MAXLEN} ? '$$AutoSplit::Maxlen=$attribs{MAXLEN};'
2037 my $asplit = $self->oneliner(sprintf <<'PERL_CODE', $maxlen);
2038 use AutoSplit; %s autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)
2041 return sprintf <<'MAKE_FRAG', $asplit;
2042 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
2052 my $arch_ok = $mm->arch_check(
2054 File::Spec->catfile($Config{archlibexp}, "Config.pm")
2057 A sanity check that what Perl thinks the architecture is and what
2058 Config thinks the architecture is are the same. If they're not it
2059 will return false and show a diagnostic message.
2061 When building Perl it will always return true, as nothing is installed
2064 The interface is a bit odd because this is the result of a
2065 quick refactoring. Don't rely on it.
2071 my($pconfig, $cconfig) = @_;
2073 return 1 if $self->{PERL_SRC};
2075 my($pvol, $pthinks) = $self->splitpath($pconfig);
2076 my($cvol, $cthinks) = $self->splitpath($cconfig);
2078 $pthinks = $self->canonpath($pthinks);
2079 $cthinks = $self->canonpath($cthinks);
2082 if ($pthinks ne $cthinks) {
2083 print "Have $pthinks\n";
2084 print "Want $cthinks\n";
2088 my $arch = (grep length, $self->splitdir($pthinks))[-1];
2090 print STDOUT <<END unless $self->{UNINSTALLED_PERL};
2091 Your perl and your Config.pm seem to have different ideas about the
2092 architecture they are running on.
2093 Perl thinks: [$arch]
2094 Config says: [$Config{archname}]
2095 This may or may not cause problems. Please check your installation of perl
2096 if you have problems building this extension.
2105 =head2 File::Spec wrappers
2107 ExtUtils::MM_Any is a subclass of File::Spec. The methods noted here
2108 override File::Spec.
2114 File::Spec <= 0.83 has a bug where the file part of catfile is not
2115 canonicalized. This override fixes that bug.
2121 return $self->canonpath($self->SUPER::catfile(@_));
2128 Methods I can't really figure out where they should go yet.
2133 my $test = $mm->find_tests;
2135 Returns a string suitable for feeding to the shell to return all
2142 return -d 't' ? 't/*.t' : '';
2146 =head3 extra_clean_files
2148 my @files_to_clean = $MM->extra_clean_files;
2150 Returns a list of OS specific files to be removed in the clean target in
2151 addition to the usual set.
2155 # An empty method here tickled a perl 5.8.1 bug and would return its object.
2156 sub extra_clean_files {
2163 my @installvars = $mm->installvars;
2165 A list of all the INSTALL* variables without the INSTALL prefix. Useful
2166 for iteration or building related variable sets.
2171 return qw(PRIVLIB SITELIB VENDORLIB
2172 ARCHLIB SITEARCH VENDORARCH
2173 BIN SITEBIN VENDORBIN
2174 SCRIPT SITESCRIPT VENDORSCRIPT
2175 MAN1DIR SITEMAN1DIR VENDORMAN1DIR
2176 MAN3DIR SITEMAN3DIR VENDORMAN3DIR
2183 my $wanted = $self->libscan($path);
2185 Takes a path to a file or dir and returns an empty string if we don't
2186 want to include this file in the library. Otherwise it returns the
2187 the $path unchanged.
2189 Mainly used to exclude version control administrative directories from
2195 my($self,$path) = @_;
2196 my($dirs,$file) = ($self->splitpath($path))[1,2];
2197 return '' if grep /^(?:RCS|CVS|SCCS|\.svn|_darcs)$/,
2198 $self->splitdir($dirs), $file;
2204 =head3 platform_constants
2206 my $make_frag = $mm->platform_constants
2208 Returns a make fragment defining all the macros initialized in
2209 init_platform() rather than put them in constants().
2213 sub platform_constants {
2220 Michael G Schwern <schwern@pobox.com> and the denizens of
2221 makemaker@perl.org with code from ExtUtils::MM_Unix and