Mercurial > vim
changeset 2370:454f314d0e61 vim73
Make it possible to load Perl dynamically on Unix. (James Vega)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Wed, 21 Jul 2010 22:05:20 +0200 |
parents | 435b5c6a5191 |
children | e95106e347f6 |
files | runtime/doc/if_perl.txt runtime/doc/syntax.txt runtime/doc/todo.txt runtime/ftplugin/debchangelog.vim runtime/syntax/fortran.vim src/Makefile src/auto/configure src/config.h.in src/configure.in src/if_perl.xs src/link.sh |
diffstat | 11 files changed, 158 insertions(+), 62 deletions(-) [+] |
line wrap: on
line diff
--- a/runtime/doc/if_perl.txt +++ b/runtime/doc/if_perl.txt @@ -1,4 +1,4 @@ -*if_perl.txt* For Vim version 7.3b. Last change: 2010 Jul 20 +*if_perl.txt* For Vim version 7.3b. Last change: 2010 Jul 21 VIM REFERENCE MANUAL by Sven Verdoolaege @@ -265,12 +265,15 @@ Note that "EOF" must be at the start of ============================================================================== 4. Dynamic loading *perl-dynamic* -On MS-Windows the Perl library can be loaded dynamically. The |:version| -output then includes |+perl/dyn|. +On MS-Windows and Unix the Perl library can be loaded dynamically. The +|:version| output then includes |+perl/dyn|. -This means that Vim will search for the Perl DLL file only when needed. When -you don't use the Perl interface you don't need it, thus you can use Vim -without this DLL file. +This means that Vim will search for the Perl DLL or shared library file only +when needed. When you don't use the Perl interface you don't need it, thus +you can use Vim without this file. + + +MS-Windows ~ You can download Perl from http://www.perl.org. The one from ActiveState was used for building Vim.
--- a/runtime/doc/syntax.txt +++ b/runtime/doc/syntax.txt @@ -1,4 +1,4 @@ -*syntax.txt* For Vim version 7.3b. Last change: 2010 Jul 20 +*syntax.txt* For Vim version 7.3b. Last change: 2010 Jul 21 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1083,7 +1083,9 @@ FORTRAN *fortran.vim* *ft-fortran-sy Default highlighting and dialect ~ Highlighting appropriate for f95 (Fortran 95) is used by default. This choice should be appropriate for most users most of the time because Fortran 95 is a -superset of Fortran 90 and almost a superset of Fortran 77. +superset of Fortran 90 and almost a superset of Fortran 77. Preliminary +support for Fortran 2003 and Fortran 2008 features has been introduced and is +automatically available in the default (f95) highlighting. Fortran source code form ~ Fortran 9x code can be in either fixed or free source form. Note that the
--- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 7.3b. Last change: 2010 Jul 20 +*todo.txt* For Vim version 7.3b. Last change: 2010 Jul 21 VIM REFERENCE MANUAL by Bram Moolenaar @@ -31,6 +31,7 @@ be worked on, but only if you sponsor Vi -------------------- Known bugs and current work ----------------------- Include patch for horizontal scoll wheel? (Bjorn Winckler, 2010 Jul 20) +Asked for a few changes. Patch for Dynamic loading for Perl. (James Vega, 2010 Jul 20) @@ -1124,8 +1125,6 @@ More patches: Sep 13) - Patch for adding "space" item in 'listchars'. (Jérémie Roquet, 2009 Oct 29, Docs patch Oct 30) -- Patch for supporting #rrggbb in color terminals. (Matt Wozniski) - Where is a recent version of this patch? Or use CSApprox plugin? - Replace ccomplete.vim by cppcomplete.vim from www.vim.org? script 1520 by Vissale Neang. (Martin Stubenschrott) Asked Vissale to make the scripts more friendly for the Vim distribution.
--- a/runtime/ftplugin/debchangelog.vim +++ b/runtime/ftplugin/debchangelog.vim @@ -3,9 +3,9 @@ " Maintainer: Debian Vim Maintainers <pkg-vim-maintainers@lists.alioth.debian.org> " Former Maintainers: Michael Piefel <piefel@informatik.hu-berlin.de> " Stefano Zacchiroli <zack@debian.org> -" Last Change: 2010-04-29 +" Last Change: 2010-07-11 " License: GNU GPL, version 2.0 or later -" URL: http://hg.debian.org/hg/pkg-vim/vim/raw-file/tip/runtime/ftplugin/debchangelog.vim +" URL: http://hg.debian.org/hg/pkg-vim/vim/file/unstable/runtime/ftplugin/debchangelog.vim " Bug completion requires apt-listbugs installed for Debian packages or " python-launchpadlib installed for Ubuntu packages @@ -228,7 +228,7 @@ endfunction augroup changelogMenu au BufEnter * if &filetype == "debchangelog" | call <SID>MakeMenu() | endif -au BufLeave * if &filetype == "debchangelog" | aunmenu Changelog | endif +au BufLeave * if &filetype == "debchangelog" | silent! aunmenu Changelog | endif augroup END " }}}
--- a/runtime/syntax/fortran.vim +++ b/runtime/syntax/fortran.vim @@ -1,16 +1,16 @@ " Vim syntax file " Language: Fortran95 (and Fortran90, Fortran77, F and elf90) -" Version: 0.88 +" Version: 0.89 " URL: http://www.unb.ca/chem/ajit/syntax/fortran.vim -" Last Change: 2008 Nov 01 +" Last Change: 2010 July 21 " Maintainer: Ajit J. Thakkar (ajit AT unb.ca); <http://www.unb.ca/chem/ajit/> -" Usage: Do :help fortran-syntax from Vim +" Usage: For instructions, do :help fortran-syntax from Vim " Credits: " Version 0.1 was based on the fortran 77 syntax file by Mario Eusebio and " Preben Guldberg. Useful suggestions were made by: Andrej Panjkov, " Bram Moolenaar, Thomas Olsen, Michael Sternberg, Christian Reile, " Walter Dieudonné, Alexander Wagner, Roman Bertle, Charles Rendleman, -" and Andrew Griffiths. For instructions on use, do :help fortran from vim +" Andrew Griffiths, Joe Krahn, and Hendrik Merx. " For version 5.x: Clear all syntax items " For version 6.x: Quit if a syntax file is already loaded @@ -74,7 +74,7 @@ if !exists("b:fortran_fixed_source") " Detection becomes more accurate and time-consuming if more lines " are checked. Increase the limit below if you keep lots of comments at " the very top of each file and you have a fast computer. - let b:lmax = 250 + let b:lmax = 500 if ( b:lmax > line("$") ) let b:lmax = line("$") endif @@ -82,7 +82,7 @@ if !exists("b:fortran_fixed_source") let b:ln=1 while b:ln <= b:lmax let b:test = strpart(getline(b:ln),0,5) - if b:test[0] !~ '[Cc*!#]' && b:test !~ '^ \+[!#]' && b:test =~ '[^ 0-9\t]' + if b:test !~ '^[Cc*]' && b:test !~ '^ *[!#]' && b:test =~ '[^ 0-9\t]' && b:test !~ '^[ 0-9]*\t' let b:fortran_fixed_source = 0 break endif @@ -207,7 +207,8 @@ endif syn keyword fortranTypeEx external syn keyword fortranIOEx format -syn keyword fortranKeywordEx continue +syn match fortranKeywordEx "\<continue\>" +syn match fortranKeyword "^\s*\d\+\s\+continue\>" syn match fortranKeywordEx "\<go\s*to\>" syn region fortranStringEx start=+'+ end=+'+ contains=fortranContinueMark,fortranLeftMargin,fortranSerialNumber syn keyword fortran77IntrinsicEx dim lge lgt lle llt mod @@ -290,6 +291,40 @@ if b:fortran_dialect == "f95" || b:fortr endif endif +if b:fortran_dialect == "f95" + " F2003 + syn keyword fortran03Intrinsic command_argument_count get_command get_command_argument get_environment_variable is_iostat_end is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_of + " ISO_C_binding + syn keyword fortran03Constant c_null_char c_alert c_backspace c_form_feed c_new_line c_carriage_return c_horizontal_tab c_vertical_tab + syn keyword fortran03Constant c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr + syn keyword fortran03Intrinsic iso_c_binding c_loc c_funloc c_associated c_f_pointer c_f_procpointer + syn keyword fortran03Type c_ptr c_funptr + " ISO_Fortran_env + syn keyword fortran03Constant iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit + " IEEE_arithmetic + syn keyword fortran03Intrinsic ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode + + syn keyword fortran03ReadWrite flush wait + syn keyword fortran03IO decimal round iomsg + syn keyword fortran03Type asynchronous nopass non_overridable pass protected volatile abstract extends import + syn keyword fortran03Type non_intrinsic value bind deferred generic final enumerator class + syn match fortran03Type "\<associate\>" + syn match fortran03Type "\<end\s*associate" + syn match fortran03Type "\<enum\s*,\s*bind\s*(\s*c\s*)" + syn match fortran03Type "\<end\s*enum" + syn match fortran03Conditional "\<select\s*type" + syn match fortran03Conditional "\<type\s*is\>" + syn match fortran03UnitHeader "\<abstract\s*interface\>" + syn match fortran03Operator "\([\|]\)" + + " F2008 + syn keyword fortran08Intrinsic acosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 + syn keyword fortran08Intrinsic atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits + syn keyword fortran08Intrinsic bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image + syn keyword fortran08IO newunit + syn keyword fortran08Type contiguous +endif + syn cluster fortranCommentGroup contains=fortranTodo if (b:fortran_fixed_source == 1) @@ -324,9 +359,9 @@ syn match cInclude "^\s*#\s*include\>\s if exists("fortran_fold") || exists("fortran_more_precise") syn sync fromstart elseif (b:fortran_fixed_source == 0) - syn sync linecont "&" minlines=20 + syn sync linecont "&" minlines=30 else - syn sync minlines=20 + syn sync minlines=30 endif if version >= 600 && exists("fortran_fold") @@ -336,15 +371,17 @@ if version >= 600 && exists("fortran_fol syn region fortranModule transparent fold keepend start="^\s*module\s\+\(procedure\)\@!\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\(module\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*\(\(\(real \|integer \|logical \|complex \|double \s*precision \)\s*\((\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\|type\s\+(\s*\w\+\s*) \|character \((\(\s*len\s*=\)\=\s*\d\+\s*)\|(\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\=\s*function\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|function\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|subroutine\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule - syn region fortranBlockData transparent fold keepend start="\<block\s*data\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|block\s*data\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock + syn region fortranBlockData transparent fold keepend start="\<block\s*data\(\s\+\z(\a\w*\)\)\=" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|block\s*data\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock syn region fortranInterface transparent fold keepend extend start="^\s*interface\>" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock + syn region fortranTypeDef transparent fold keepend extend start="^\s*type\s*\(,\s*\(public\|private\)\)\=\s*::" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*type\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock else syn region fortranProgram transparent fold keepend start="^\s*program\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\(program\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranModule syn region fortranModule transparent fold keepend start="^\s*module\s\+\(procedure\)\@!\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\(module\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*\(\(\(real \|integer \|logical \|complex \|double \s*precision \)\s*\((\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\|type\s\+(\s*\w\+\s*) \|character \((\(\s*len\s*=\)\=\s*\d\+\s*)\|(\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\=\s*function\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|function\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|subroutine\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule - syn region fortranBlockData transparent fold keepend start="\<block\s*data\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|block\s*data\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock + syn region fortranBlockData transparent fold keepend start="\<block\s*data\(\s\+\z(\a\w*\)\)\=" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|block\s*data\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock syn region fortranInterface transparent fold keepend extend start="^\s*interface\>" skip="^\s*[!#].*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock + syn region fortranTypeDef transparent fold keepend extend start="^\s*type\s*\(,\s*\(public\|private\)\)\=\s*::" skip="^\s*[!#].*$" excludenl end="\<end\s*type\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock endif if exists("fortran_fold_conditionals") @@ -390,26 +427,41 @@ if version >= 508 || !exists("did_fortra " fortranMultiCommentLines HiLink fortranKeyword Keyword HiLink fortranConstructName Identifier + HiLink fortran03Conditional fortranConditional HiLink fortranConditional Conditional HiLink fortranRepeat Repeat HiLink fortranTodo Todo - HiLink fortranContinueMark Todo + if (b:fortran_fixed_source == 1) + HiLink fortranContinueMark Todo + else + HiLink fortranContinueMark Keyword + endif HiLink fortranString String HiLink fortranNumber Number + HiLink fortran03Operator fortranOperator HiLink fortranOperator Operator HiLink fortranBoolean Boolean HiLink fortranLabelError Error HiLink fortranObsolete Todo + HiLink fortran03Type fortranType + HiLink fortran08Type fortranType HiLink fortranType Type HiLink fortranStructure Type HiLink fortranStorageClass StorageClass - HiLink fortranCall fortranUnitHeader + HiLink fortranCall Function + HiLink fortran03UnitHeader fortranUnitHeader HiLink fortranUnitHeader fortranPreCondit + HiLink fortran03ReadWrite fortranReadWrite HiLink fortranReadWrite Keyword + HiLink fortran03IO fortranIO + HiLink fortran08IO fortranIO HiLink fortranIO Keyword HiLink fortran95Intrinsic fortran90Intrinsic HiLink fortran77Intrinsic fortran90Intrinsic HiLink fortran90Intrinsic Function + HiLink fortran03Intrinsic Function + HiLink fortran08Intrinsic Function + HiLink fortran03Constant Function if ( b:fortran_dialect == "elf" || b:fortran_dialect == "F" ) HiLink fortranKeywordOb fortranObsolete
--- a/src/Makefile +++ b/src/Makefile @@ -384,8 +384,10 @@ CClink = $(CC) #CONF_OPT_PLTHOME = --with-plthome=/home/me/mz # PERL -# Uncomment this when you want to include the Perl interface. +# Uncomment one of these when you want to include the Perl interface. +# First one is for static linking, second one for dynamic loading. # The Perl option sometimes causes problems, because it adds extra flags +# # to the command line. If you see strange flags during compilation, check in # auto/config.mk where they come from. If it's PERL_CFLAGS, try commenting # the next line. @@ -393,6 +395,7 @@ CClink = $(CC) # one: "touch perl.exp". # This requires at least "small" features, "tiny" doesn't work. #CONF_OPT_PERL = --enable-perlinterp +#CONF_OPT_PERL = --enable-perlinterp=dynamic # PYTHON # Uncomment this when you want to include the Python interface. @@ -1311,7 +1314,7 @@ SHELL = /bin/sh .SUFFIXES: .c .o .pro PRE_DEFS = -Iproto $(DEFS) $(GUI_DEFS) $(GUI_IPATH) $(CPPFLAGS) $(EXTRA_IPATHS) -POST_DEFS = $(X_CFLAGS) $(LUA_CFLAGS) $(MZSCHEME_CFLAGS) $(PERL_CFLAGS) $(ECL_CFLAGS) $(TCL_CFLAGS) $(RUBY_CFLAGS) $(EXTRA_DEFS) +POST_DEFS = $(X_CFLAGS) $(LUA_CFLAGS) $(MZSCHEME_CFLAGS) $(TCL_CFLAGS) $(RUBY_CFLAGS) $(EXTRA_DEFS) ALL_CFLAGS = $(PRE_DEFS) $(CFLAGS) $(PROFILE_CFLAGS) $(POST_DEFS) @@ -2494,10 +2497,10 @@ mzscheme_base.c: $(MZSCHEME_MZC) --c-mods mzscheme_base.c ++lib scheme/base objects/if_perl.o: auto/if_perl.c - $(CCC) -o $@ auto/if_perl.c + $(CCC) $(PERL_CFLAGS) -o $@ auto/if_perl.c objects/if_perlsfio.o: if_perlsfio.c - $(CCC) -o $@ if_perlsfio.c + $(CCC) $(PERL_CFLAGS) -o $@ if_perlsfio.c objects/py_config.o: $(PYTHON_CONFDIR)/config.c $(CCC) $(PYTHON_CFLAGS) -o $@ $(PYTHON_CONFDIR)/config.c \
--- a/src/auto/configure +++ b/src/auto/configure @@ -1423,7 +1423,7 @@ Optional Features: --disable-xsmp-interact Disable XSMP interaction --enable-luainterp Include Lua interpreter. --enable-mzschemeinterp Include MzScheme interpreter. - --enable-perlinterp Include Perl interpreter. + --enable-perlinterp=OPTS Include Perl interpreter. default=no OPTS=no/yes/dynamic --enable-pythoninterp Include Python interpreter. --enable-python3interp Include Python3 interpreter. --enable-tclinterp Include Tcl interpreter. @@ -4241,7 +4241,7 @@ if test "${with_local_dir+set}" = set; t */*) ;; no) # avoid adding local dir to LDFLAGS and CPPFLAGS - have_local_dir=yes + have_local_include=yes have_local_lib=yes ;; *) as_fn_error "must pass path argument to --with-local-dir" "$LINENO" 5 ;; @@ -4924,7 +4924,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_perlinterp" >&5 $as_echo "$enable_perlinterp" >&6; } -if test "$enable_perlinterp" = "yes"; then +if test "$enable_perlinterp" = "yes" -o "$enable_perlinterp" = "dynamic"; then # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 @@ -4971,6 +4971,7 @@ fi $as_echo_n "checking Perl version... " >&6; } if $vi_cv_path_perl -e 'require 5.003_01' >/dev/null 2>/dev/null; then eval `$vi_cv_path_perl -V:usethreads` + eval `$vi_cv_path_perl -V:libperl` if test "X$usethreads" = "XUNKNOWN" -o "X$usethreads" = "Xundef"; then badthreads=no else @@ -5077,6 +5078,13 @@ rm -f core conftest.err conftest.$ac_obj PERL_LIBS="-L$darwindir/CORE -lperl" fi fi + if test "$enable_perlinterp" = "dynamic"; then + if test "$perl_ok" = "yes" -a "X$libperl" != "X"; then + $as_echo "#define DYNAMIC_PERL 1" >>confdefs.h + + PERL_CFLAGS="-DDYNAMIC_PERL_DLL=\\\"$libperl\\\" $PERL_CFLAGS" + fi + fi fi
--- a/src/config.h.in +++ b/src/config.h.in @@ -325,6 +325,9 @@ /* Define if you want to include the Perl interpreter. */ #undef FEAT_PERL +/* Define for linking via dlopen() or LoadLibrary() */ +#undef DYNAMIC_PERL + /* Define if you want to include the Python interpreter. */ #undef FEAT_PYTHON
--- a/src/configure.in +++ b/src/configure.in @@ -213,7 +213,7 @@ if test "$cross_compiling" = no; then */*) ;; no) # avoid adding local dir to LDFLAGS and CPPFLAGS - have_local_dir=yes + have_local_include=yes have_local_lib=yes ;; *) AC_MSG_ERROR(must pass path argument to --with-local-dir) ;; @@ -620,16 +620,17 @@ fi AC_MSG_CHECKING(--enable-perlinterp argument) AC_ARG_ENABLE(perlinterp, - [ --enable-perlinterp Include Perl interpreter.], , + [ --enable-perlinterp[=OPTS] Include Perl interpreter. [default=no] [OPTS=no/yes/dynamic]], , [enable_perlinterp="no"]) AC_MSG_RESULT($enable_perlinterp) -if test "$enable_perlinterp" = "yes"; then +if test "$enable_perlinterp" = "yes" -o "$enable_perlinterp" = "dynamic"; then AC_SUBST(vi_cv_path_perl) AC_PATH_PROG(vi_cv_path_perl, perl) if test "X$vi_cv_path_perl" != "X"; then AC_MSG_CHECKING(Perl version) if $vi_cv_path_perl -e 'require 5.003_01' >/dev/null 2>/dev/null; then eval `$vi_cv_path_perl -V:usethreads` + eval `$vi_cv_path_perl -V:libperl` if test "X$usethreads" = "XUNKNOWN" -o "X$usethreads" = "Xundef"; then badthreads=no else @@ -722,6 +723,12 @@ if test "$enable_perlinterp" = "yes"; th PERL_LIBS="-L$darwindir/CORE -lperl" fi fi + if test "$enable_perlinterp" = "dynamic"; then + if test "$perl_ok" = "yes" -a "X$libperl" != "X"; then + AC_DEFINE(DYNAMIC_PERL) + PERL_CFLAGS="-DDYNAMIC_PERL_DLL=\\\"$libperl\\\" $PERL_CFLAGS" + fi + fi fi AC_SUBST(shrpenv) AC_SUBST(PERL_SRC)
--- a/src/if_perl.xs +++ b/src/if_perl.xs @@ -84,9 +84,32 @@ static void VIM_init __ARGS((void)); EXTERN_C void boot_DynaLoader __ARGS((pTHX_ CV*)); /* - * For dynamic linked perl. (Windows) + * For dynamic linked perl. */ #if defined(DYNAMIC_PERL) || defined(PROTO) + +#ifndef DYNAMIC_PERL /* just generating prototypes */ +#ifdef _MSWIN +typedef int HANDLE; +#endif +typedef int XSINIT_t; +typedef int XSUBADDR_t; +typedef int perl_key; +#endif + +#ifndef _MSWIN +#include <dlfcn.h> +#define HANDLE void* +#define PERL_PROC void* +#define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL) +#define symbol_from_dll dlsym +#define close_dll dlclose +#else +#define PERL_PROC FARPROC +#define load_dll LoadLibrary +#define symbol_from_dll GetProcAddress +#define close_dll FreeLibrary +#endif /* * Wrapper defines */ @@ -173,6 +196,7 @@ EXTERN_C void boot_DynaLoader __ARGS((pT # define Perl_Ierrgv_ptr dll_Perl_Ierrgv_ptr # define Perl_Isv_yes_ptr dll_Perl_Isv_yes_ptr # define boot_DynaLoader dll_boot_DynaLoader +# define Perl_Gthr_key_ptr dll_Perl_Gthr_key_ptr # define Perl_sys_init dll_Perl_sys_init # define Perl_sys_term dll_Perl_sys_term @@ -191,12 +215,6 @@ EXTERN_C void boot_DynaLoader __ARGS((pT # define Perl_Iscopestack_ix_ptr dll_Perl_Iscopestack_ix_ptr # define Perl_Iunitcheckav_ptr dll_Perl_Iunitcheckav_ptr -#ifndef DYNAMIC_PERL /* just generating prototypes */ -typedef int HANDLE; -typedef int XSINIT_t; -typedef int XSUBADDR_t; -#endif - /* * Declare HANDLE for perl.dll and function pointers. */ @@ -265,6 +283,7 @@ static void (*Perl_sv_setsv_flags)(pTHX_ static void (*Perl_sv_setsv)(pTHX_ SV*, SV*); #endif static bool (*Perl_sv_upgrade)(pTHX_ SV*, U32); +#if (PERL_REVISION == 5) && (PERL_VERSION < 10) static SV*** (*Perl_Tstack_sp_ptr)(register PerlInterpreter*); static OP** (*Perl_Top_ptr)(register PerlInterpreter*); static SV*** (*Perl_Tstack_base_ptr)(register PerlInterpreter*); @@ -276,12 +295,7 @@ static I32** (*Perl_Tmarkstack_max_ptr)( static SV** (*Perl_TSv_ptr)(register PerlInterpreter*); static XPV** (*Perl_TXpv_ptr)(register PerlInterpreter*); static STRLEN* (*Perl_Tna_ptr)(register PerlInterpreter*); -static GV** (*Perl_Idefgv_ptr)(register PerlInterpreter*); -static GV** (*Perl_Ierrgv_ptr)(register PerlInterpreter*); -static SV* (*Perl_Isv_yes_ptr)(register PerlInterpreter*); -static void (*boot_DynaLoader)_((pTHX_ CV*)); - -#if (PERL_REVISION == 5) && (PERL_VERSION >= 10) +#else static void (*Perl_sv_free2)(pTHX_ SV*); static void (*Perl_sys_init)(int* argc, char*** argv); static void (*Perl_sys_term)(void); @@ -301,10 +315,15 @@ static I32* (*Perl_Iscopestack_ix_ptr)(r static AV** (*Perl_Iunitcheckav_ptr)(register PerlInterpreter*); #endif +static GV** (*Perl_Idefgv_ptr)(register PerlInterpreter*); +static GV** (*Perl_Ierrgv_ptr)(register PerlInterpreter*); +static SV* (*Perl_Isv_yes_ptr)(register PerlInterpreter*); +static void (*boot_DynaLoader)_((pTHX_ CV*)); +static perl_key* (*Perl_Gthr_key_ptr)_((pTHX)); + /* * Table of name to function pointer of perl. */ -#define PERL_PROC FARPROC static struct { char* name; PERL_PROC* ptr; @@ -389,17 +408,16 @@ static struct { {"Perl_sys_init", (PERL_PROC*)&Perl_sys_init}, {"Perl_sys_term", (PERL_PROC*)&Perl_sys_term}, {"Perl_ISv_ptr", (PERL_PROC*)&Perl_ISv_ptr}, - {"Perl_Istack_sp_ptr", (PERL_PROC*)&Perl_Istack_sp_ptr}, - {"Perl_Iop_ptr", (PERL_PROC*)&Perl_Iop_ptr}, + {"Perl_Istack_max_ptr", (PERL_PROC*)&Perl_Istack_max_ptr}, {"Perl_Istack_base_ptr", (PERL_PROC*)&Perl_Istack_base_ptr}, - {"Perl_Istack_max_ptr", (PERL_PROC*)&Perl_Istack_max_ptr}, + {"Perl_IXpv_ptr", (PERL_PROC*)&Perl_IXpv_ptr}, {"Perl_Itmps_ix_ptr", (PERL_PROC*)&Perl_Itmps_ix_ptr}, {"Perl_Itmps_floor_ptr", (PERL_PROC*)&Perl_Itmps_floor_ptr}, + {"Perl_Ina_ptr", (PERL_PROC*)&Perl_Ina_ptr}, {"Perl_Imarkstack_ptr_ptr", (PERL_PROC*)&Perl_Imarkstack_ptr_ptr}, {"Perl_Imarkstack_max_ptr", (PERL_PROC*)&Perl_Imarkstack_max_ptr}, - {"Perl_ISv_ptr", (PERL_PROC*)&Perl_ISv_ptr}, - {"Perl_IXpv_ptr", (PERL_PROC*)&Perl_IXpv_ptr}, - {"Perl_Ina_ptr", (PERL_PROC*)&Perl_Ina_ptr}, + {"Perl_Istack_sp_ptr", (PERL_PROC*)&Perl_Istack_sp_ptr}, + {"Perl_Iop_ptr", (PERL_PROC*)&Perl_Iop_ptr}, {"Perl_call_list", (PERL_PROC*)&Perl_call_list}, {"Perl_Iscopestack_ix_ptr", (PERL_PROC*)&Perl_Iscopestack_ix_ptr}, {"Perl_Iunitcheckav_ptr", (PERL_PROC*)&Perl_Iunitcheckav_ptr}, @@ -408,6 +426,7 @@ static struct { {"Perl_Ierrgv_ptr", (PERL_PROC*)&Perl_Ierrgv_ptr}, {"Perl_Isv_yes_ptr", (PERL_PROC*)&Perl_Isv_yes_ptr}, {"boot_DynaLoader", (PERL_PROC*)&boot_DynaLoader}, + {"Perl_Gthr_key_ptr", (PERL_PROC*)&Perl_Gthr_key_ptr}, {"", NULL}, }; @@ -428,7 +447,7 @@ perl_runtime_link_init(char *libname, in if (hPerlLib != NULL) return OK; - if (!(hPerlLib = LoadLibraryEx(libname, NULL, 0))) + if ((hPerlLib = load_dll(libname)) == NULL) { if (verbose) EMSG2(_("E370: Could not load library %s"), libname); @@ -436,10 +455,10 @@ perl_runtime_link_init(char *libname, in } for (i = 0; perl_funcname_table[i].ptr; ++i) { - if (!(*perl_funcname_table[i].ptr = GetProcAddress(hPerlLib, + if (!(*perl_funcname_table[i].ptr = symbol_from_dll(hPerlLib, perl_funcname_table[i].name))) { - FreeLibrary(hPerlLib); + close_dll(hPerlLib); hPerlLib = NULL; if (verbose) EMSG2(_(e_loadfunc), perl_funcname_table[i].name); @@ -508,7 +527,7 @@ perl_end() #ifdef DYNAMIC_PERL if (hPerlLib) { - FreeLibrary(hPerlLib); + close_dll(hPerlLib); hPerlLib = NULL; } #endif
--- a/src/link.sh +++ b/src/link.sh @@ -41,7 +41,7 @@ else if sh link.cmd; then touch auto/link.sed cp link.cmd linkit.sh - for libname in SM ICE nsl dnet dnet_stub inet socket dir elf iconv Xt Xmu Xp Xpm X11 Xdmcp x w dl pthread thread readline m perl crypt attr; do + for libname in SM ICE nsl dnet dnet_stub inet socket dir elf iconv Xt Xmu Xp Xpm X11 Xdmcp x w perl dl pthread thread readline m crypt attr; do cont=yes while test -n "$cont"; do if grep "l$libname " linkit.sh >/dev/null; then