📄 mm_win32.pm
字号:
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 + -