Added info about dynamic linking to doc
Added dynamic targets to example makefiles Added ocaml_dynamic and ocaml_dynamic_cpp targets to Examples/Makefile.in Added OCAMLFIND and OCAMLDLGEN AC_SUBST lines in configure.in Currently, dynamic linking relies on ocamlfind and Gerd Stolpmann's Dl package, as well as some tricky elf linking. git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@4413 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
b8490f9c18
commit
a1fa5ec2c1
8 changed files with 99 additions and 8 deletions
|
|
@ -62,11 +62,12 @@ best way to determine whether your system will work is to compile the
|
||||||
examples and test-suite which come with SWIG. You can do this by running
|
examples and test-suite which come with SWIG. You can do this by running
|
||||||
<tt>make check</tt> from the SWIG root directory after installing SWIG.
|
<tt>make check</tt> from the SWIG root directory after installing SWIG.
|
||||||
The Ocaml module has been tested using the system's dynamic linking (the
|
The Ocaml module has been tested using the system's dynamic linking (the
|
||||||
usual -lxxx against libxxx.so, but not using the explicit dynamic linking
|
usual -lxxx against libxxx.so, as well as with Gerd Stolpmann's
|
||||||
provided by the Dl package <a
|
<a
|
||||||
href="http://www.ocaml-programming.de/packages/documentation/dl/"> http://www.ocaml-programming.de/packages/documentation/dl/
|
href="http://www.ocaml-programming.de/packages/documentation/dl/">Dl package
|
||||||
</a>, although I suspect that it will work without a problem. If anyone
|
</a>. The ocaml_dynamic and ocaml_dynamic_cpp targets in the
|
||||||
would like to evaluate this support, I will share the results here.
|
file Examples/Makefile illustrate how to compile and link SWIG modules that
|
||||||
|
will be loaded dynamically. This has only been tested on Linux so far.
|
||||||
|
|
||||||
<a name="n3"></a><H3>16.1.1 Running SWIG</H3>
|
<a name="n3"></a><H3>16.1.1 Running SWIG</H3>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,13 @@ static::
|
||||||
INCLUDES='$(INCLUDES)' LIBS='$(LIBS)' SWIGOPT='$(SWIGOPT)' \
|
INCLUDES='$(INCLUDES)' LIBS='$(LIBS)' SWIGOPT='$(SWIGOPT)' \
|
||||||
TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' ocaml_static
|
TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' ocaml_static
|
||||||
|
|
||||||
|
dynamic::
|
||||||
|
$(MAKE) -f $(TOP)/Makefile TOP='$(TOP)' \
|
||||||
|
IOBJS='$(IOBJS)' PROGFILE='$(PROGFILE)' \
|
||||||
|
SRCS='$(SRCS)' SWIG='$(SWIG)' MLFILE='$(MLFILE)' \
|
||||||
|
INCLUDES='$(INCLUDES)' LIBS='$(LIBS)' SWIGOPT='$(SWIGOPT)' \
|
||||||
|
TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' ocaml_dynamic
|
||||||
|
|
||||||
clean::
|
clean::
|
||||||
$(MAKE) -f $(TOP)/Makefile MLFILE='$(MLFILE)' ocaml_clean
|
$(MAKE) -f $(TOP)/Makefile MLFILE='$(MLFILE)' ocaml_clean
|
||||||
rm -f *.gif
|
rm -f *.gif
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,13 @@ static::
|
||||||
INCLUDES='$(INCLUDES)' LIBS='$(LIBS)' SWIGOPT='$(SWIGOPT)' \
|
INCLUDES='$(INCLUDES)' LIBS='$(LIBS)' SWIGOPT='$(SWIGOPT)' \
|
||||||
TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' ocaml_static
|
TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' ocaml_static
|
||||||
|
|
||||||
|
dynamic::
|
||||||
|
$(MAKE) -f $(TOP)/Makefile TOP='$(TOP)' \
|
||||||
|
IOBJS='$(IOBJS)' PROGFILE='$(PROGFILE)' \
|
||||||
|
SRCS='$(SRCS)' SWIG='$(SWIG)' MLFILE='$(MLFILE)' \
|
||||||
|
INCLUDES='$(INCLUDES)' LIBS='$(LIBS)' SWIGOPT='$(SWIGOPT)' \
|
||||||
|
TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' ocaml_static
|
||||||
|
|
||||||
clean::
|
clean::
|
||||||
$(MAKE) -f $(TOP)/Makefile MLFILE='$(MLFILE)' ocaml_clean
|
$(MAKE) -f $(TOP)/Makefile MLFILE='$(MLFILE)' ocaml_clean
|
||||||
rm -f *.gif
|
rm -f *.gif
|
||||||
|
|
|
||||||
|
|
@ -508,6 +508,8 @@ mzscheme_clean:
|
||||||
##################################################################
|
##################################################################
|
||||||
|
|
||||||
OCC=@OCAMLC@
|
OCC=@OCAMLC@
|
||||||
|
OCAMLDLGEN=@OCAMLDLGEN@
|
||||||
|
OCAMLFIND=@OCAMLFIND@
|
||||||
NOLINK ?= false
|
NOLINK ?= false
|
||||||
|
|
||||||
ocaml_static: $(SRCS)
|
ocaml_static: $(SRCS)
|
||||||
|
|
@ -522,9 +524,25 @@ ocaml_static: $(SRCS)
|
||||||
$(PROGFILE:%.ml=%.cmo) \
|
$(PROGFILE:%.ml=%.cmo) \
|
||||||
$(INTERFACE:%.i=%_wrap.@OBJEXT@) $(OBJS) -cclib "$(LIBS)"
|
$(INTERFACE:%.i=%_wrap.@OBJEXT@) $(OBJS) -cclib "$(LIBS)"
|
||||||
|
|
||||||
|
ocaml_dynamic: $(SRCS)
|
||||||
|
$(SWIG) -ocaml $(SWIGOPT) $(INTERFACE)
|
||||||
|
$(OCC) -g -c -ccopt -g -ccopt "$(INCLUDES)" $(ISRCS) $(SRCS)
|
||||||
|
$(CXXSHARED) $(CCSHARED) $(CFLAGS) -o $(INTERFACE:%.i=%@SO@) \
|
||||||
|
$(INTERFACE:%.i=%_wrap.@OBJEXT@) $(OBJS) $(LIBS)
|
||||||
|
$(OCAMLDLGEN) $(INTERFACE:%.i=%.ml) $(INTERFACE:%.i=%@SO@) > \
|
||||||
|
$(INTERFACE:%.i=%_dynamic.ml)
|
||||||
|
mv $(INTERFACE:%.i=%_dynamic.ml) $(INTERFACE:%.i=%.ml)
|
||||||
|
rm $(INTERFACE:%.i=%.mli)
|
||||||
|
$(OCAMLFIND) $(OCC) -g -c -package dl $(INTERFACE:%.i=%.ml)
|
||||||
|
test -z "$(PROGFILE)" || test -f "$(PROGFILE)" && \
|
||||||
|
$(OCC) -c $(PROGFILE)
|
||||||
|
$(NOLINK) || $(OCAMLFIND) \
|
||||||
|
$(OCC) -g -ccopt -g -cclib -g -custom -o $(TARGET) \
|
||||||
|
-package dl -linkpkg \
|
||||||
|
$(INTERFACE:%.i=%.cmo) $(PROGFILE:%.ml=%.cmo)
|
||||||
|
|
||||||
ocaml_static_cpp: $(SRCS)
|
ocaml_static_cpp: $(SRCS)
|
||||||
$(SWIG) -ocaml -c++ $(SWIGOPT) \
|
$(SWIG) -ocaml -c++ $(SWIGOPT) $(INTERFACE)
|
||||||
$(INTERFACE)
|
|
||||||
cp $(ICXXSRCS) $(ICXXSRCS:%.cxx=%.c)
|
cp $(ICXXSRCS) $(ICXXSRCS:%.cxx=%.c)
|
||||||
$(OCC) -cc '$(CXX)' -g -c -ccopt -g -ccopt "-xc++ $(INCLUDES)" \
|
$(OCC) -cc '$(CXX)' -g -c -ccopt -g -ccopt "-xc++ $(INCLUDES)" \
|
||||||
$(ICXXSRCS:%.cxx=%.c) $(SRCS) $(CXXSRCS)
|
$(ICXXSRCS:%.cxx=%.c) $(SRCS) $(CXXSRCS)
|
||||||
|
|
@ -535,7 +553,29 @@ ocaml_static_cpp: $(SRCS)
|
||||||
$(NOLINK) || $(OCC) -g -ccopt -g -cclib -g -custom -o $(TARGET) \
|
$(NOLINK) || $(OCC) -g -ccopt -g -cclib -g -custom -o $(TARGET) \
|
||||||
$(INTERFACE:%.i=%.cmo) \
|
$(INTERFACE:%.i=%.cmo) \
|
||||||
$(PROGFILE:%.ml=%.cmo) \
|
$(PROGFILE:%.ml=%.cmo) \
|
||||||
$(INTERFACE:%.i=%_wrap.@OBJEXT@) -cclib "$(LIBS)" -cc '$(CXX)'
|
$(INTERFACE:%.i=%_wrap.@OBJEXT@) $(OBJS) \
|
||||||
|
-cclib "$(LIBS)" -cc '$(CXX)'
|
||||||
|
|
||||||
|
ocaml_dynamic_cpp: $(SRCS)
|
||||||
|
$(SWIG) -ocaml -c++ $(SWIGOPT) $(INTERFACE)
|
||||||
|
cp $(ICXXSRCS) $(ICXXSRCS:%.cxx=%.c)
|
||||||
|
$(OCC) -cc '$(CXX)' -g -c -ccopt -g -ccopt "-xc++ $(INCLUDES)" \
|
||||||
|
$(ICXXSRCS:%.cxx=%.c) $(SRCS) $(CXXSRCS) -ccopt -fPIC
|
||||||
|
$(CXXSHARED) $(CXXFLAGS) -o $(INTERFACE:%.i=%@SO@) \
|
||||||
|
$(INTERFACE:%.i=%_wrap.@OBJEXT@) $(OBJS) \
|
||||||
|
$(CPP_DLLIBS) $(LIBS)
|
||||||
|
$(OCAMLDLGEN) $(INTERFACE:%.i=%.ml) $(INTERFACE:%.i=%@SO@) > \
|
||||||
|
$(INTERFACE:%.i=%_dynamic.ml)
|
||||||
|
mv $(INTERFACE:%.i=%_dynamic.ml) $(INTERFACE:%.i=%.ml)
|
||||||
|
rm $(INTERFACE:%.i=%.mli)
|
||||||
|
$(OCAMLFIND) $(OCC) -g -c -package dl $(INTERFACE:%.i=%.ml)
|
||||||
|
test -z "$(PROGFILE)" || test -f "$(PROGFILE)" && \
|
||||||
|
$(OCC) -c $(PROGFILE)
|
||||||
|
$(NOLINK) || $(OCAMLFIND) \
|
||||||
|
$(OCC) -cclib -export-dynamic -g -ccopt -g -cclib -g -custom \
|
||||||
|
-o $(TARGET) \
|
||||||
|
-package dl -linkpkg \
|
||||||
|
$(INTERFACE:%.i=%.cmo) $(PROGFILE:%.ml=%.cmo) -cc '$(CXX)'
|
||||||
|
|
||||||
ocaml_static_multi_cpp: $(SRCS)
|
ocaml_static_multi_cpp: $(SRCS)
|
||||||
$(SWIG) -c -ocaml -c++ $(SWIGOPT) \
|
$(SWIG) -c -ocaml -c++ $(SWIGOPT) \
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,12 @@ OBJS = example.o
|
||||||
|
|
||||||
all:: static
|
all:: static
|
||||||
|
|
||||||
|
dynamic::
|
||||||
|
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
|
||||||
|
TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' MLFILE='$(MLFILE)' \
|
||||||
|
PROGFILE='$(PROGFILE)' OBJS='$(OBJS)' \
|
||||||
|
ocaml_dynamic
|
||||||
|
|
||||||
static::
|
static::
|
||||||
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
|
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
|
||||||
TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' MLFILE='$(MLFILE)' \
|
TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' MLFILE='$(MLFILE)' \
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,11 @@ static::
|
||||||
PROGFILE='$(PROGFILE)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
|
PROGFILE='$(PROGFILE)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
|
||||||
ocaml_static_cpp
|
ocaml_static_cpp
|
||||||
|
|
||||||
|
dynamic::
|
||||||
|
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
|
||||||
|
PROGFILE='$(PROGFILE)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
|
||||||
|
ocaml_dynamic_cpp
|
||||||
|
|
||||||
clean::
|
clean::
|
||||||
$(MAKE) -f $(TOP)/Makefile TARGET='$(TARGET)' ocaml_clean
|
$(MAKE) -f $(TOP)/Makefile TARGET='$(TARGET)' ocaml_clean
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,11 @@ static::
|
||||||
PROGFILE='$(PROGFILE)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
|
PROGFILE='$(PROGFILE)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
|
||||||
ocaml_static_cpp
|
ocaml_static_cpp
|
||||||
|
|
||||||
|
dynamic::
|
||||||
|
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
|
||||||
|
PROGFILE='$(PROGFILE)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
|
||||||
|
ocaml_dynamic_cpp
|
||||||
|
|
||||||
clean::
|
clean::
|
||||||
$(MAKE) -f $(TOP)/Makefile TARGET='$(TARGET)' ocaml_clean
|
$(MAKE) -f $(TOP)/Makefile TARGET='$(TARGET)' ocaml_clean
|
||||||
|
|
||||||
|
|
|
||||||
20
configure.in
20
configure.in
|
|
@ -914,6 +914,22 @@ AC_SUBST(PHP4INC)
|
||||||
|
|
||||||
AC_ARG_WITH(ocaml,[ --with-ocaml=path Set location of ocaml executable],[ OCAMLBIN="$withval"], [OCAMLBIN=])
|
AC_ARG_WITH(ocaml,[ --with-ocaml=path Set location of ocaml executable],[ OCAMLBIN="$withval"], [OCAMLBIN=])
|
||||||
AC_ARG_WITH(ocamlc,[ --with-ocamlc=path Set location of ocamlc executable],[ OCAMLC="$withval"], [OCAMLC=])
|
AC_ARG_WITH(ocamlc,[ --with-ocamlc=path Set location of ocamlc executable],[ OCAMLC="$withval"], [OCAMLC=])
|
||||||
|
AC_ARG_WITH(ocamldlgen,[ --with-ocamldlgen=path Set location of ocamldlgen],[ OCAMLDLGEN="$withval" ], [OCAMLDLGEN=])
|
||||||
|
AC_ARG_WITH(ocamlfind,[ --with-ocamlfind=path Set location of ocamlfind],[OCAMLFIND="$withval"],[OCAMLFIND=])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(for Ocaml DL load generator)
|
||||||
|
if test -z "$OCAMLDLGEN"; then
|
||||||
|
AC_CHECK_PROGS(OCAMLDLGEN, ocamldlgen, ocamldlgen)
|
||||||
|
else
|
||||||
|
OCAMLDLGEN="$OCAMLDLGEN"
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(for Ocaml package tool)
|
||||||
|
if test -z "$OCAMLFIND"; then
|
||||||
|
AC_CHECK_PROGS(OCAMLFIND, ocamlfind, ocamlfind)
|
||||||
|
else
|
||||||
|
OCAMLFIND="$OCAMLFIND"
|
||||||
|
fi
|
||||||
|
|
||||||
AC_MSG_CHECKING(for Ocaml compiler)
|
AC_MSG_CHECKING(for Ocaml compiler)
|
||||||
if test -z "$OCAMLC"; then
|
if test -z "$OCAMLC"; then
|
||||||
|
|
@ -945,10 +961,14 @@ fi
|
||||||
export OCAMLINC
|
export OCAMLINC
|
||||||
export OCAMLBIN
|
export OCAMLBIN
|
||||||
export OCAMLC
|
export OCAMLC
|
||||||
|
export OCAMLDLGEN
|
||||||
|
export OCAMLFIND
|
||||||
|
|
||||||
AC_SUBST(OCAMLINC)
|
AC_SUBST(OCAMLINC)
|
||||||
AC_SUBST(OCAMLBIN)
|
AC_SUBST(OCAMLBIN)
|
||||||
AC_SUBST(OCAMLC)
|
AC_SUBST(OCAMLC)
|
||||||
|
AC_SUBST(OCAMLDLGEN)
|
||||||
|
AC_SUBST(OCAMLFIND)
|
||||||
|
|
||||||
#----------------------------------------------------------------
|
#----------------------------------------------------------------
|
||||||
# Look for Pike
|
# Look for Pike
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue