xref: /onnv-gate/usr/src/cmd/perl/5.8.4/distrib/lib/ExtUtils/MM_Any.pm (revision 0:68f95e015346)
1package ExtUtils::MM_Any;
2
3use strict;
4use vars qw($VERSION @ISA);
5$VERSION = 0.07;
6@ISA = qw(File::Spec);
7
8use Config;
9use File::Spec;
10
11
12=head1 NAME
13
14ExtUtils::MM_Any - Platform-agnostic MM methods
15
16=head1 SYNOPSIS
17
18  FOR INTERNAL USE ONLY!
19
20  package ExtUtils::MM_SomeOS;
21
22  # Temporarily, you have to subclass both.  Put MM_Any first.
23  require ExtUtils::MM_Any;
24  require ExtUtils::MM_Unix;
25  @ISA = qw(ExtUtils::MM_Any ExtUtils::Unix);
26
27=head1 DESCRIPTION
28
29B<FOR INTERNAL USE ONLY!>
30
31ExtUtils::MM_Any is a superclass for the ExtUtils::MM_* set of
32modules.  It contains methods which are either inherently
33cross-platform or are written in a cross-platform manner.
34
35Subclass off of ExtUtils::MM_Any I<and> ExtUtils::MM_Unix.  This is a
36temporary solution.
37
38B<THIS MAY BE TEMPORARY!>
39
40=head1 Inherently Cross-Platform Methods
41
42These are methods which are by their nature cross-platform and should
43always be cross-platform.
44
45=over 4
46
47=item installvars
48
49    my @installvars = $mm->installvars;
50
51A list of all the INSTALL* variables without the INSTALL prefix.  Useful
52for iteration or building related variable sets.
53
54=cut
55
56sub installvars {
57    return qw(PRIVLIB SITELIB  VENDORLIB
58              ARCHLIB SITEARCH VENDORARCH
59              BIN     SITEBIN  VENDORBIN
60              SCRIPT
61              MAN1DIR SITEMAN1DIR VENDORMAN1DIR
62              MAN3DIR SITEMAN3DIR VENDORMAN3DIR
63             );
64}
65
66=item os_flavor_is
67
68    $mm->os_flavor_is($this_flavor);
69    $mm->os_flavor_is(@one_of_these_flavors);
70
71Checks to see if the current operating system is one of the given flavors.
72
73This is useful for code like:
74
75    if( $mm->os_flavor_is('Unix') ) {
76        $out = `foo 2>&1`;
77    }
78    else {
79        $out = `foo`;
80    }
81
82=cut
83
84sub os_flavor_is {
85    my $self = shift;
86    my %flavors = map { ($_ => 1) } $self->os_flavor;
87    return (grep { $flavors{$_} } @_) ? 1 : 0;
88}
89
90=back
91
92=head2 File::Spec wrappers
93
94ExtUtils::MM_Any is a subclass of File::Spec.  The methods noted here
95override File::Spec.
96
97=over 4
98
99=item catfile
100
101File::Spec <= 0.83 has a bug where the file part of catfile is not
102canonicalized.  This override fixes that bug.
103
104=cut
105
106sub catfile {
107    my $self = shift;
108    return $self->canonpath($self->SUPER::catfile(@_));
109}
110
111=back
112
113=head1 Thought To Be Cross-Platform Methods
114
115These are methods which are thought to be cross-platform by virtue of
116having been written in a way to avoid incompatibilities.  They may
117require partial overrides.
118
119=over 4
120
121=item B<split_command>
122
123    my @cmds = $MM->split_command($cmd, @args);
124
125Most OS have a maximum command length they can execute at once.  Large
126modules can easily generate commands well past that limit.  Its
127necessary to split long commands up into a series of shorter commands.
128
129split_command() will return a series of @cmds each processing part of
130the args.  Collectively they will process all the arguments.  Each
131individual line in @cmds will not be longer than the
132$self->max_exec_len being careful to take into account macro expansion.
133
134$cmd should include any switches and repeated initial arguments.
135
136If no @args are given, no @cmds will be returned.
137
138Pairs of arguments will always be preserved in a single command, this
139is a heuristic for things like pm_to_blib and pod2man which work on
140pairs of arguments.  This makes things like this safe:
141
142    $self->split_command($cmd, %pod2man);
143
144
145=cut
146
147sub split_command {
148    my($self, $cmd, @args) = @_;
149
150    my @cmds = ();
151    return(@cmds) unless @args;
152
153    # If the command was given as a here-doc, there's probably a trailing
154    # newline.
155    chomp $cmd;
156
157    # set aside 20% for macro expansion.
158    my $len_left = int($self->max_exec_len * 0.80);
159    $len_left -= length $self->_expand_macros($cmd);
160
161    do {
162        my $arg_str = '';
163        my @next_args;
164        while( @next_args = splice(@args, 0, 2) ) {
165            # Two at a time to preserve pairs.
166            my $next_arg_str = "\t  ". join ' ', @next_args, "\n";
167
168            if( !length $arg_str ) {
169                $arg_str .= $next_arg_str
170            }
171            elsif( length($arg_str) + length($next_arg_str) > $len_left ) {
172                unshift @args, @next_args;
173                last;
174            }
175            else {
176                $arg_str .= $next_arg_str;
177            }
178        }
179        chop $arg_str;
180
181        push @cmds, $self->escape_newlines("$cmd\n$arg_str");
182    } while @args;
183
184    return @cmds;
185}
186
187
188sub _expand_macros {
189    my($self, $cmd) = @_;
190
191    $cmd =~ s{\$\((\w+)\)}{
192        defined $self->{$1} ? $self->{$1} : "\$($1)"
193    }e;
194    return $cmd;
195}
196
197
198=item B<echo>
199
200    my @commands = $MM->echo($text);
201    my @commands = $MM->echo($text, $file);
202    my @commands = $MM->echo($text, $file, $appending);
203
204Generates a set of @commands which print the $text to a $file.
205
206If $file is not given, output goes to STDOUT.
207
208If $appending is true the $file will be appended to rather than
209overwritten.
210
211=cut
212
213sub echo {
214    my($self, $text, $file, $appending) = @_;
215    $appending ||= 0;
216
217    my @cmds = map { '$(NOECHO) $(ECHO) '.$self->quote_literal($_) }
218               split /\n/, $text;
219    if( $file ) {
220        my $redirect = $appending ? '>>' : '>';
221        $cmds[0] .= " $redirect $file";
222        $_ .= " >> $file" foreach @cmds[1..$#cmds];
223    }
224
225    return @cmds;
226}
227
228
229=item init_VERSION
230
231    $mm->init_VERSION
232
233Initialize macros representing versions of MakeMaker and other tools
234
235MAKEMAKER: path to the MakeMaker module.
236
237MM_VERSION: ExtUtils::MakeMaker Version
238
239MM_REVISION: ExtUtils::MakeMaker version control revision (for backwards
240             compat)
241
242VERSION: version of your module
243
244VERSION_MACRO: which macro represents the version (usually 'VERSION')
245
246VERSION_SYM: like version but safe for use as an RCS revision number
247
248DEFINE_VERSION: -D line to set the module version when compiling
249
250XS_VERSION: version in your .xs file.  Defaults to $(VERSION)
251
252XS_VERSION_MACRO: which macro represents the XS version.
253
254XS_DEFINE_VERSION: -D line to set the xs version when compiling.
255
256Called by init_main.
257
258=cut
259
260sub init_VERSION {
261    my($self) = shift;
262
263    $self->{MAKEMAKER}  = $ExtUtils::MakeMaker::Filename;
264    $self->{MM_VERSION} = $ExtUtils::MakeMaker::VERSION;
265    $self->{MM_REVISION}= $ExtUtils::MakeMaker::Revision;
266    $self->{VERSION_FROM} ||= '';
267
268    if ($self->{VERSION_FROM}){
269        $self->{VERSION} = $self->parse_version($self->{VERSION_FROM});
270        if( $self->{VERSION} eq 'undef' ) {
271            require Carp;
272            Carp::carp("WARNING: Setting VERSION via file ".
273                       "'$self->{VERSION_FROM}' failed\n");
274        }
275    }
276
277    # strip blanks
278    if (defined $self->{VERSION}) {
279        $self->{VERSION} =~ s/^\s+//;
280        $self->{VERSION} =~ s/\s+$//;
281    }
282    else {
283        $self->{VERSION} = '';
284    }
285
286
287    $self->{VERSION_MACRO}  = 'VERSION';
288    ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
289    $self->{DEFINE_VERSION} = '-D$(VERSION_MACRO)=\"$(VERSION)\"';
290
291
292    # Graham Barr and Paul Marquess had some ideas how to ensure
293    # version compatibility between the *.pm file and the
294    # corresponding *.xs file. The bottomline was, that we need an
295    # XS_VERSION macro that defaults to VERSION:
296    $self->{XS_VERSION} ||= $self->{VERSION};
297
298    $self->{XS_VERSION_MACRO}  = 'XS_VERSION';
299    $self->{XS_DEFINE_VERSION} = '-D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\"';
300
301}
302
303=item wraplist
304
305Takes an array of items and turns them into a well-formatted list of
306arguments.  In most cases this is simply something like:
307
308    FOO \
309    BAR \
310    BAZ
311
312=cut
313
314sub wraplist {
315    my $self = shift;
316    return join " \\\n\t", @_;
317}
318
319=item manifypods
320
321Defines targets and routines to translate the pods into manpages and
322put them into the INST_* directories.
323
324=cut
325
326sub manifypods {
327    my $self          = shift;
328
329    my $POD2MAN_macro = $self->POD2MAN_macro();
330    my $manifypods_target = $self->manifypods_target();
331
332    return <<END_OF_TARGET;
333
334$POD2MAN_macro
335
336$manifypods_target
337
338END_OF_TARGET
339
340}
341
342
343=item manifypods_target
344
345  my $manifypods_target = $self->manifypods_target;
346
347Generates the manifypods target.  This target generates man pages from
348all POD files in MAN1PODS and MAN3PODS.
349
350=cut
351
352sub manifypods_target {
353    my($self) = shift;
354
355    my $man1pods      = '';
356    my $man3pods      = '';
357    my $dependencies  = '';
358
359    # populate manXpods & dependencies:
360    foreach my $name (keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}}) {
361        $dependencies .= " \\\n\t$name";
362    }
363
364    foreach my $name (keys %{$self->{MAN3PODS}}) {
365        $dependencies .= " \\\n\t$name"
366    }
367
368    my $manify = <<END;
369manifypods : pure_all $dependencies
370END
371
372    my @man_cmds;
373    foreach my $section (qw(1 3)) {
374        my $pods = $self->{"MAN${section}PODS"};
375        push @man_cmds, $self->split_command(<<CMD, %$pods);
376	\$(NOECHO) \$(POD2MAN) --section=$section --perm_rw=\$(PERM_RW)
377CMD
378    }
379
380    $manify .= "\t\$(NOECHO) \$(NOOP)\n" unless @man_cmds;
381    $manify .= join '', map { "$_\n" } @man_cmds;
382
383    return $manify;
384}
385
386
387=item makemakerdflt_target
388
389  my $make_frag = $mm->makemakerdflt_target
390
391Returns a make fragment with the makemakerdeflt_target specified.
392This target is the first target in the Makefile, is the default target
393and simply points off to 'all' just in case any make variant gets
394confused or something gets snuck in before the real 'all' target.
395
396=cut
397
398sub makemakerdflt_target {
399    return <<'MAKE_FRAG';
400makemakerdflt: all
401	$(NOECHO) $(NOOP)
402MAKE_FRAG
403
404}
405
406
407=item special_targets
408
409  my $make_frag = $mm->special_targets
410
411Returns a make fragment containing any targets which have special
412meaning to make.  For example, .SUFFIXES and .PHONY.
413
414=cut
415
416sub special_targets {
417    my $make_frag = <<'MAKE_FRAG';
418.SUFFIXES: .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
419
420.PHONY: all config static dynamic test linkext manifest
421
422MAKE_FRAG
423
424    $make_frag .= <<'MAKE_FRAG' if $ENV{CLEARCASE_ROOT};
425.NO_CONFIG_REC: Makefile
426
427MAKE_FRAG
428
429    return $make_frag;
430}
431
432=item POD2MAN_macro
433
434  my $pod2man_macro = $self->POD2MAN_macro
435
436Returns a definition for the POD2MAN macro.  This is a program
437which emulates the pod2man utility.  You can add more switches to the
438command by simply appending them on the macro.
439
440Typical usage:
441
442    $(POD2MAN) --section=3 --perm_rw=$(PERM_RW) podfile1 man_page1 ...
443
444=cut
445
446sub POD2MAN_macro {
447    my $self = shift;
448
449# Need the trailing '--' so perl stops gobbling arguments and - happens
450# to be an alternative end of line seperator on VMS so we quote it
451    return <<'END_OF_DEF';
452POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--"
453POD2MAN = $(POD2MAN_EXE)
454END_OF_DEF
455}
456
457
458=item test_via_harness
459
460  my $command = $mm->test_via_harness($perl, $tests);
461
462Returns a $command line which runs the given set of $tests with
463Test::Harness and the given $perl.
464
465Used on the t/*.t files.
466
467=cut
468
469sub test_via_harness {
470    my($self, $perl, $tests) = @_;
471
472    return qq{\t$perl "-MExtUtils::Command::MM" }.
473           qq{"-e" "test_harness(\$(TEST_VERBOSE), '\$(INST_LIB)', '\$(INST_ARCHLIB)')" $tests\n};
474}
475
476=item test_via_script
477
478  my $command = $mm->test_via_script($perl, $script);
479
480Returns a $command line which just runs a single test without
481Test::Harness.  No checks are done on the results, they're just
482printed.
483
484Used for test.pl, since they don't always follow Test::Harness
485formatting.
486
487=cut
488
489sub test_via_script {
490    my($self, $perl, $script) = @_;
491    return qq{\t$perl "-I\$(INST_LIB)" "-I\$(INST_ARCHLIB)" $script\n};
492}
493
494=item libscan
495
496  my $wanted = $self->libscan($path);
497
498Takes a path to a file or dir and returns an empty string if we don't
499want to include this file in the library.  Otherwise it returns the
500the $path unchanged.
501
502Mainly used to exclude RCS, CVS, and SCCS directories from
503installation.
504
505=cut
506
507sub libscan {
508    my($self,$path) = @_;
509    my($dirs,$file) = ($self->splitpath($path))[1,2];
510    return '' if grep /^(?:RCS|CVS|SCCS|\.svn)$/,
511                     $self->splitdir($dirs), $file;
512
513    return $path;
514}
515
516=item tool_autosplit
517
518Defines a simple perl call that runs autosplit. May be deprecated by
519pm_to_blib soon.
520
521=cut
522
523sub tool_autosplit {
524    my($self, %attribs) = @_;
525
526    my $maxlen = $attribs{MAXLEN} ? '$$AutoSplit::Maxlen=$attribs{MAXLEN};'
527                                  : '';
528
529    my $asplit = $self->oneliner(sprintf <<'PERL_CODE', $maxlen);
530use AutoSplit; %s autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)
531PERL_CODE
532
533    return sprintf <<'MAKE_FRAG', $asplit;
534# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
535AUTOSPLITFILE = %s
536
537MAKE_FRAG
538
539}
540
541
542=item all_target
543
544Generate the default target 'all'.
545
546=cut
547
548sub all_target {
549    my $self = shift;
550
551    return <<'MAKE_EXT';
552all :: pure_all
553	$(NOECHO) $(NOOP)
554MAKE_EXT
555
556}
557
558
559=item metafile_target
560
561    my $target = $mm->metafile_target;
562
563Generate the metafile target.
564
565Writes the file META.yml, YAML encoded meta-data about the module.  The
566format follows Module::Build's as closely as possible.  Additionally, we
567include:
568
569    version_from
570    installdirs
571
572=cut
573
574sub metafile_target {
575    my $self = shift;
576
577    return <<'MAKE_FRAG' if $self->{NO_META};
578metafile:
579	$(NOECHO) $(NOOP)
580MAKE_FRAG
581
582    my $prereq_pm = '';
583    foreach my $mod ( sort { lc $a cmp lc $b } keys %{$self->{PREREQ_PM}} ) {
584        my $ver = $self->{PREREQ_PM}{$mod};
585        $prereq_pm .= sprintf "    %-30s %s\n", "$mod:", $ver;
586    }
587
588    my $meta = <<YAML;
589# http://module-build.sourceforge.net/META-spec.html
590#XXXXXXX This is a prototype!!!  It will change in the future!!! XXXXX#
591name:         $self->{DISTNAME}
592version:      $self->{VERSION}
593version_from: $self->{VERSION_FROM}
594installdirs:  $self->{INSTALLDIRS}
595requires:
596$prereq_pm
597distribution_type: module
598generated_by: ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION
599YAML
600
601    my @write_meta = $self->echo($meta, 'META.yml');
602    return sprintf <<'MAKE_FRAG', join "\n\t", @write_meta;
603metafile :
604	%s
605MAKE_FRAG
606
607}
608
609
610=item metafile_addtomanifest_target
611
612  my $target = $mm->metafile_addtomanifest_target
613
614Adds the META.yml file to the MANIFEST.
615
616=cut
617
618sub metafile_addtomanifest_target {
619    my $self = shift;
620
621    return <<'MAKE_FRAG' if $self->{NO_META};
622metafile_addtomanifest:
623	$(NOECHO) $(NOOP)
624MAKE_FRAG
625
626    my $add_meta = $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']);
627eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) }
628    or print "Could not add META.yml to MANIFEST: $${'@'}\n"
629CODE
630
631    return sprintf <<'MAKE_FRAG', $add_meta;
632metafile_addtomanifest:
633	$(NOECHO) %s
634MAKE_FRAG
635
636}
637
638
639=back
640
641=head2 Abstract methods
642
643Methods which cannot be made cross-platform and each subclass will
644have to do their own implementation.
645
646=over 4
647
648=item oneliner
649
650  my $oneliner = $MM->oneliner($perl_code);
651  my $oneliner = $MM->oneliner($perl_code, \@switches);
652
653This will generate a perl one-liner safe for the particular platform
654you're on based on the given $perl_code and @switches (a -e is
655assumed) suitable for using in a make target.  It will use the proper
656shell quoting and escapes.
657
658$(PERLRUN) will be used as perl.
659
660Any newlines in $perl_code will be escaped.  Leading and trailing
661newlines will be stripped.  Makes this idiom much easier:
662
663    my $code = $MM->oneliner(<<'CODE', [...switches...]);
664some code here
665another line here
666CODE
667
668Usage might be something like:
669
670    # an echo emulation
671    $oneliner = $MM->oneliner('print "Foo\n"');
672    $make = '$oneliner > somefile';
673
674All dollar signs must be doubled in the $perl_code if you expect them
675to be interpreted normally, otherwise it will be considered a make
676macro.  Also remember to quote make macros else it might be used as a
677bareword.  For example:
678
679    # Assign the value of the $(VERSION_FROM) make macro to $vf.
680    $oneliner = $MM->oneliner('$$vf = "$(VERSION_FROM)"');
681
682Its currently very simple and may be expanded sometime in the figure
683to include more flexible code and switches.
684
685
686=item B<quote_literal>
687
688    my $safe_text = $MM->quote_literal($text);
689
690This will quote $text so it is interpreted literally in the shell.
691
692For example, on Unix this would escape any single-quotes in $text and
693put single-quotes around the whole thing.
694
695
696=item B<escape_newlines>
697
698    my $escaped_text = $MM->escape_newlines($text);
699
700Shell escapes newlines in $text.
701
702
703=item max_exec_len
704
705    my $max_exec_len = $MM->max_exec_len;
706
707Calculates the maximum command size the OS can exec.  Effectively,
708this is the max size of a shell command line.
709
710=for _private
711$self->{_MAX_EXEC_LEN} is set by this method, but only for testing purposes.
712
713=item B<init_others>
714
715    $MM->init_others();
716
717Initializes the macro definitions used by tools_other() and places them
718in the $MM object.
719
720If there is no description, its the same as the parameter to
721WriteMakefile() documented in ExtUtils::MakeMaker.
722
723Defines at least these macros.
724
725  Macro             Description
726
727  NOOP              Do nothing
728  NOECHO            Tell make not to display the command itself
729
730  MAKEFILE
731  FIRST_MAKEFILE
732  MAKEFILE_OLD
733  MAKE_APERL_FILE   File used by MAKE_APERL
734
735  SHELL             Program used to run
736                    shell commands
737
738  ECHO              Print text adding a newline on the end
739  RM_F              Remove a file
740  RM_RF             Remove a directory
741  TOUCH             Update a file's timestamp
742  TEST_F            Test for a file's existence
743  CP                Copy a file
744  MV                Move a file
745  CHMOD             Change permissions on a
746                    file
747
748  UMASK_NULL        Nullify umask
749  DEV_NULL          Supress all command output
750
751=item init_DIRFILESEP
752
753  $MM->init_DIRFILESEP;
754  my $dirfilesep = $MM->{DIRFILESEP};
755
756Initializes the DIRFILESEP macro which is the seperator between the
757directory and filename in a filepath.  ie. / on Unix, \ on Win32 and
758nothing on VMS.
759
760For example:
761
762    # instead of $(INST_ARCHAUTODIR)/extralibs.ld
763    $(INST_ARCHAUTODIR)$(DIRFILESEP)extralibs.ld
764
765Something of a hack but it prevents a lot of code duplication between
766MM_* variants.
767
768Do not use this as a seperator between directories.  Some operating
769systems use different seperators between subdirectories as between
770directories and filenames (for example:  VOLUME:[dir1.dir2]file on VMS).
771
772=item init_linker
773
774    $mm->init_linker;
775
776Initialize macros which have to do with linking.
777
778PERL_ARCHIVE: path to libperl.a equivalent to be linked to dynamic
779extensions.
780
781PERL_ARCHIVE_AFTER: path to a library which should be put on the
782linker command line I<after> the external libraries to be linked to
783dynamic extensions.  This may be needed if the linker is one-pass, and
784Perl includes some overrides for C RTL functions, such as malloc().
785
786EXPORT_LIST: name of a file that is passed to linker to define symbols
787to be exported.
788
789Some OSes do not need these in which case leave it blank.
790
791
792=item init_platform
793
794    $mm->init_platform
795
796Initialize any macros which are for platform specific use only.
797
798A typical one is the version number of your OS specific mocule.
799(ie. MM_Unix_VERSION or MM_VMS_VERSION).
800
801=item platform_constants
802
803    my $make_frag = $mm->platform_constants
804
805Returns a make fragment defining all the macros initialized in
806init_platform() rather than put them in constants().
807
808=cut
809
810sub init_platform {
811    return '';
812}
813
814sub platform_constants {
815    return '';
816}
817
818=item os_flavor
819
820    my @os_flavor = $mm->os_flavor;
821
822@os_flavor is the style of operating system this is, usually
823corresponding to the MM_*.pm file we're using.
824
825The first element of @os_flavor is the major family (ie. Unix,
826Windows, VMS, OS/2, MacOS, etc...) and the rest are sub families.
827
828Some examples:
829
830    Cygwin98       ('Unix',  'Cygwin', 'Cygwin9x')
831    Windows NT     ('Win32', 'WinNT')
832    Win98          ('Win32', 'Win9x')
833    Linux          ('Unix',  'Linux')
834    MacOS Classic  ('MacOS', 'MacOS Classic')
835    MacOS X        ('Unix',  'Darwin', 'MacOS', 'MacOS X')
836    OS/2           ('OS/2')
837
838This is used to write code for styles of operating system.
839See os_flavor_is() for use.
840
841
842=back
843
844=head1 AUTHOR
845
846Michael G Schwern <schwern@pobox.com> and the denizens of
847makemaker@perl.org with code from ExtUtils::MM_Unix and
848ExtUtils::MM_Win32.
849
850
851=cut
852
8531;
854