📄 mm_vms.pm
字号:
Use VMS-style quoting on xsubpp command line.=cutsub tool_xsubpp { my($self) = @_; return '' unless $self->needs_linking; my($xsdir) = $self->catdir($self->{PERL_LIB},'ExtUtils'); # drop back to old location if xsubpp is not in new location yet $xsdir = $self->catdir($self->{PERL_SRC},'ext') unless (-f $self->catfile($xsdir,'xsubpp')); my(@tmdeps) = '$(XSUBPPDIR)typemap'; if( $self->{TYPEMAPS} ){ my $typemap; foreach $typemap (@{$self->{TYPEMAPS}}){ if( ! -f $typemap ){ warn "Typemap $typemap not found.\n"; } else{ push(@tmdeps, $self->fixpath($typemap,0)); } } } push(@tmdeps, "typemap") if -f "typemap"; my(@tmargs) = map("-typemap $_", @tmdeps); if( exists $self->{XSOPT} ){ unshift( @tmargs, $self->{XSOPT} ); } if ($Config{'ldflags'} && $Config{'ldflags'} =~ m!/Debug!i && (!exists($self->{XSOPT}) || $self->{XSOPT} !~ /linenumbers/)) { unshift(@tmargs,'-nolinenumbers'); } my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,'xsubpp')); # What are the correct thresholds for version 1 && 2 Paul? if ( $xsubpp_version > 1.923 ){ $self->{XSPROTOARG} = '' unless defined $self->{XSPROTOARG}; } else { if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) { print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp. Your version of xsubpp is $xsubpp_version and cannot handle this. Please upgrade to a more recent version of xsubpp.}; } else { $self->{XSPROTOARG} = ""; } } "XSUBPPDIR = $xsdirXSUBPP = \$(PERL) \"-I\$(PERL_ARCHLIB)\" \"-I\$(PERL_LIB)\" \$(XSUBPPDIR)xsubppXSPROTOARG = $self->{XSPROTOARG}XSUBPPDEPS = @tmdepsXSUBPPARGS = @tmargs";}=item xsubpp_version (override)Test xsubpp exit status according to VMS rules ($sts & 1 ==E<gt> good)rather than Unix rules ($sts == 0 ==E<gt> good).=cutsub xsubpp_version{ my($self,$xsubpp) = @_; my ($version) ; return '' unless $self->needs_linking; # try to figure out the version number of the xsubpp on the system # first try the -v flag, introduced in 1.921 & 2.000a2 my $command = "$self->{PERL} \"-I$self->{PERL_LIB}\" $xsubpp -v"; print "Running: $command\n" if $Verbose; $version = `$command` ; if ($?) { use vmsish 'status'; warn "Running '$command' exits with status $?"; } chop $version ; return $1 if $version =~ /^xsubpp version (.*)/ ; # nope, then try something else my $counter = '000'; my ($file) = 'temp' ; $counter++ while -e "$file$counter"; # don't overwrite anything $file .= $counter; local(*F); open(F, ">$file") or die "Cannot open file '$file': $!\n" ; print F <<EOM ;MODULE = fred PACKAGE = fredintfred(a) int a;EOM close F ; $command = "$self->{PERL} $xsubpp $file"; print "Running: $command\n" if $Verbose; my $text = `$command` ; if ($?) { use vmsish 'status'; warn "Running '$command' exits with status $?"; } unlink $file ; # gets 1.2 -> 1.92 and 2.000a1 return $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ; # it is either 1.0 or 1.1 return 1.1 if $text =~ /^Warning: ignored semicolon/ ; # none of the above, so 1.0 return "1.0" ;}=item tools_other (override)Adds a few MM[SK] macros, and shortens some the installatin commands,in order to stay under DCL's 255-character limit. Also changesEQUALIZE_TIMESTAMP to set revision date of target file to one secondlater than source file, since MMK interprets precisely equal revisiondates for a source and target file as a sign that the target needsto be updated.=cutsub tools_other { my($self) = @_; qq!# Assumes \$(MMS) invokes MMS or MMK# (It is assumed in some cases later that the default makefile name# (Descrip.MMS for MM[SK]) is used.)USEMAKEFILE = /Descrip=USEMACROS = /Macro=(MACROEND = )MAKEFILE = Descrip.MMSSHELL = PosixTOUCH = $self->{TOUCH}CHMOD = $self->{CHMOD}CP = $self->{CP}MV = $self->{MV}RM_F = $self->{RM_F}RM_RF = $self->{RM_RF}SAY = Write Sys\$OutputUMASK_NULL = $self->{UMASK_NULL}NOOP = $self->{NOOP}NOECHO = $self->{NOECHO}MKPATH = Create/DirectoryEQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])"!. ($self->{PARENT} ? '' : qq!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"MOD_INSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);"DOC_INSTALL = \$(PERL) -e "\@ARGV=split(/\\|/,<STDIN>);print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];while(\$key=shift && \$val=shift){print qq[=item *\\n\\nC<\$key: \$val>\\n\\n];}print qq[=back\\n\\n]"UNINSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1,1);"!);}=item dist (override)Provide VMSish defaults for some values, then hand off todefault MM_Unix method.=cutsub dist { my($self, %attribs) = @_; $attribs{VERSION} ||= $self->{VERSION_SYM}; $attribs{NAME} ||= $self->{DISTNAME}; $attribs{ZIPFLAGS} ||= '-Vu'; $attribs{COMPRESS} ||= 'gzip'; $attribs{SUFFIX} ||= '-gz'; $attribs{SHAR} ||= 'vms_share'; $attribs{DIST_DEFAULT} ||= 'zipdist'; # Sanitize these for use in $(DISTVNAME) filespec $attribs{VERSION} =~ s/[^\w\$]/_/g; $attribs{NAME} =~ s/[^\w\$]/-/g; return ExtUtils::MM_Unix::dist($self,%attribs);}=item c_o (override)Use VMS syntax on command line. In particular, $(DEFINE) and$(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.=cutsub c_o { my($self) = @_; return '' unless $self->needs_linking(); '.c$(OBJ_EXT) : $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c.cpp$(OBJ_EXT) : $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp.cxx$(OBJ_EXT) : $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx';}=item xs_c (override)Use MM[SK] macros.=cutsub xs_c { my($self) = @_; return '' unless $self->needs_linking(); '.xs.c : $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)';}=item xs_o (override)Use MM[SK] macros, and VMS command line for C compiler.=cutsub xs_o { # many makes are too dumb to use xs_c then c_o my($self) = @_; return '' unless $self->needs_linking(); '.xs$(OBJ_EXT) : $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c';}=item top_targets (override)Use VMS quoting on command line for Version_check.=cutsub top_targets { my($self) = shift; my(@m); push @m, 'all :: pure_all manifypods $(NOECHO) $(NOOP)pure_all :: config pm_to_blib subdirs linkext $(NOECHO) $(NOOP)subdirs :: $(MYEXTLIB) $(NOECHO) $(NOOP)config :: $(MAKEFILE) $(INST_LIBDIR).exists $(NOECHO) $(NOOP)config :: $(INST_ARCHAUTODIR).exists $(NOECHO) $(NOOP)config :: $(INST_AUTODIR).exists $(NOECHO) $(NOOP)'; push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]); if (%{$self->{MAN1PODS}}) { push @m, q[config :: $(INST_MAN1DIR).exists $(NOECHO) $(NOOP)]; push @m, $self->dir_target(qw[$(INST_MAN1DIR)]); } if (%{$self->{MAN3PODS}}) { push @m, q[config :: $(INST_MAN3DIR).exists $(NOECHO) $(NOOP)]; push @m, $self->dir_target(qw[$(INST_MAN3DIR)]); } push @m, '$(O_FILES) : $(H_FILES)' if @{$self->{O_FILES} || []} && @{$self->{H} || []}; push @m, q{help : perldoc ExtUtils::MakeMaker}; push @m, q{Version_check : $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" - "-MExtUtils::MakeMaker=Version_check" -e "&Version_check('$(MM_VERSION)')"}; join('',@m);}=item dlsyms (override)Create VMS linker options files specifying universal symbols for thisextension's shareable image, and listing other shareable images or libraries to which it should be linked.=cutsub dlsyms { my($self,%attribs) = @_; return '' unless $self->needs_linking(); my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {}; my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || []; my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || []; my(@m); unless ($self->{SKIPHASH}{'dynamic'}) { push(@m,'dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt $(NOECHO) $(NOOP)'); } push(@m,'static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt $(NOECHO) $(NOOP)') unless $self->{SKIPHASH}{'static'}; push @m,'$(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt $(CP) $(MMS$SOURCE) $(MMS$TARGET)$(BASEEXT).opt : Makefile.PL $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Mksymlists;" - ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ], neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars), q[, 'FUNCLIST' => ],neatvalue($funclist),qq[)"\n]; push @m, ' $(PERL) -e "print ""$(INST_STATIC)/Include='; if ($self->{OBJECT} =~ /\bBASEEXT\b/ or $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) { push @m, ($Config{d_vms_case_sensitive_symbols} ? uc($self->{BASEEXT}) :'$(BASEEXT)'); } else { # We don't have a "main" object file, so pull 'em all in # Upcase module names if linker is being case-sensitive my($upcase) = $Config{d_vms_case_sensitive_symbols}; my(@omods) = map { s/\.[^.]*$//; # Trim off file type s[\$\(\w+_EXT\)][]; # even as a macro s/.*[:>\/\]]//; # Trim off dir spec $upcase ? uc($_) : $_; } split ' ', $self->eliminate_macros($self->{OBJECT}); my($tmp,@lines,$elt) = ''; $tmp = shift @omods; foreach $elt (@omods) { $tmp .= ",$elt"; if (length($tmp) > 80) { push @lines, $tmp; $tmp = ''; } } push @lines, $tmp; push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')'; } push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n"; if (length $self->{LDLOADLIBS}) { my($lib); my($line) = ''; foreach $lib (split ' ', $self->{LDLOADLIBS}) { $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs if (length($line) + length($lib) > 160) { push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n"; $line = $lib . '\n'; } else { $line .= $lib . '\n'; } } push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line; } join('',@m);}=item dynamic_lib (override)Use VMS Link command.=cutsub dynamic_lib { my($self, %attribs) = @_; return '' unless $self->needs_linking(); #might be because of a subdir return '' unless $self->has_link_code(); my($otherldflags) = $attribs{OTHERLDFLAGS} || ""; my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || ""; my $shr = $Config{'dbgprefix'} . 'PerlShr'; my(@m); push @m,"OTHERLDFLAGS = $otherldflagsINST_DYNAMIC_DEP = $inst_dynamic_dep"; push @m, '$(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP) $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR) If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",' Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option'; push @m, $self->dir_target('$(INST_ARCHAUTODIR)'); join('',@m);}=item dynamic_bs (override)Use VMS-style quoting on Mkbootstrap command line.=cut
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -