⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mm_win32.pm

📁 UNIX下perl实现代码
💻 PM
📖 第 1 页 / 共 2 页
字号:
package ExtUtils::MM_Win32;=head1 NAMEExtUtils::MM_Win32 - methods to override UN*X behaviour in ExtUtils::MakeMaker=head1 SYNOPSIS use ExtUtils::MM_Win32; # Done internally by ExtUtils::MakeMaker if needed=head1 DESCRIPTIONSee ExtUtils::MM_Unix for a documentation of the methods providedthere. This package overrides the implementation of these methods, notthe semantics.=over=cut use Config;#use Cwd;use File::Basename;require Exporter;Exporter::import('ExtUtils::MakeMaker',       qw( $Verbose &neatvalue));$ENV{EMXSHELL} = 'sh'; # to run `commands`unshift @MM::ISA, 'ExtUtils::MM_Win32';$BORLAND = 1 if $Config{'cc'} =~ /^bcc/i;$GCC     = 1 if $Config{'cc'} =~ /^gcc/i;$DMAKE = 1 if $Config{'make'} =~ /^dmake/i;$NMAKE = 1 if $Config{'make'} =~ /^nmake/i;$PERLMAKE = 1 if $Config{'make'} =~ /^pmake/i;$OBJ   = 1 if $Config{'ccflags'} =~ /PERL_OBJECT/i;# a few workarounds for command.com (very basic){    package ExtUtils::MM_Win95;    # the $^O test may be overkill, but we want to be sure Win32::IsWin95()    # exists before we try it    unshift @MM::ISA, 'ExtUtils::MM_Win95'	if ($^O =~ /Win32/ && Win32::IsWin95());    sub xs_c {	my($self) = shift;	return '' unless $self->needs_linking();	'.xs.c:	$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\	    $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c	'    }    sub xs_cpp {	my($self) = shift;	return '' unless $self->needs_linking();	'.xs.cpp:	$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\	    $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.cpp	';    }    # many makes are too dumb to use xs_c then c_o    sub xs_o {	my($self) = shift;	return '' unless $self->needs_linking();	'.xs$(OBJ_EXT):	$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\	    $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c	$(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c	';    }}	# end of command.com workaroundssub dlsyms {    my($self,%attribs) = @_;    my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};    my($vars)  = $attribs{DL_VARS} || $self->{DL_VARS} || [];    my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];    my($imports)  = $attribs{IMPORTS} || $self->{IMPORTS} || {};    my(@m);    (my $boot = $self->{NAME}) =~ s/:/_/g;    if (not $self->{SKIPHASH}{'dynamic'}) {	push(@m,"$self->{BASEEXT}.def: Makefile.PL",     q!	$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Mksymlists \\     -e "Mksymlists('NAME' => '!, $self->{NAME},     q!', 'DLBASE' => '!,$self->{DLBASE},     q!', 'DL_FUNCS' => !,neatvalue($funcs),     q!, 'FUNCLIST' => !,neatvalue($funclist),     q!, 'IMPORTS' => !,neatvalue($imports),     q!, 'DL_VARS' => !, neatvalue($vars), q!);"!);    }    join('',@m);}sub replace_manpage_separator {    my($self,$man) = @_;    $man =~ s,/+,.,g;    $man;}sub maybe_command {    my($self,$file) = @_;    my @e = exists($ENV{'PATHEXT'})          ? split(/;/, $ENV{PATHEXT})	  : qw(.com .exe .bat .cmd);    my $e = '';    for (@e) { $e .= "\Q$_\E|" }    chop $e;    # see if file ends in one of the known extensions    if ($file =~ /($e)$/i) {	return $file if -e $file;    }    else {	for (@e) {	    return "$file$_" if -e "$file$_";	}    }    return;}sub file_name_is_absolute {    my($self,$file) = @_;    $file =~ m{^([a-z]:)?[\\/]}i ;}sub find_perl {    my($self, $ver, $names, $dirs, $trace) = @_;    my($name, $dir);    if ($trace >= 2){	print "Looking for perl $ver by these names:@$namesin these dirs:@$dirs";    }    foreach $dir (@$dirs){	next unless defined $dir; # $self->{PERL_SRC} may be undefined	foreach $name (@$names){	    my ($abs, $val);	    if ($self->file_name_is_absolute($name)) { # /foo/bar		$abs = $name;	    } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # foo		$abs = $self->catfile($dir, $name);	    } else { # foo/bar		$abs = $self->canonpath($self->catfile($self->curdir, $name));	    }	    print "Checking $abs\n" if ($trace >= 2);	    next unless $self->maybe_command($abs);	    print "Executing $abs\n" if ($trace >= 2);	    $val = `$abs -e "require $ver;" 2>&1`;	    if ($? == 0) {	        print "Using PERL=$abs\n" if $trace;	        return $abs;	    } elsif ($trace >= 2) {		print "Result: `$val'\n";	    }	}    }    print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";    0; # false and not empty}sub catdir {    my $self = shift;    my @args = @_;    for (@args) {	# append a slash to each argument unless it has one there	$_ .= "\\" if $_ eq '' or substr($_,-1) ne "\\";    }    my $result = $self->canonpath(join('', @args));    $result;}=item catfileConcatenate one or more directory names and a filename to form acomplete path ending with a filename=cutsub catfile {    my $self = shift @_;    my $file = pop @_;    return $file unless @_;    my $dir = $self->catdir(@_);    $dir =~ s/(\\\.)$//;    $dir .= "\\" unless substr($dir,length($dir)-1,1) eq "\\";    return $dir.$file;}sub init_others{ my ($self) = @_; &ExtUtils::MM_Unix::init_others; $self->{'TOUCH'}  = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e touch'; $self->{'CHMOD'}  = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e chmod';  $self->{'CP'}     = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e cp'; $self->{'RM_F'}   = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e rm_f'; $self->{'RM_RF'}  = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e rm_rf'; $self->{'MV'}     = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e mv'; $self->{'NOOP'}   = 'rem'; $self->{'TEST_F'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e test_f'; $self->{'LD'}     = $Config{'ld'} || 'link'; $self->{'AR'}     = $Config{'ar'} || 'lib'; $self->{'LDLOADLIBS'} ||= $Config{'libs'}; # -Lfoo must come first for Borland, so we put it in LDDLFLAGS if ($BORLAND) {     my $libs = $self->{'LDLOADLIBS'};     my $libpath = '';     while ($libs =~ s/(?:^|\s)(("?)-L.+?\2)(?:\s|$)/ /) {         $libpath .= ' ' if length $libpath;         $libpath .= $1;     }     $self->{'LDLOADLIBS'} = $libs;     $self->{'LDDLFLAGS'} ||= $Config{'lddlflags'};     $self->{'LDDLFLAGS'} .= " $libpath"; } $self->{'DEV_NULL'} = '> NUL'; # $self->{'NOECHO'} = ''; # till we have it working}=item constants (o)Initializes lots of constants and .SUFFIXES and .PHONY=cutsub constants {    my($self) = @_;    my(@m,$tmp);    for $tmp (qw/	      AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION	      VERSION_SYM XS_VERSION INST_BIN INST_EXE INST_LIB	      INST_ARCHLIB INST_SCRIPT PREFIX  INSTALLDIRS	      INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB	      INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB	      PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB	      FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC	      PERL_INC PERL FULLPERL	      / ) {	next unless defined $self->{$tmp};	push @m, "$tmp = $self->{$tmp}\n";    }    push @m, qq{VERSION_MACRO = VERSIONDEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"XS_VERSION_MACRO = XS_VERSIONXS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"};    push @m, qq{MAKEMAKER = $INC{'ExtUtils\MakeMaker.pm'}MM_VERSION = $ExtUtils::MakeMaker::VERSION};    push @m, q{# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)# ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD)  !!! Deprecated from MM 5.32  !!!# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)# DLBASE  = Basename part of dynamic library. May be just equal BASEEXT.};    for $tmp (qw/	      FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT	      LDFROM LINKTYPE	      /	) {	next unless defined $self->{$tmp};	push @m, "$tmp = $self->{$tmp}\n";    }    push @m, "# Handy lists of source code files:XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."C_FILES = ".join(" \\\n\t", @{$self->{C}})."O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})."H_FILES = ".join(" \\\n\t", @{$self->{H}})."HTMLLIBPODS    = ".join(" \\\n\t", sort keys %{$self->{HTMLLIBPODS}})."HTMLSCRIPTPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLSCRIPTPODS}})."MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."";    for $tmp (qw/	      INST_HTMLPRIVLIBDIR INSTALLHTMLPRIVLIBDIR	      INST_HTMLSITELIBDIR INSTALLHTMLSITELIBDIR	      INST_HTMLSCRIPTDIR  INSTALLHTMLSCRIPTDIR	      INST_HTMLLIBDIR                    HTMLEXT	      INST_MAN1DIR        INSTALLMAN1DIR MAN1EXT	      INST_MAN3DIR        INSTALLMAN3DIR MAN3EXT	      /) {	next unless defined $self->{$tmp};	push @m, "$tmp = $self->{$tmp}\n";    }    push @m, qq{.USESHELL :} if $DMAKE;    push @m, q{.NO_CONFIG_REC: Makefile} if $ENV{CLEARCASE_ROOT};    # why not q{} ? -- emacs    push @m, qq{# work around a famous dec-osf make(1) feature(?):makemakerdflt: all.SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT)# Nick wanted to get rid of .PRECIOUS. I don't remember why. I seem to recall, that# some make implementations will delete the Makefile when we rebuild it. Because# we call false(1) when we rebuild it. So make(1) is not completely wrong when it# does so. Our milage may vary.# .PRECIOUS: Makefile    # seems to be not necessary anymore.PHONY: all config static dynamic test linkext manifest# Where is the Config information that we are using/depend onCONFIGDEP = \$(PERL_ARCHLIB)\\Config.pm \$(PERL_INC)\\config.h};    my @parentdir = split(/::/, $self->{PARENT_NAME});    push @m, q{# Where to put things:INST_LIBDIR      = }. $self->catdir('$(INST_LIB)',@parentdir)        .q{INST_ARCHLIBDIR  = }. $self->catdir('$(INST_ARCHLIB)',@parentdir)    .q{INST_AUTODIR     = }. $self->catdir('$(INST_LIB)','auto','$(FULLEXT)')       .q{INST_ARCHAUTODIR = }. $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)')   .q{};    if ($self->has_link_code()) {	push @m, 'INST_STATIC  = $(INST_ARCHAUTODIR)\$(BASEEXT)$(LIB_EXT)INST_DYNAMIC = $(INST_ARCHAUTODIR)\$(DLBASE).$(DLEXT)INST_BOOT    = $(INST_ARCHAUTODIR)\$(BASEEXT).bs';    } else {	push @m, 'INST_STATIC  =INST_DYNAMIC =INST_BOOT    =';    }    $tmp = $self->export_list;    push @m, "EXPORT_LIST = $tmp";    $tmp = $self->perl_archive;    push @m, "PERL_ARCHIVE = $tmp";#    push @m, q{#INST_PM = }.join(" \\\n\t", sort values %{$self->{PM}}).q{##PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{#};    push @m, q{TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{};    join('',@m);}sub path {    my($self) = @_;    my $path = $ENV{'PATH'} || $ENV{'Path'} || $ENV{'path'};    my @path = split(';',$path);    foreach(@path) { $_ = '.' if $_ eq '' }    @path;}=item static_lib (o)Defines how to produce the *.a (or equivalent) files.=cutsub static_lib {    my($self) = @_;# Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC#    return '' unless $self->needs_linking(); #might be because of a subdir    return '' unless $self->has_link_code;    my(@m);    push(@m, <<'END');$(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)\.exists	$(RM_RF) $@END    # If this extension has it's own library (eg SDBM_File)    # then copy that to $(INST_STATIC) and add $(OBJECT) into it.    push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};    push @m,q{	$(AR) }.($BORLAND ? '$@ $(OBJECT:^"+")'			  : ($GCC ? '-ru $@ $(OBJECT)'			          : '-out:$@ $(OBJECT)')).q{	}.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld	$(CHMOD) 755 $@};# Old mechanism - still available:    push @m, "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs}."\n\n"	if $self->{PERL_SRC};    push @m, $self->dir_target('$(INST_ARCHAUTODIR)');    join('', "\n",@m);}=item dynamic_bs (o)Defines targets for bootstrap files.=cutsub dynamic_bs {    my($self, %attribs) = @_;    return 'BOOTSTRAP =' unless $self->has_link_code();    return 'BOOTSTRAP = '."$self->{BASEEXT}.bs".'# As Mkbootstrap might not write a file (if none is required)# we use touch to prevent make continually trying to remake it.# The DynaLoader only reads a non-empty file.$(BOOTSTRAP): '."$self->{MAKEFILE} $self->{BOOTDEP}".' $(INST_ARCHAUTODIR)\.exists	'.$self->{NOECHO}.'echo "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"	'.$self->{NOECHO}.'$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \		-MExtUtils::Mkbootstrap \		-e "Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"	'.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)	$(CHMOD) 644 $@$(INST_BOOT): $(BOOTSTRAP) $(INST_ARCHAUTODIR)\.exists	'."$self->{NOECHO}$self->{RM_RF}".' $(INST_BOOT)	-'.$self->{CP}.' $(BOOTSTRAP) $(INST_BOOT)	$(CHMOD) 644 $@';}=item dynamic_lib (o)Defines how to produce the *.so (or equivalent) files.=cutsub dynamic_lib {    my($self, %attribs) = @_;    return '' unless $self->needs_linking(); #might be because of a subdir

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -