1
0
forked from aniani/vim

Make it possible to load Perl dynamically on Unix. (James Vega)

This commit is contained in:
Bram Moolenaar
2010-07-21 22:05:20 +02:00
parent cdda8fe1c6
commit e06c188bbf
11 changed files with 158 additions and 62 deletions

View File

@@ -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 \

14
src/auto/configure vendored
View File

@@ -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; then :
*/*) ;;
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 @@ $as_echo ">>> too old; need Perl version 5.003_01 or later <<<" >&6; }
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

View File

@@ -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

View File

@@ -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"; then
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)

View File

@@ -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((pTHX_ CV*));
# 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((pTHX_ CV*));
# 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_ SV*, SV*, I32);
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)(register PerlInterpreter*);
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)(register PerlInterpreter*);
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_base_ptr", (PERL_PROC*)&Perl_Istack_base_ptr},
{"Perl_Istack_max_ptr", (PERL_PROC*)&Perl_Istack_max_ptr},
{"Perl_Istack_base_ptr", (PERL_PROC*)&Perl_Istack_base_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, int verbose)
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, int verbose)
}
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

View File

@@ -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