Merge remote-tracking branch 'origin/master' into gsoc2012-scilab

Conflicts:
	.gitignore
	.travis.yml
	configure.ac
This commit is contained in:
Simon Marchetto 2015-01-26 10:50:20 +01:00
commit adc4b788df
352 changed files with 8897 additions and 2812 deletions

9
.gitignore vendored
View file

@ -67,6 +67,7 @@ CCache/config.h
CCache/config.log CCache/config.log
CCache/config.status CCache/config.status
Examples/Makefile Examples/Makefile
Examples/d/example.mk
Examples/guile/Makefile Examples/guile/Makefile
Examples/test-suite/*/Makefile Examples/test-suite/*/Makefile
Examples/xml/Makefile Examples/xml/Makefile
@ -137,6 +138,7 @@ Examples/test-suite/uffi/*/
# Octave generated files # Octave generated files
swigexample*.oct swigexample*.oct
Examples/test-suite/octave/*.oct
# Python generated files, based on: # Python generated files, based on:
# https://github.com/github/gitignore/blob/master/Python.gitignore # https://github.com/github/gitignore/blob/master/Python.gitignore
@ -145,10 +147,11 @@ swigexample*.oct
/__pycache__/ /__pycache__/
# Scilab generated files # Scilab generated files
builder.sce
loader.sce loader.sce
cleaner.sce
gw_*.c # Go generated files
*.[5689]
*_gc.c
# Scratch directories # Scratch directories
Examples/scratch Examples/scratch

View file

@ -6,10 +6,60 @@ env:
- SWIGLANG= - SWIGLANG=
matrix: matrix:
include: include:
- compiler: gcc
env: SWIGLANG=csharp
- compiler: gcc
env: SWIGLANG=d
- compiler: gcc
env: SWIGLANG=go
- compiler: gcc
env: SWIGLANG=guile
- compiler: gcc
env: SWIGLANG=java
- compiler: gcc
env: SWIGLANG=javascript ENGINE=node
- compiler: gcc
env: SWIGLANG=javascript ENGINE=jsc
- compiler: gcc
env: SWIGLANG=javascript ENGINE=v8
- compiler: gcc
env: SWIGLANG=lua
- compiler: gcc
env: SWIGLANG=octave SWIGJOBS=-j3 # 3.2
- compiler: gcc
env: SWIGLANG=octave SWIGJOBS=-j3 VER=3.8
- compiler: gcc
env: SWIGLANG=perl5
- compiler: gcc
env: SWIGLANG=php
- compiler: gcc
env: SWIGLANG=python VER=2.4
- compiler: gcc
env: SWIGLANG=python VER=2.5
- compiler: gcc
env: SWIGLANG=python VER=2.6
- compiler: gcc
env: SWIGLANG=python # 2.7
- compiler: gcc
env: SWIGLANG=python PY3=3 # 3.2
- compiler: gcc
env: SWIGLANG=python PY3=3 VER=3.3
- compiler: gcc
env: SWIGLANG=python PY3=3 VER=3.4
- compiler: gcc
env: SWIGLANG=python SWIG_FEATURES=-builtin
- compiler: gcc
env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3
- compiler: gcc
env: SWIGLANG=ruby
- compiler: gcc - compiler: gcc
env: SWIGLANG=scilab env: SWIGLANG=scilab
- compiler: gcc
env: SWIGLANG=tcl
allow_failures: allow_failures:
# None # Occasional gcc internal compiler error
- compiler: gcc
env: SWIGLANG=octave SWIGJOBS=-j3 VER=3.8
before_install: before_install:
- date -u - date -u
- uname -a - uname -a
@ -18,21 +68,25 @@ before_install:
- time sudo apt-get -qq install libboost-dev - time sudo apt-get -qq install libboost-dev
- if test -z "$SWIGLANG"; then sudo apt-get -qq install yodl; fi - if test -z "$SWIGLANG"; then sudo apt-get -qq install yodl; fi
- if test "$SWIGLANG" = "csharp"; then sudo apt-get -qq install mono-devel; fi - if test "$SWIGLANG" = "csharp"; then sudo apt-get -qq install mono-devel; fi
- if test "$SWIGLANG" = "d"; then wget http://downloads.dlang.org/releases/2014/dmd_2.066.0-0_amd64.deb; sudo dpkg -i dmd_2.066.0-0_amd64.deb; fi
- if test "$SWIGLANG" = "go"; then go env | sed -e 's/^/export /' > goenvsetup && source goenvsetup && rm -f goenvsetup; fi # Until configure.ac is fixed - if test "$SWIGLANG" = "go"; then go env | sed -e 's/^/export /' > goenvsetup && source goenvsetup && rm -f goenvsetup; fi # Until configure.ac is fixed
- if test "$SWIGLANG" = "javascript" -a "$ENGINE" = "node"; then sudo apt-get install -qq rlwrap python-software-properties && echo 'yes' | sudo add-apt-repository ppa:chris-lea/node.js && sudo apt-get -qq update && sudo apt-get install -qq nodejs && sudo npm install -g node-gyp; fi - if test "$SWIGLANG" = "javascript" -a "$ENGINE" = "node"; then sudo apt-get install -qq rlwrap python-software-properties && echo 'yes' | sudo add-apt-repository ppa:chris-lea/node.js && sudo apt-get -qq update && sudo apt-get install -qq nodejs && sudo npm install -g node-gyp; fi
- if test "$SWIGLANG" = "javascript" -a "$ENGINE" = "jsc"; then sudo apt-get install -qq libwebkitgtk-dev; fi - if test "$SWIGLANG" = "javascript" -a "$ENGINE" = "jsc"; then sudo apt-get install -qq libwebkitgtk-dev; fi
- if test "$SWIGLANG" = "javascript" -a "$ENGINE" = "v8"; then sudo apt-get install -qq libv8-dev; fi - if test "$SWIGLANG" = "javascript" -a "$ENGINE" = "v8"; then sudo apt-get install -qq libv8-dev; fi
- if test "$SWIGLANG" = "guile"; then sudo apt-get -qq install guile-2.0-dev; fi - if test "$SWIGLANG" = "guile"; then sudo apt-get -qq install guile-2.0-dev; fi
- if test "$SWIGLANG" = "lua"; then sudo apt-get -qq install lua5.1 liblua5.1-dev; fi - if test "$SWIGLANG" = "lua"; then sudo apt-get -qq install lua5.1 liblua5.1-dev; fi
- if test "$SWIGLANG" = "octave"; then sudo apt-get -qq install octave3.2 octave3.2-headers; fi - if test "$SWIGLANG" = "octave" -a -z "$VER"; then sudo apt-get -qq install octave3.2 octave3.2-headers; fi
- if test "$SWIGLANG" = "scilab"; then sudo apt-get -qq install scilab; fi - if test "$SWIGLANG" = "octave" -a "$VER"; then sudo add-apt-repository -y ppa:kwwette/octaves && sudo apt-get -qq update && sudo apt-get -qq install liboctave${VER}-dev; fi
- if test "$SWIGLANG" = "php"; then sudo apt-get install php5-cli php5-dev; fi - if test "$SWIGLANG" = "php"; then sudo apt-get install php5-cli php5-dev; fi
- if test "$SWIGLANG" = "python"; then git clone https://github.com/jcrocholl/pep8.git && pushd pep8 && git checkout tags/1.5.7 && python ./setup.py build && sudo python ./setup.py install && popd; fi
- if test "$SWIGLANG" = "python" -a "$PY3" -a -z "$VER"; then sudo apt-get install -qq python3-dev; fi - if test "$SWIGLANG" = "python" -a "$PY3" -a -z "$VER"; then sudo apt-get install -qq python3-dev; fi
- if test "$SWIGLANG" = "python" -a "$VER"; then sudo add-apt-repository -y ppa:fkrull/deadsnakes && sudo apt-get -qq update && sudo apt-get -qq install python${VER}-dev && export CONFIGOPTS="--with-python${PY3}=python${VER}"; fi - if test "$SWIGLANG" = "python" -a "$VER"; then sudo add-apt-repository -y ppa:fkrull/deadsnakes && sudo apt-get -qq update && sudo apt-get -qq install python${VER}-dev && export CONFIGOPTS="--with-python${PY3}=python${VER}"; fi
- if test "$SWIGLANG" = "scilab"; then sudo apt-get -qq install scilab; fi
- if test "$SWIGLANG" = "tcl"; then sudo apt-get -qq install tcl8.4-dev; fi - if test "$SWIGLANG" = "tcl"; then sudo apt-get -qq install tcl8.4-dev; fi
# Stricter compile flags for examples. Various headers and SWIG generated code prevents full use of -pedantic. # Stricter compile flags for examples. Various headers and SWIG generated code prevents full use of -pedantic.
- declare -A CFLAGS_EXAMPLES && CFLAGS_EXAMPLES=( - declare -A CFLAGS_EXAMPLES && CFLAGS_EXAMPLES=(
["csharp"]="-Werror -std=gnu89 -fdiagnostics-show-option -Wno-long-long -Wreturn-type" ["csharp"]="-Werror -std=gnu89 -fdiagnostics-show-option -Wno-long-long -Wreturn-type"
["d"]="-Werror -std=gnu89 -fdiagnostics-show-option -Wno-long-long -Wreturn-type"
["go"]="-Werror -std=gnu89 -fdiagnostics-show-option -Wno-long-long -Wreturn-type" ["go"]="-Werror -std=gnu89 -fdiagnostics-show-option -Wno-long-long -Wreturn-type"
["guile"]="-Werror -std=gnu89 -fdiagnostics-show-option -Wno-long-long -Wreturn-type" ["guile"]="-Werror -std=gnu89 -fdiagnostics-show-option -Wno-long-long -Wreturn-type"
["java"]="-Werror -std=gnu89 -fdiagnostics-show-option -pedantic -Wno-long-long -Wreturn-type" ["java"]="-Werror -std=gnu89 -fdiagnostics-show-option -pedantic -Wno-long-long -Wreturn-type"
@ -48,6 +102,7 @@ before_install:
) )
- declare -A CXXFLAGS_EXAMPLES && CXXFLAGS_EXAMPLES=( - declare -A CXXFLAGS_EXAMPLES && CXXFLAGS_EXAMPLES=(
["csharp"]="-Werror -std=c++98 -fdiagnostics-show-option -pedantic -Wno-long-long -Wreturn-type" ["csharp"]="-Werror -std=c++98 -fdiagnostics-show-option -pedantic -Wno-long-long -Wreturn-type"
["d"]="-Werror -std=c++98 -fdiagnostics-show-option -pedantic -Wno-long-long -Wreturn-type"
["go"]="-Werror -std=c++98 -fdiagnostics-show-option -pedantic -Wno-long-long -Wreturn-type" ["go"]="-Werror -std=c++98 -fdiagnostics-show-option -pedantic -Wno-long-long -Wreturn-type"
["guile"]="-Werror -std=c++98 -fdiagnostics-show-option -Wno-long-long -Wreturn-type" ["guile"]="-Werror -std=c++98 -fdiagnostics-show-option -Wno-long-long -Wreturn-type"
["java"]="-Werror -std=c++98 -fdiagnostics-show-option -pedantic -Wno-long-long -Wreturn-type" ["java"]="-Werror -std=c++98 -fdiagnostics-show-option -pedantic -Wno-long-long -Wreturn-type"

View file

@ -1,8 +1,8 @@
*** ANNOUNCE: SWIG 3.0.2 (4 Jun 2014) *** *** ANNOUNCE: SWIG 3.0.5 (in progress) ***
http://www.swig.org http://www.swig.org
We're pleased to announce SWIG-3.0.2, the latest SWIG release. We're pleased to announce SWIG-3.0.5, the latest SWIG release.
What is SWIG? What is SWIG?
============= =============
@ -21,11 +21,11 @@ Availability
============ ============
The release is available for download on Sourceforge at The release is available for download on Sourceforge at
http://prdownloads.sourceforge.net/swig/swig-3.0.2.tar.gz http://prdownloads.sourceforge.net/swig/swig-3.0.5.tar.gz
A Windows version is also available at A Windows version is also available at
http://prdownloads.sourceforge.net/swig/swigwin-3.0.2.zip http://prdownloads.sourceforge.net/swig/swigwin-3.0.5.zip
Please report problems with this release to the swig-devel mailing list, Please report problems with this release to the swig-devel mailing list,
details at http://www.swig.org/mail.html. details at http://www.swig.org/mail.html.

254
CHANGES
View file

@ -3,6 +3,200 @@ SWIG (Simplified Wrapper and Interface Generator)
See the CHANGES.current file for changes in the current version. See the CHANGES.current file for changes in the current version.
See the RELEASENOTES file for a summary of changes in each release. See the RELEASENOTES file for a summary of changes in each release.
Version 3.0.4 (14 Jan 2015)
===========================
2015-01-12: olly
[PHP] Fix segfault in director upcall check when using PHP built with
ZTS enabled. Fixes #155, reported by Pierre Labastie.
2015-01-12: vadz
[Python] Fix #294 #296 - Regression introduced in SWIG-3.0.3 when
wrapping functions with default arguments. Invalid or missing default
arguments were sometimes being generated into the python layer.
2015-01-08: olly
Allow C++11 "explicit constexpr". Fixes github issue #284 reported
by Pawel Tomulik. Also handle "constexpr explicit" and "constexpr
static".
2015-01-08: olly
When reporting an error for a construct which hasn't been
terminated when the end of the file is reached, report it at the
start line rather than "EOF" as then tools like editors and IDEs
will take you to a generally more useful place for fixing the
problem.
2015-01-08: olly
Improve error messages for a few cases which previously gave the
one of the cryptic catch-all errors "Syntax error in input".
2015-01-08: olly
Provide -cppext as a general command line option for setting the
extension used for generated C++ files (previously it was specific
to the PHP backend). Deprecate the equivalent -suffix option
provided by the Ocaml backend, but continue to support that for
now.
Version 3.0.3 (30 Dec 2014)
===========================
2014-12-27: wsfulton
Fix #280 - abort using all default template parameters within other template
parameters.
2014-12-27: talby
[Perl] Issue #282 perl5 archlib vs archlibexp
[Perl] tidy "warning: duplicate 'extern' declaration specifier" when building generated code
under clang
2014-12-18: wsfulton
Add support for %constant and structs/classes - issue #272
2014-12-09: wsfulton
Fix #245 - regression (since swig-3.0.0) in templated constructors.
Templated constructors could not be instantiated - they were incorrectly ignored with a warning 504:
"Function: xyz must have a return type. Ignored."
2014-12-07: wsfulton
Add support for C++11 strongly typed enumerations.
2014-11-21: wsfulton
[Java C#] Fix multiply defined error when using %rename of enum items when using the "simple enum"
wrappers.
2014-10-28: vadz
[Python] Patch #201 The generated .py file no longer uses *args for all Python parameters.
Instead, the parameters are named using the C++ parameter names.
2014-10-24: timotheecour
[D] Patch #204 Use core.atomic.atomicOp to mutate shared variables
2014-10-21: wsfulton
Fix issue #242 - Use of the "kwargs" feature no longer automatically turns on the
"compactdefaultargs" feature if the target language does not support kwargs.
Only Java and Python support kwargs, so this affects all the other languages.
*** POTENTIAL INCOMPATIBILITY ***
2014-10-10: diorcety
[Python] Patch #232 Fix property access using directors
2014-10-06: wsfulton
[Python] Fixes when using -builtin and std::vector/std::list wrappers to allow deletion
of single elements, such as 'del vec[0]'.
2014-09-30: oliverb
[Javascript] Merge patch #216 by Richie765 - Added support for many versions of v8 javascript.
2014-09-30: oliverb
[Javascript] Merge patch #195 by zittix - Fixed JSClassRef declaration not using the static one.
2014-09-30: ianlancetaylor
[Go] In configure script, require Go 1.1 or later.
2014-09-30: wsfulton
[Python] Patch #207 - Fix No module error with -relativeimport when using single
header file import.
2014-09-27: wsfulton
Patch #208 - Initialise newly created array when using array_functions in the
carrays.i library (C++ usage).
2014-09-27: wsfulton
[Ruby] Patch #187 - Fix crash on shutdown of the Ruby interpreter if more than one
module was loaded at a time when data is being shared between modules.
2014-09-27: wsfulton
[Java] Patch #168 - Fix leak in Java director string handling after the Java
upcall when called from a native thread.
2014-09-25: ianlancetaylor
[Go] Adjust generated code to work with upcoming Go 1.4
release.
2014-09-23: wsfulton
[Python] Add patch from Thomas Maslach to fix crash in wrappers when using -threads in
the STL iterators (SwigPyIterator destructor).
2014-09-17: wsfulton
[C#] Merge patch #229 from contre - Add bool array types to arrays_csharp.i
2014-09-12: olly
[PHP] Add support for specifying any PHP interfaces a wrapped class
implements, e.g.: %typemap("phpinterfaces") MyIterator "Iterator";
2014-09-11: olly
[PHP] Fix throwing a PHP exception through C++ from a subclassed
director method - PHP NULL gets returned by the subclassed method
in this case, so the directorout typemap needs to allow that (at
least if an exception is active).
2014-09-09: ianlancetaylor
[Go] Add goargout typemap.
2014-09-09: olly
[PHP] Fix segmentation faults with directors in PHP >= 5.4, and
reenable runme tests for director_basic testcase. Fix from
pavel-charvat in issue#164.
2014-09-05: ianlancetaylor
[Go] Add imtype, goin, goout, godirectorin, and
godirectorout typemaps, to support writing Go code to
convert between types.
2014-09-02: olly
[Python] Fix regression in indentation of python code produced with
-modern, introduced by changes in #188. Reported by fabiencastan
in #218.
2014-09-01: olly
Issue an error for unknown SWIG preprocessor directives, rather
than quietly ignoring them. Reported by jrhelsey in issue#217.
*** POTENTIAL INCOMPATIBILITY ***
2014-08-15: talby
[Perl] Include guard fix for nested modules from Anthony Heading (SF Patch #350).
2014-08-04: wsfulton
[C#] Merge patch #200 from gpetrou - Changed CSharp license header to include auto-generated
tag so that StyleCop ignores the files.
2014-08-04: wsfulton
[Java] Merge patch #198 from Yuval Kashtan - Support for java.nio.ByteBuffer mapping to
unsigned char * in various.i in NIOBUFFER typemaps.
2014-07-14: ianlancetaylor
[Go] Change struct definition to use void *, not uint8, so
that the type is recorded as possibly containing
pointers. This ensures that the 1.3 garbage collector
does not collect pointers passed to C++ code.
2014-07-01: wsfulton
Fix SF Bug #1375 - Expansion of the $parentclassname special variable incorrectly contains
brackets in the expanded name.
Version 3.0.2 (4 Jun 2014)
==========================
2014-06-02: v-for-vandal
[Lua] Pull request #176:
If class has no __eq implemented, then default __eq is generated.
Default __eq compares actual pointers stored inside Lua userdata.
2014-06-02: vkalinin
Fix #183 - %extend and unnamed nested structs
2014-05-28: kwwette
Fix install failure when using an 'out of source' build using the shipped
tarball - regression introduced in swig-3.0.1.
2014-05-24: kwwette
[Octave] Remove deprecated -global/-noglobal command-line arguments
*** POTENTIAL INCOMPATIBILITY ***
Version 3.0.1 (27 May 2014) Version 3.0.1 (27 May 2014)
=========================== ===========================
@ -20,7 +214,7 @@ Version 3.0.1 (27 May 2014)
symbol comprising the outer structure name and unnamed variable instance name. symbol comprising the outer structure name and unnamed variable instance name.
2014-05-15: kwwette 2014-05-15: kwwette
Add #166 - 'make check' now works out of source. This required te examples to build Add #166 - 'make check' now works out of source. This required the examples to build
out of source. The main languages have been tested - C#, Go, Guile, Java, Javascript, out of source. The main languages have been tested - C#, Go, Guile, Java, Javascript,
Lua, Octave, Perl, PHP, Python, Ruby and Tcl. Lua, Octave, Perl, PHP, Python, Ruby and Tcl.
@ -1001,13 +1195,13 @@ Version 2.0.9 (16 December 2012)
2012-10-11: wsfulton 2012-10-11: wsfulton
Most of the special variables available for use in %exception are now also available for expansion in Most of the special variables available for use in %exception are now also available for expansion in
%extend blocks. These are: $name $symname $overname $decl $fulldecl $parentname $parentsymname, see docs %extend blocks. These are: $name $symname $overname $decl $fulldecl $parentclassname $parentclasssymname, see docs
on "Class extension" in SWIGPlus.html. Patch based on submission from Kris Thielemans. on "Class extension" in SWIGPlus.html. Patch based on submission from Kris Thielemans.
2012-10-10: wsfulton 2012-10-10: wsfulton
Additional new special variables in %exception are expanded as follows: Additional new special variables in %exception are expanded as follows:
$parentname - The parent class name (if any) for a method. $parentclassname - The parent class name (if any) for a method.
$parentsymname - The target language parent class name (if any) for a method. $parentclasssymname - The target language parent class name (if any) for a method.
2012-10-08: iant 2012-10-08: iant
[Go] Generating Go code now requires using the -intgosize option to [Go] Generating Go code now requires using the -intgosize option to
@ -1602,7 +1796,7 @@ Version 2.0.5 (19 April 2012)
-tmsearch and -tmused. -tmsearch and -tmused.
2011-08-26: wsfulton 2011-08-26: wsfulton
[C#, D] Fix %callback which was generating uncompileable code. [C#, D] Fix %callback which was generating uncompilable code.
2011-08-25: wsfulton 2011-08-25: wsfulton
Fix constructors in named typedef class declarations as reported by Gregory Bronner: Fix constructors in named typedef class declarations as reported by Gregory Bronner:
@ -1841,7 +2035,7 @@ Version 2.0.4 (21 May 2011)
PySlice_GetIndices, which changed signatures in python3.2. PySlice_GetIndices, which changed signatures in python3.2.
2011-04-07: wsfulton 2011-04-07: wsfulton
Fix wrapping of const array typedefs which were generating uncompileable code as Fix wrapping of const array typedefs which were generating uncompilable code as
reported by Karl Wette. reported by Karl Wette.
2011-04-03: szager 2011-04-03: szager
@ -2068,8 +2262,8 @@ Version 2.0.2 (20 February 2011)
Fix handling of multiple regex-using %renames attached to the same Fix handling of multiple regex-using %renames attached to the same
declaration. For example, now declaration. For example, now
%rename("%(regex/^Set(.*)/put\\1/)s") ""; %rename("%(regex:/^Set(.*)/put\\1/)s") "";
%rename("%(regex/^Get(.*)/get\\1/)s") ""; %rename("%(regex:/^Get(.*)/get\\1/)s") "";
works as expected whereas before only the last anonymous rename was works as expected whereas before only the last anonymous rename was
taken into account. taken into account.
@ -2279,7 +2473,7 @@ Version 2.0.1 (4 October 2010)
in this case). in this case).
2010-06-03: wsfulton 2010-06-03: wsfulton
Fix uncompileable code when %rename results in two enum items Fix uncompilable code when %rename results in two enum items
with the same name. Reported by Vadim Zeitlin. with the same name. Reported by Vadim Zeitlin.
Version 2.0.0 (2 June 2010) Version 2.0.0 (2 June 2010)
@ -2792,7 +2986,7 @@ Version 2.0.0 (2 June 2010)
Fix #2310483 - function pointer typedef within extern "C" block. Fix #2310483 - function pointer typedef within extern "C" block.
2009-11-13: wsfulton 2009-11-13: wsfulton
Fix usage of nested template classes within templated classes so that compileable code Fix usage of nested template classes within templated classes so that compilable code
is generated. is generated.
2009-11-13: olly 2009-11-13: olly
@ -2800,7 +2994,7 @@ Version 2.0.0 (2 June 2010)
wasn't being used. Patch from gverbruggen in SF#2892647. wasn't being used. Patch from gverbruggen in SF#2892647.
2009-11-12: wsfulton 2009-11-12: wsfulton
Fix usage of nested template classes so that compileable code is generated - the nested Fix usage of nested template classes so that compilable code is generated - the nested
template class is now treated like a normal nested classes, that is, as an opaque type template class is now treated like a normal nested classes, that is, as an opaque type
unless the nestedworkaround feature is used. unless the nestedworkaround feature is used.
@ -2826,7 +3020,7 @@ Version 2.0.0 (2 June 2010)
2009-11-11: wsfulton 2009-11-11: wsfulton
There were a number of C++ cases where nested classes/structs/unions were being handled There were a number of C++ cases where nested classes/structs/unions were being handled
as if C code was being parsed which would oftentimes lead to uncompileable code as an as if C code was being parsed which would oftentimes lead to uncompilable code as an
attempt was made to wrap the nested structs like it is documented for C code. Now all attempt was made to wrap the nested structs like it is documented for C code. Now all
nested structs/classes/unions are ignored in C++ mode, as was always documented. However, nested structs/classes/unions are ignored in C++ mode, as was always documented. However,
there is an improvement as usage of nested structs/classes/unions is now always treated there is an improvement as usage of nested structs/classes/unions is now always treated
@ -2838,7 +3032,7 @@ Version 2.0.0 (2 June 2010)
Fix R for -fcompact and add std_map.i Fix R for -fcompact and add std_map.i
2009-11-08: wsfulton 2009-11-08: wsfulton
Fix inconsistency for nested structs/unions/classes. Uncompileable code was being Fix inconsistency for nested structs/unions/classes. Uncompilable code was being
generated when inner struct and union declarations were used as types within the generated when inner struct and union declarations were used as types within the
inner struct. The inner struct/union is now treated as a forward declaration making the inner struct. The inner struct/union is now treated as a forward declaration making the
behaviour the same as an inner class. (C++ code), eg: behaviour the same as an inner class. (C++ code), eg:
@ -2852,7 +3046,7 @@ Version 2.0.0 (2 June 2010)
Ignored nested class/struct warnings now display the name of the ignored class/struct. Ignored nested class/struct warnings now display the name of the ignored class/struct.
2009-11-07: wsfulton 2009-11-07: wsfulton
Bug #1514681 - Fix nested template classes within a namespace generated uncompileable Bug #1514681 - Fix nested template classes within a namespace generated uncompilable
code and introduced strange side effects to other wrapper code especially code code and introduced strange side effects to other wrapper code especially code
after the nested template class. Note that nested template classes are still ignored. after the nested template class. Note that nested template classes are still ignored.
@ -2878,8 +3072,8 @@ Version 2.0.0 (2 June 2010)
and in template parameter specializations: and in template parameter specializations:
struct S {}; struct S {};
template <typename T> struct X { void a() {}; }; template <typename T> struct X { void a() {} };
template <> struct X<S> { void b() {}; }; template <> struct X<S> { void b() {} };
%template(MyTConcrete) X< ::S >; %template(MyTConcrete) X< ::S >;
plus probably some other corner case usage of ::. plus probably some other corner case usage of ::.
@ -3707,7 +3901,7 @@ Version 1.3.36 (24 June 2008)
06/19/2008: wsfulton 06/19/2008: wsfulton
[Java, C#] C# and Java keywords will be renamed instead of just issuing a warning [Java, C#] C# and Java keywords will be renamed instead of just issuing a warning
and then generating uncompileable code. Warning 314 gives the new name when a and then generating uncompilable code. Warning 314 gives the new name when a
keyword is found. keyword is found.
06/19/2008: wsfulton 06/19/2008: wsfulton
@ -4150,7 +4344,7 @@ Version 1.3.34 (27 February 2008)
11/30/2007: wsfulton 11/30/2007: wsfulton
Fix using statements using a base class method where the methods were overloaded. Fix using statements using a base class method where the methods were overloaded.
Depending on the order of the using statements and method declarations, these Depending on the order of the using statements and method declarations, these
were previously generating uncompileable wrappers, eg: were previously generating uncompilable wrappers, eg:
struct Derived : Base { struct Derived : Base {
virtual void funk(); virtual void funk();
@ -4288,7 +4482,7 @@ Version 1.3.32 (November 15, 2007)
%attributeref(Class, AttributeType, AttributeName, AccessorMethod) %attributeref(Class, AttributeType, AttributeName, AccessorMethod)
10/16/2007: olly 10/16/2007: olly
[Tcl] Fix several ocurrences of "warning: deprecated conversion [Tcl] Fix several occurrences of "warning: deprecated conversion
from string constant to 'char*'" from GCC 4.2 in generated C/C++ from string constant to 'char*'" from GCC 4.2 in generated C/C++
code. code.
@ -5238,7 +5432,7 @@ Version 1.3.30 (November 13, 2006)
10/03/2006: wsfulton 10/03/2006: wsfulton
[Ruby] Fix #1527885 - Overloaded director virtual methods sometimes produced [Ruby] Fix #1527885 - Overloaded director virtual methods sometimes produced
uncompileable code when used with the director:except feature. uncompilable code when used with the director:except feature.
10/03/2006: wsfulton 10/03/2006: wsfulton
Directors: Directors are output in the order in which they are declared in Directors: Directors are output in the order in which they are declared in
@ -9436,7 +9630,7 @@ Version 1.3.23 (November 11, 2004)
wrapper method only and not the extra overloaded methods that SWIG generates. wrapper method only and not the extra overloaded methods that SWIG generates.
For example: For example:
%feature("except") void hello(int i=0, double d=0.0); %feature("except") hello(int i=0, double d=0.0);
void hello(int i=0, double d=0.0); void hello(int i=0, double d=0.0);
will apply the feature to all three wrapper methods, that is: will apply the feature to all three wrapper methods, that is:
@ -9447,7 +9641,7 @@ Version 1.3.23 (November 11, 2004)
If the default arguments are not specified in the feature: If the default arguments are not specified in the feature:
%feature("except") void hello(int i, double d); %feature("except") hello(int i, double d);
void hello(int i=0, double d=0.0); void hello(int i=0, double d=0.0);
then the feature will only apply to this wrapper method: then the feature will only apply to this wrapper method:
@ -10822,7 +11016,7 @@ Version 1.3.22 (September 4, 2004)
... ...
} }
Previously, none of BIG, LARGE or BAR would have produced compileable code Previously, none of BIG, LARGE or BAR would have produced compilable code
when using %javaconst(1). when using %javaconst(1).
06/27/2004: wsfulton 06/27/2004: wsfulton
@ -20214,13 +20408,13 @@ Version 1.3.6 (July 9, 2001)
class TestClass class TestClass
{ {
public: public:
TestClass() {}; TestClass() {}
TestClass(int a) {}; TestClass(int a) {}
~TestClass() {}; ~TestClass() {}
unsigned long xyz(short k) {}; unsigned long xyz(short k) {}
unsigned long xyz(int n) {}; unsigned long xyz(int n) {}
static void static_func() {}; static void static_func() {}
static void static_func(int a) {}; static void static_func(int a) {}
}; };
void delete_TestClass(int a); void delete_TestClass(int a);

View file

@ -2,22 +2,20 @@ Below are the changes for the current release.
See the CHANGES file for changes in older releases. See the CHANGES file for changes in older releases.
See the RELEASENOTES file for a summary of changes in each release. See the RELEASENOTES file for a summary of changes in each release.
Version 3.0.2 (4 Jun 2014) Version 3.0.5 (in progress)
=========================== ===========================
2014-06-02: v-for-vandal 2015-01-23: olly
[Lua] Pull request #176: [PHP] When wrapping a returned resource as an object, check if all
If class has no __eq implemented, then default __eq is generated. cases wrap it in the same class, and if so eliminate the pointless
Default __eq compares actual pointers stored inside Lua userdata. switch statement wrapper we previously generated.
2014-06-02: vkalinin 2015-01-22: wsfulton
Fix #183 - %extend and unnamed nested structs [Octave] Merge patch #297 for SF bug #1277 - Octave shared_ptr support
2014-05-28: kwwette 2015-01-15: wsfulton
Fix install failure when using an 'out of source' build using the shipped [Python] Merge patch #250 - Fixes for using %constant and objects (non-primitive types)
tarball - regression introduced in swig-3.0.1.
2014-05-24: kwwette 2015-01-15: wsfulton
[Octave] Remove deprecated -global/-noglobal command-line arguments [C# Go] Merge patch #308 and fix #307 - C++11 strongly typed enum support
in directors
*** POTENTIAL INCOMPATIBILITY ***

View file

@ -56,7 +56,7 @@ Add the SDK tools and NDK tools to your path and create a directory somewhere fo
<pre> <pre>
$ export PATH=$HOME/android/android-sdk-linux_x86/tools:$HOME/android/android-sdk-linux_x86/platform-tools:$HOME/android/android-ndk-r6b:$PATH $ export PATH=$HOME/android/android-sdk-linux_x86/tools:$HOME/android/android-sdk-linux_x86/platform-tools:$HOME/android/android-ndk-r6b:$PATH
$ mkdir AndroidApps $ mkdir AndroidApps
$ cd AnrdoidApps $ cd AndroidApps
</pre> </pre>
</div> </div>

View file

@ -495,59 +495,59 @@ struct DerivedStruct : BaseStruct {
<H3><a name="CPlusPlus11_strongly_typed_enumerations"></a>7.2.13 Strongly typed enumerations</H3> <H3><a name="CPlusPlus11_strongly_typed_enumerations"></a>7.2.13 Strongly typed enumerations</H3>
<p>SWIG parses the new <tt>enum class</tt> syntax and forward declarator for the enums:</p> <p>SWIG supports strongly typed enumerations and parses the new <tt>enum class</tt> syntax and forward declarator for the enums, such as:</p>
<div class="code"><pre> <div class="code"><pre>
enum class MyEnum : unsigned int; enum class MyEnum : unsigned int;
</pre></div> </pre></div>
<p>The strongly typed enumerations are treated the same as the ordinary and anonymous enums. <p>
This is because the required nested class support in SWIG is new and has not yet been incorporated into the wrapping of these strongly typed enum classes. Strongly typed enums are often used to avoid name clashes such as the following:
This is usually not a problem, however, </p>
there may be some name clashes. For example, the following code:</p>
<div class="code"><pre> <div class="code"><pre>
class Color { struct Color {
enum class PrintingColors : unsigned int { enum class RainbowColors : unsigned int {
Cyan, Magenta, Yellow, Black Red, Orange, Yellow, Green, Blue, Indigo, Violet
}; };
enum class BasicColors { enum class WarmColors {
Red, Green, Blue Yellow, Orange, Red
}; };
enum class AllColors {
// produces warnings because of duplicate names
Yellow, Orange, Red, Magenta, Blue, Cyan, Green, Pink, Black, White
};
};
</pre></div>
<p>A workaround is to write these as a series of separate classes containing anonymous enums:</p> // Note normal enum
enum PrimeColors {
<div class="code"><pre> Red=100, Green, Blue
class PrintingColors {
enum : unsigned int {
Cyan, Magenta, Yellow, Black
};
};
class BasicColors {
enum : unsigned int {
Red, Green, Blue
};
};
class AllColors {
enum : unsigned int {
Yellow, Orange, Red, Magenta, Blue, Cyan, Green, Pink, Black, White
}; };
}; };
</pre></div> </pre></div>
<p> <p>
Expect to see this improved in a future version of SWIG. There are various ways that the target languages handle enums, so it is not possible to precisely state how they are handled in this section.
However, generally, most scripting languages mangle in the strongly typed enumeration's class name,
but do not use any additional mangling for normal enumerations. For example, in Python, the following code
</p> </p>
<div class="targetlang"><pre>
print Color.RainbowColors_Red, Color.WarmColors_Red, Color.Red
</pre></div>
<p>
results in
</p>
<div class="shell"><pre>
0 2 100
</pre></div>
<p>
The strongly typed languages often wrap normal enums into an enum class and so treat normal enums and strongly typed enums the same.
The equivalent in Java is:
</p>
<div class="targetlang"><pre>
System.out.println(Color.RainbowColors.Red.swigValue() + " " + Color.WarmColors.Red.swigValue() + " " + Color.PrimeColors.Red.swigValue());
</pre></div>
<H3><a name="CPlusPlus11_double_angle_brackets"></a>7.2.14 Double angle brackets</H3> <H3><a name="CPlusPlus11_double_angle_brackets"></a>7.2.14 Double angle brackets</H3>
@ -611,6 +611,7 @@ The following is an example of an alias template:
<div class="code"><pre> <div class="code"><pre>
template&lt; typename T1, typename T2, int &gt; template&lt; typename T1, typename T2, int &gt;
class SomeType { class SomeType {
public:
T1 a; T1 a;
T2 b; T2 b;
int c; int c;

View file

@ -1075,6 +1075,7 @@ try {
$action $action
} catch (std::out_of_range e) { } catch (std::out_of_range e) {
SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, e.what()); SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, e.what());
return $null;
} }
%} %}

View file

@ -841,6 +841,7 @@
<div class="sectiontoc"> <div class="sectiontoc">
<ul> <ul>
<li><a href="Go.html#Go_overview">Overview</a> <li><a href="Go.html#Go_overview">Overview</a>
<li><a href="Go.html#Go_examples">Examples</a>
<li><a href="Go.html#Go_running_swig">Running SWIG with Go</a> <li><a href="Go.html#Go_running_swig">Running SWIG with Go</a>
<ul> <ul>
<li><a href="Go.html#Go_commandline">Additional Commandline Options</a> <li><a href="Go.html#Go_commandline">Additional Commandline Options</a>
@ -854,6 +855,7 @@
<li><a href="Go.html#Go_enumerations">Go Enumerations</a> <li><a href="Go.html#Go_enumerations">Go Enumerations</a>
<li><a href="Go.html#Go_classes">Go Classes</a> <li><a href="Go.html#Go_classes">Go Classes</a>
<ul> <ul>
<li><a href="Go.html#Go_class_memory">Go Class Memory Management</a>
<li><a href="Go.html#Go_class_inheritance">Go Class Inheritance</a> <li><a href="Go.html#Go_class_inheritance">Go Class Inheritance</a>
</ul> </ul>
<li><a href="Go.html#Go_templates">Go Templates</a> <li><a href="Go.html#Go_templates">Go Templates</a>
@ -861,6 +863,7 @@
<li><a href="Go.html#Go_primitive_type_mappings">Default Go primitive type mappings</a> <li><a href="Go.html#Go_primitive_type_mappings">Default Go primitive type mappings</a>
<li><a href="Go.html#Go_output_arguments">Output arguments</a> <li><a href="Go.html#Go_output_arguments">Output arguments</a>
<li><a href="Go.html#Go_adding_additional_code">Adding additional go code</a> <li><a href="Go.html#Go_adding_additional_code">Adding additional go code</a>
<li><a href="Go.html#Go_typemaps">Go typemaps</a>
</ul> </ul>
</ul> </ul>
</div> </div>
@ -1415,6 +1418,7 @@
<li><a href="Php.html#Php_nn2_6_2">Constructors and Destructors</a> <li><a href="Php.html#Php_nn2_6_2">Constructors and Destructors</a>
<li><a href="Php.html#Php_nn2_6_3">Static Member Variables</a> <li><a href="Php.html#Php_nn2_6_3">Static Member Variables</a>
<li><a href="Php.html#Php_nn2_6_4">Static Member Functions</a> <li><a href="Php.html#Php_nn2_6_4">Static Member Functions</a>
<li><a href="Php.html#Php_nn2_6_5">Specifying Implemented Interfaces</a>
</ul> </ul>
<li><a href="Php.html#Php_nn2_7">PHP Pragmas, Startup and Shutdown code</a> <li><a href="Php.html#Php_nn2_7">PHP Pragmas, Startup and Shutdown code</a>
</ul> </ul>

View file

@ -485,12 +485,12 @@ variables are replaced with.
</tr> </tr>
<tr> <tr>
<td>$parentname</td> <td>$parentclassname</td>
<td>The parent class name (if any) for a method.</td> <td>The parent class name (if any) for a method.</td>
</tr> </tr>
<tr> <tr>
<td>$parentsymname</td> <td>$parentclasssymname</td>
<td>The target language parent class name (if any) for a method.</td> <td>The target language parent class name (if any) for a method.</td>
</tr> </tr>
@ -547,7 +547,7 @@ Below shows the expansions for the 1st of the overloaded <tt>something</tt> wrap
The <tt>exception.i</tt> library file provides support for creating The <tt>exception.i</tt> library file provides support for creating
language independent exceptions in your interfaces. To use it, simply language independent exceptions in your interfaces. To use it, simply
put an "<tt>%include exception.i</tt>" in your interface file. This put an "<tt>%include exception.i</tt>" in your interface file. This
creates a function<tt> SWIG_exception()</tt> that can be used to raise provides a function <tt>SWIG_exception()</tt> that can be used to raise
common scripting language exceptions in a portable manner. For example :</p> common scripting language exceptions in a portable manner. For example :</p>
<div class="code"><pre> <div class="code"><pre>
@ -1082,7 +1082,7 @@ For example:
<div class="code"> <div class="code">
<pre> <pre>
%feature("except") void hello(int i=0, double d=0.0) { ... } %feature("except") hello(int i=0, double d=0.0) { ... }
void hello(int i=0, double d=0.0); void hello(int i=0, double d=0.0);
</pre> </pre>
</div> </div>
@ -1105,7 +1105,7 @@ If the default arguments are not specified in the feature:
<div class="code"> <div class="code">
<pre> <pre>
%feature("except") void hello(int i, double d) { ... } %feature("except") hello(int i, double d) { ... }
void hello(int i=0, double d=0.0); void hello(int i=0, double d=0.0);
</pre> </pre>
</div> </div>

View file

@ -10,6 +10,7 @@
<div class="sectiontoc"> <div class="sectiontoc">
<ul> <ul>
<li><a href="#Go_overview">Overview</a> <li><a href="#Go_overview">Overview</a>
<li><a href="#Go_examples">Examples</a>
<li><a href="#Go_running_swig">Running SWIG with Go</a> <li><a href="#Go_running_swig">Running SWIG with Go</a>
<ul> <ul>
<li><a href="#Go_commandline">Additional Commandline Options</a> <li><a href="#Go_commandline">Additional Commandline Options</a>
@ -23,6 +24,7 @@
<li><a href="#Go_enumerations">Go Enumerations</a> <li><a href="#Go_enumerations">Go Enumerations</a>
<li><a href="#Go_classes">Go Classes</a> <li><a href="#Go_classes">Go Classes</a>
<ul> <ul>
<li><a href="#Go_class_memory">Go Class Memory Management</a>
<li><a href="#Go_class_inheritance">Go Class Inheritance</a> <li><a href="#Go_class_inheritance">Go Class Inheritance</a>
</ul> </ul>
<li><a href="#Go_templates">Go Templates</a> <li><a href="#Go_templates">Go Templates</a>
@ -30,6 +32,7 @@
<li><a href="#Go_primitive_type_mappings">Default Go primitive type mappings</a> <li><a href="#Go_primitive_type_mappings">Default Go primitive type mappings</a>
<li><a href="#Go_output_arguments">Output arguments</a> <li><a href="#Go_output_arguments">Output arguments</a>
<li><a href="#Go_adding_additional_code">Adding additional go code</a> <li><a href="#Go_adding_additional_code">Adding additional go code</a>
<li><a href="#Go_typemaps">Go typemaps</a>
</ul> </ul>
</ul> </ul>
</div> </div>
@ -67,7 +70,22 @@ checking and runtime library are not used with Go. This should be
borne in mind when reading the rest of the SWIG documentation. borne in mind when reading the rest of the SWIG documentation.
</p> </p>
<H2><a name="Go_running_swig"></a>23.2 Running SWIG with Go</H2> <H2><a name="Go_examples"></a>23.2 Examples</H2>
<p>
Working examples can be found here:
</p>
<ul>
<li><a href="https://golang.org/misc/swig">Examples from the Go source tree</a>
<li><a href="https://github.com/swig/swig/tree/master/Examples/go">Examples from the SWIG source tree</a>
</ul>
<p>
The examples in the 2nd link are shipped with the SWIG distribution under the Examples/go directory.
</p>
<H2><a name="Go_running_swig"></a>23.3 Running SWIG with Go</H2>
<p> <p>
@ -76,7 +94,7 @@ default SWIG will generate code for the gc compilers. To generate
code for gccgo, you should also use the <tt>-gccgo</tt> option. code for gccgo, you should also use the <tt>-gccgo</tt> option.
</p> </p>
<H3><a name="Go_commandline"></a>23.2.1 Additional Commandline Options</H3> <H3><a name="Go_commandline"></a>23.3.1 Additional Commandline Options</H3>
<p> <p>
@ -150,7 +168,7 @@ swig -go -help
</table> </table>
<H3><a name="Go_outputs"></a>23.2.2 Go Output Files</H3> <H3><a name="Go_outputs"></a>23.3.2 Go Output Files</H3>
<p> When generating Go code, SWIG will generate the following <p> When generating Go code, SWIG will generate the following
@ -226,7 +244,7 @@ this:
% go tool 6l main.6 % go tool 6l main.6
</pre></div> </pre></div>
<H2><a name="Go_basic_tour"></a>23.3 A tour of basic C/C++ wrapping</H2> <H2><a name="Go_basic_tour"></a>23.4 A tour of basic C/C++ wrapping</H2>
<p> <p>
@ -236,7 +254,7 @@ modifications have to occur. This section briefly covers the
essential aspects of this wrapping. essential aspects of this wrapping.
</p> </p>
<H3><a name="Go_package"></a>23.3.1 Go Package Name</H3> <H3><a name="Go_package"></a>23.4.1 Go Package Name</H3>
<p> <p>
@ -246,7 +264,7 @@ directive. You may override this by using SWIG's <tt>-package</tt>
command line option. command line option.
</p> </p>
<H3><a name="Go_names"></a>23.3.2 Go Names</H3> <H3><a name="Go_names"></a>23.4.2 Go Names</H3>
<p> <p>
@ -278,7 +296,7 @@ followed by that name, and the destructor will be
named <tt>Delete</tt> followed by that name. named <tt>Delete</tt> followed by that name.
</p> </p>
<H3><a name="Go_constants"></a>23.3.3 Go Constants</H3> <H3><a name="Go_constants"></a>23.4.3 Go Constants</H3>
<p> <p>
@ -286,7 +304,7 @@ C/C++ constants created via <tt>#define</tt> or the <tt>%constant</tt>
directive become Go constants, declared with a <tt>const</tt> directive become Go constants, declared with a <tt>const</tt>
declaration. declaration.
<H3><a name="Go_enumerations"></a>23.3.4 Go Enumerations</H3> <H3><a name="Go_enumerations"></a>23.4.4 Go Enumerations</H3>
<p> <p>
@ -296,7 +314,7 @@ usual). The values of the enumeration will become variables in Go;
code should avoid modifying those variables. code should avoid modifying those variables.
</p> </p>
<H3><a name="Go_classes"></a>23.3.5 Go Classes</H3> <H3><a name="Go_classes"></a>23.4.5 Go Classes</H3>
<p> <p>
@ -374,7 +392,43 @@ returns a go interface. If the returned pointer can be null, you can check
for this by calling the Swigcptr() method. for this by calling the Swigcptr() method.
</p> </p>
<H4><a name="Go_class_inheritance"></a>23.3.5.1 Go Class Inheritance</H4> <H4><a name="Go_class_memory"></a>23.4.5.1 Go Class Memory Management</H4>
<p>
Calling <tt>NewClassName</tt> for some C++ class <tt>ClassName</tt>
will allocate memory using the C++ memory allocator. This memory will
not be automatically freed by Go's garbage collector as the object ownership is
not tracked. When you are done with the C++ object you must free it manually
using <tt>DeleteClassName</tt>.
</p>
<p>
A common technique is to store the C++ object into a Go object, and
use the Go function <tt>runtime.SetFinalizer</tt> to free the C++ object when
the Go object is freed. It is strongly recommended to read the
<a href="https://golang.org/pkg/runtime/#SetFinalizer">runtime.SetFinalizer</a>
documentation before using this technique to understand its limitations.
For example, if the SWIG package is imported as "wrap":
</p>
<div class="code">
<pre>
type GoClassName struct {
w wrap.ClassName
}
func NewGoClassName() *GoClassName {
r := &amp;GoClassName{wrap.NewClassName()}
runtime.SetFinalizer(r,
func(r *GoClassName) {
wrap.DeleteClassName(r.w)
})
return r
}
</pre>
</div>
<H4><a name="Go_class_inheritance"></a>23.4.5.2 Go Class Inheritance</H4>
<p> <p>
@ -386,7 +440,7 @@ Doing the reverse will require an explicit type assertion, which will
be checked dynamically. be checked dynamically.
</p> </p>
<H3><a name="Go_templates"></a>23.3.6 Go Templates</H3> <H3><a name="Go_templates"></a>23.4.6 Go Templates</H3>
<p> <p>
@ -394,7 +448,7 @@ In order to use C++ templates in Go, you must tell SWIG to create
wrappers for a particular template instantation. To do this, use wrappers for a particular template instantation. To do this, use
the <tt>%template</tt> directive. the <tt>%template</tt> directive.
<H3><a name="Go_director_classes"></a>23.3.7 Go Director Classes</H3> <H3><a name="Go_director_classes"></a>23.4.7 Go Director Classes</H3>
<p> <p>
@ -437,7 +491,7 @@ method defined in Go. The Go code may of course call other methods on
itself, and those methods may be defined either in Go or in C++. itself, and those methods may be defined either in Go or in C++.
</p> </p>
<H3><a name="Go_primitive_type_mappings"></a>23.3.8 Default Go primitive type mappings</H3> <H3><a name="Go_primitive_type_mappings"></a>23.4.8 Default Go primitive type mappings</H3>
<p> <p>
@ -544,7 +598,7 @@ that typemap, or add new values, to control how C/C++ types are mapped
into Go types. into Go types.
</p> </p>
<H3><a name="Go_output_arguments"></a>23.3.9 Output arguments</H3> <H3><a name="Go_output_arguments"></a>23.4.9 Output arguments</H3>
<p>Because of limitations in the way output arguments are processed in swig, <p>Because of limitations in the way output arguments are processed in swig,
@ -597,7 +651,7 @@ void f(char *output);
</pre> </pre>
</div> </div>
<H3><a name="Go_adding_additional_code"></a>23.3.10 Adding additional go code</H3> <H3><a name="Go_adding_additional_code"></a>23.4.10 Adding additional go code</H3>
<p>Often the APIs generated by swig are not very natural in go, especially if <p>Often the APIs generated by swig are not very natural in go, especially if
@ -692,5 +746,144 @@ func bar() {
</pre> </pre>
</div> </div>
<H3><a name="Go_typemaps"></a>23.4.11 Go typemaps</H3>
<p>
You can use the <tt>%typemap</tt> directive to modify SWIG's default
wrapping behavior for specific C/C++ types. You need to be familiar
with the material in the general
"<a href="Typemaps.html#Typemaps">Typemaps</a>" chapter. That chapter
explains how to define a typemap. This section describes some
specific typemaps used for Go.
</p>
<p>
In general type conversion code may be written either in C/C++ or in
Go. The choice to make normally depends on where memory should be
allocated. To allocate memory controlled by the Go garbage collector,
write Go code. To allocate memory in the C/C++ heap, write C code.
</p>
<table BORDER summary="Go Typemaps">
<tr>
<td><b>Typemap</b></td>
<td><b>Description</b></td>
</tr>
<tr>
<td>gotype</td>
<td>
The Go type to use for a C++ type. This type will appear in the
generated Go wrapper function. If this is not defined SWIG will use a
default as <a href="#Go_primitive_type_mappings">described above</a>.
</td>
</tr>
<tr>
<td>imtype</td>
<td>
An intermediate Go type used by the "goin", "goout", "godirectorin",
and "godirectorout" typemaps. If this typemap is not defined for a
C/C++ type, the gotype typemape will be used. This is useful when
gotype is best converted to C/C++ using Go code.
</td>
</tr>
<tr>
<td>goin</td>
<td>
Go code to convert from gotype to imtype when calling a C/C++
function. SWIG will then internally convert imtype to a C/C++ type
and pass it down. If this is not defined no conversion is done.
</td>
</tr>
<tr>
<td>in</td>
<td>
C/C++ code to convert the internally generated C/C++ type, based on
imtype, into the C/C++ type that a function call expects. If this is
not defined the value will simply be cast to the desired type.
</td>
</tr>
<tr>
<td>out</td>
<td>
C/C++ code to convert the C/C++ type that a function call returns into
the internally generated C/C++ type, based on imtype, that will be
returned to Go. If this is not defined the value will simply be cast
to the desired type.
</td>
</tr>
<tr>
<td>goout</td>
<td>
Go code to convert a value returned from a C/C++ function from imtype
to gotype. If this is not defined no conversion is done.
</td>
</tr>
<tr>
<td>argout</td>
<td>
C/C++ code to adjust an argument value when returning from a function.
This is called after the real C/C++ function has run. This uses the
internally generated C/C++ type, based on imtype. This is only useful
for a pointer type of some sort. If this is not defined nothing will
be done.
</td>
</tr>
<tr>
<td>goargout</td>
<td>
Go code to adjust an argument value when returning from a function.
This is called after the real C/C++ function has run. The value will
be in imtype. This is only useful for a pointer type of some sort.
If this is not defined nothing will be done.
</td>
</tr>
<tr>
<td>directorin</td>
<td>
C/C++ code to convert the C/C++ type used to call a director method
into the internally generated C/C++ type, based on imtype, that will
be passed to Go. If this is not defined the value will simply be cast
to the desired type.
</td>
</tr>
<tr>
<td>godirectorin</td>
<td>
Go code to convert a value used to call a director method from imtype
to gotype. If this is not defined no conversion is done.
</td>
</tr>
<tr>
<td>godirectorout</td>
<td>
Go code to convert a value returned from a director method from gotype
to imtype. If this is not defined no conversion is done.
</td>
</tr>
<tr>
<td>directorout</td>
<td>
C/C++ code to convert a value returned from a director method from the
internally generated C/C++ type, based on imtype, into the type that
the method should return If this is not defined the value will simply
be cast to the desired type.
</td>
</tr>
</table>
</body> </body>
</html> </html>

View file

@ -358,7 +358,7 @@ more aggressive from gcc-4.0 onwards and will result in code that fails with str
<p> <p>
The name of the shared library output file is important. The name of the shared library output file is important.
If the name of your SWIG module is "<tt>example</tt>", the name of the corresponding shared library file should be "<tt>libexample.so</tt>" (or equivalent depending on your machine, see <a href="#Java_dynamic_linking_problems">Dynamic linking problems</a> for more information). If the name of your SWIG module is "<tt>example</tt>", the name of the corresponding shared library file should be "<tt>libexample.so</tt>" (or equivalent depending on your machine, see <a href="#Java_dynamic_linking_problems">Dynamic linking problems</a> for more information).
The name of the module is specified using the <tt>%module</tt> directive or<tt> -module</tt> command line option.</p> The name of the module is specified using the <tt>%module</tt> directive or <tt>-module</tt> command line option.</p>
<H3><a name="Java_using_module"></a>25.2.5 Using your module</H3> <H3><a name="Java_using_module"></a>25.2.5 Using your module</H3>
@ -2441,7 +2441,7 @@ It also contains all the methods in the C++ class it is proxying plus getters an
member variables. These functions call the native methods in the intermediary JNI class. member variables. These functions call the native methods in the intermediary JNI class.
The advantage of having this extra layer is the type safety that the proxy class functions offer. The advantage of having this extra layer is the type safety that the proxy class functions offer.
It adds static type checking which leads to fewer surprises at runtime. It adds static type checking which leads to fewer surprises at runtime.
For example, you can see that if you attempt to use the <tt> spam() </tt> For example, you can see that if you attempt to use the <tt>spam()</tt>
function it will only compile when the parameters passed are an <tt>int</tt> and a <tt>Foo</tt>. function it will only compile when the parameters passed are an <tt>int</tt> and a <tt>Foo</tt>.
From a user's point of view, it makes the class work as if it were a Java class: From a user's point of view, it makes the class work as if it were a Java class:
</p> </p>
@ -4173,8 +4173,8 @@ void *malloc(size_t nbytes);
<p> <p>
If no declaration name is given to <tt>%exception</tt>, it is applied to all wrapper functions. If no declaration name is given to <tt>%exception</tt>, it is applied to all wrapper functions.
The <tt> $action </tt> is a SWIG special variable and is replaced by the C/C++ function call being wrapped. The <tt>$action</tt> is a SWIG special variable and is replaced by the C/C++ function call being wrapped.
The <tt> return $null; </tt> handles all native method return types, namely those that have a void return and those that do not. The <tt>return $null;</tt> handles all native method return types, namely those that have a void return and those that do not.
This is useful for typemaps that will be used in native method returning all return types. This is useful for typemaps that will be used in native method returning all return types.
See the section on See the section on
<a href="#Java_special_variables">Java special variables</a> for further explanation. <a href="#Java_special_variables">Java special variables</a> for further explanation.
@ -5490,6 +5490,15 @@ These are listed below:
<td>Use for mapping NULL terminated arrays of C strings to Java String arrays</td> <td>Use for mapping NULL terminated arrays of C strings to Java String arrays</td>
</tr> </tr>
<tr>
<td>unsigned char *</td>
<td>NIOBUFFER</td>
<td>various.i</td>
<td>input<br> output</td>
<td>java.nio.Buffer</td>
<td>Use for mapping directly allocated buffers to c/c++. useful with directors and long lived memory objects</td>
</tr>
</table> </table>
<H3><a name="Java_typemap_attributes"></a>25.9.6 Java typemap attributes</H3> <H3><a name="Java_typemap_attributes"></a>25.9.6 Java typemap attributes</H3>
@ -5570,7 +5579,7 @@ This special variable is usually used for making calls to a function in the inte
</p> </p>
<p> <p>
<b><tt>$null </tt></b><br> <b><tt>$null</tt></b><br>
Used in input typemaps to return early from JNI functions that have either void or a non-void return type. Example: Used in input typemaps to return early from JNI functions that have either void or a non-void return type. Example:
</p> </p>

View file

@ -88,6 +88,12 @@ $ swig -javascript -jsc example.i</pre>
<pre> <pre>
$ swig -c++ -javascript -jsc example.i</pre> $ swig -c++ -javascript -jsc example.i</pre>
</div> </div>
<p>The V8 code that SWIG generates should work with most versions from 3.11.10 up to 3.29.14 and later.</p>
<p>Specify the V8 version when running SWIG (e.g. 3.25.30)</p>
<div class="shell">
<pre>
$ swig -c++ -javascript -v8 -DV8_VERSION=0x032530 example.i</pre>
</div>
<p>This creates a C/C++ source file <code>example_wrap.c</code> or <code>example_wrap.cxx</code>. The generated C source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module.</p> <p>This creates a C/C++ source file <code>example_wrap.c</code> or <code>example_wrap.cxx</code>. The generated C source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module.</p>
<p>The name of the wrapper file is derived from the name of the input file. For example, if the input file is <code>example.i</code>, the name of the wrapper file is <code>example_wrap.c</code>. To change this, you can use the -o option. The wrapped module will export one function which must be called to register the module with the Javascript interpreter. For example, if your module is named <code>example</code> the corresponding initializer for JavascriptCore would be</p> <p>The name of the wrapper file is derived from the name of the input file. For example, if the input file is <code>example.i</code>, the name of the wrapper file is <code>example_wrap.c</code>. To change this, you can use the -o option. The wrapped module will export one function which must be called to register the module with the Javascript interpreter. For example, if your module is named <code>example</code> the corresponding initializer for JavascriptCore would be</p>
<div class="code"> <div class="code">
@ -129,6 +135,11 @@ $ make check-javascript-examples ENGINE=jsc</pre>
<pre> <pre>
$ make check-javascript-test-suite ENGINE=jsc</pre> $ make check-javascript-test-suite ENGINE=jsc</pre>
</div> </div>
<p>You can specify a specific <code>V8</code> version for running the examples and tests</p>
<div class="shell">
<pre>
$ make check-javascript-examples V8_VERSION=0x032530 ENGINE=v8</pre>
</div>
<H3><a name="Javascript_known_issues"></a>26.2.3 Known Issues</H3> <H3><a name="Javascript_known_issues"></a>26.2.3 Known Issues</H3>
@ -184,7 +195,7 @@ $ sudo npm install -g node-gyp</pre>
<p>First create the wrapper using SWIG:</p> <p>First create the wrapper using SWIG:</p>
<div class="shell"> <div class="shell">
<pre> <pre>
$ swig -javascript -node -c++ example.cxx</pre> $ swig -javascript -node -c++ example.i</pre>
</div> </div>
<p>Then run <code>node-gyp</code></p> <p>Then run <code>node-gyp</code></p>
<div class="shell"> <div class="shell">
@ -342,8 +353,8 @@ It has some extras to configure <code>node-webkit</code>. See the <a href="https
<div class="code"> <div class="code">
<pre> <pre>
{ {
"name": "example" "name": "example",
"main": "app.html" "main": "app.html",
"window": { "window": {
"show": true, "show": true,
"width": 800, "width": 800,
@ -446,7 +457,7 @@ var x = 42;
var y = 105; var y = 105;
var g = example.gcd(x,y); var g = example.gcd(x,y);
// Accessing the globak variable // Accessing the global variable
var f = example.Foo; var f = example.Foo;
example.Foo = 3.1415926;</pre> example.Foo = 3.1415926;</pre>
</div> </div>
@ -467,7 +478,7 @@ public:
} }
virtual ~Shape() { virtual ~Shape() {
nshapes--; nshapes--;
}; }
double x, y; double x, y;
void move(double dx, double dy); void move(double dx, double dy);
virtual double area(void) = 0; virtual double area(void) = 0;
@ -479,7 +490,7 @@ class Circle : public Shape {
private: private:
double radius; double radius;
public: public:
Circle(double r) : radius(r) { }; Circle(double r) : radius(r) { }
virtual double area(void); virtual double area(void);
virtual double perimeter(void); virtual double perimeter(void);
}; };
@ -488,7 +499,7 @@ class Square : public Shape {
private: private:
double width; double width;
public: public:
Square(double w) : width(w) { }; Square(double w) : width(w) { }
virtual double area(void); virtual double area(void);
virtual double perimeter(void); virtual double perimeter(void);
};</pre> };</pre>
@ -765,7 +776,7 @@ class JSEmitter {
*/ */
virtual int exitClass(Node *) { virtual int exitClass(Node *) {
return SWIG_OK; return SWIG_OK;
}; }
/** /**
* Invoked at the beginning of the variableHandler. * Invoked at the beginning of the variableHandler.
@ -777,7 +788,7 @@ class JSEmitter {
*/ */
virtual int exitVariable(Node *) { virtual int exitVariable(Node *) {
return SWIG_OK; return SWIG_OK;
}; }
/** /**
* Invoked at the beginning of the functionHandler. * Invoked at the beginning of the functionHandler.
@ -789,7 +800,7 @@ class JSEmitter {
*/ */
virtual int exitFunction(Node *) { virtual int exitFunction(Node *) {
return SWIG_OK; return SWIG_OK;
}; }
/** /**
* Invoked by functionWrapper callback after call to Language::functionWrapper. * Invoked by functionWrapper callback after call to Language::functionWrapper.

View file

@ -59,8 +59,8 @@ Also, there are a dozen or so examples in the Examples/octave directory, and hun
<p> <p>
As of SWIG 3.0.0, the Octave module has been tested with Octave versions 3.0.5, 3.2.4, 3.4.3, 3.6.4, and 3.8.0. As of SWIG 3.0.3, the Octave module has been tested with Octave versions 3.2.4, 3.4.3, 3.6.4, and 3.8.1.
Use of Octave versions older than 3.x.x is not recommended, as these versions are no longer tested with SWIG. Use of older Octave versions is not recommended, as these versions are no longer tested with SWIG.
</p> </p>
<H2><a name="Octave_nn3"></a>32.2 Running SWIG</H2> <H2><a name="Octave_nn3"></a>32.2 Running SWIG</H2>

View file

@ -29,6 +29,7 @@
<li><a href="#Php_nn2_6_2">Constructors and Destructors</a> <li><a href="#Php_nn2_6_2">Constructors and Destructors</a>
<li><a href="#Php_nn2_6_3">Static Member Variables</a> <li><a href="#Php_nn2_6_3">Static Member Variables</a>
<li><a href="#Php_nn2_6_4">Static Member Functions</a> <li><a href="#Php_nn2_6_4">Static Member Functions</a>
<li><a href="#Php_nn2_6_5">Specifying Implemented Interfaces</a>
</ul> </ul>
<li><a href="#Php_nn2_7">PHP Pragmas, Startup and Shutdown code</a> <li><a href="#Php_nn2_7">PHP Pragmas, Startup and Shutdown code</a>
</ul> </ul>
@ -113,9 +114,7 @@ more detail in <a href="#Php_nn2_6">section 27.2.6</a>.
<p> <p>
The usual (and recommended) way is to build the extension as a separate The usual (and recommended) way is to build the extension as a separate
dynamically loaded module (which is supported by all modern operating dynamically loaded module (which is supported by all modern operating
systems). You can then specify that this be loaded systems).
automatically in <tt>php.ini</tt> or load it explicitly for any script which
needs it.
</p> </p>
<p> <p>
@ -137,16 +136,16 @@ least work for Linux though):
</p> </p>
<div class="code"><pre> <div class="code"><pre>
gcc `php-config --includes` -fpic -c example_wrap.c gcc `php-config --includes` -fpic -c example_wrap.c example.c
gcc -shared example_wrap.o -o example.so gcc -shared example_wrap.o example.o -o example.so
</pre></div> </pre></div>
<H3><a name="Php_nn1_3"></a>34.1.2 Using PHP Extensions</H3> <H3><a name="Php_nn1_3"></a>34.1.2 Using PHP Extensions</H3>
<p> <p>
To test the extension from a PHP script, you need to load it first. You To test the extension from a PHP script, you first need to tell PHP to
can load it for every script by adding this line to the <tt>[PHP]</tt> section of load it. To do this, add a line like this to the <tt>[PHP]</tt> section of
<tt>php.ini</tt>: <tt>php.ini</tt>:
</p> </p>
@ -155,8 +154,14 @@ can load it for every script by adding this line to the <tt>[PHP]</tt> section o
</pre></div> </pre></div>
<p> <p>
Alternatively, you can load it explicitly only for scripts which need it If the module is in PHP's default extension directory, you can omit the path.
by adding this line to the start of each such PHP script:: </p>
<p>
For some SAPIs (for example, the CLI SAPI) you can instead use the
<a href="http://php.net/manual/en/function.dl.php">dl() function</a> to load
an extension at run time, by adding a like like this to the start of each
PHP script which uses your extension:
</p> </p>
<div class="code"><pre> <div class="code"><pre>
@ -164,14 +169,25 @@ by adding this line to the start of each such PHP script::
</pre></div> </pre></div>
<p> <p>
SWIG also generates a php module, which But note that this doesn't work when running PHP through a webserver in PHP5.3
attempts to do the <tt>dl()</tt> call for you: and later - you'll need to use <tt>extension</tt> in <tt>php.ini</tt> as
described above.
</p>
<p>
The PHP module which SWIG generates will also attempt to do the <tt>dl()</tt>
call for you if the extension isn't already loaded:
</p> </p>
<div class="code"><pre> <div class="code"><pre>
include("example.php"); include("example.php");
</pre></div> </pre></div>
<p>
This PHP module also defines the PHP classes for the wrapped API, so you'll
almost certainly want to include it anyway.
</p>
<H2><a name="Php_nn2"></a>34.2 Basic PHP interface</H2> <H2><a name="Php_nn2"></a>34.2 Basic PHP interface</H2>
@ -220,9 +236,9 @@ echo "E = " . E . "\n";
<p> <p>
There's one peculiarity of how constants work in PHP which it is useful There's one peculiarity of how constants work in PHP which it is useful
to note (this is not specific to SWIG though) - if you try to use an undeclared to note (this is not specific to SWIG though) - if you try to use an undeclared
constant, PHP will issue a warning and then expand the constant to a string constant, PHP will emit a notice and then expand the constant to a string
version of the constant's name. The warning will often be missed though as version of the constant's name. Unfortunately it is easy to miss the notice
if you're using PHP in a webserver, it will probably end up in error.log or if you're using PHP in a webserver, as it will probably end up in error.log or
similar. similar.
</p> </p>
@ -756,6 +772,24 @@ Ko::threats();
</pre></div> </pre></div>
<H4><a name="Php_nn2_6_5"></a>34.2.6.5 Specifying Implemented Interfaces</H4>
<p>
PHP supports the concept of abstract interfaces which a class can implement.
Since SWIG 3.0.3, you can tell SWIG that a wrapped class (for example
<code>MyIterator</code>) implements the <code>Iterator</code> interface like
so:
</p>
<div class="code"><pre>
%typemap("phpinterfaces") MyIterator "Iterator";
</pre></div>
<p>
If there are multiple interfaces, just list them separated by commas.
</p>
<H3><a name="Php_nn2_7"></a>34.2.7 PHP Pragmas, Startup and Shutdown code</H3> <H3><a name="Php_nn2_7"></a>34.2.7 PHP Pragmas, Startup and Shutdown code</H3>

View file

@ -194,7 +194,7 @@ int fact(int n);
</div> </div>
<p> <p>
The <tt> #define SWIG_FILE_WITH_INIT </tt> line inserts a macro that specifies that the The <tt>#define SWIG_FILE_WITH_INIT</tt> line inserts a macro that specifies that the
resulting C file should be built as a python extension, inserting the module resulting C file should be built as a python extension, inserting the module
<tt>init</tt> code. This <tt>.i</tt> file wraps the following simple C file: <tt>init</tt> code. This <tt>.i</tt> file wraps the following simple C file:
</p> </p>
@ -395,7 +395,7 @@ of the module prefixed by an underscore</b>. If the name of your module is "<tt
name of the corresponding object file should be name of the corresponding object file should be
"<tt>_example.so</tt>" or "<tt>_examplemodule.so</tt>". "<tt>_example.so</tt>" or "<tt>_examplemodule.so</tt>".
The name of the module is specified using the <tt>%module</tt> directive or the The name of the module is specified using the <tt>%module</tt> directive or the
<tt> -module</tt> command line option. <tt>-module</tt> command line option.
</p> </p>
<p> <p>
@ -783,8 +783,8 @@ Building a SWIG extension to Python under Windows is roughly similar to
the process used with Unix. Using the distutils, it is essentially the process used with Unix. Using the distutils, it is essentially
identical. If you have the same version of the MS compiler that Python identical. If you have the same version of the MS compiler that Python
was built with (the python2.4 and python2.5 distributed by python.org was built with (the python2.4 and python2.5 distributed by python.org
are built with Visual Studio 2003), the standard <tt> python setup.py are built with Visual Studio 2003), the standard <tt>python setup.py
build </tt> should just work. build</tt> should just work.
</p> </p>
<p> <p>
@ -3368,6 +3368,18 @@ print("Loading", "Whizz", "Bang", sep=' ... ')
</pre> </pre>
</div> </div>
<p>When using <tt>%pythoncode</tt> and <tt>%pythonbegin</tt> you generally
want to make sure that the block is delimited by <tt>%{</tt> and <tt>%}</tt>.
If you delimit it with <tt>{</tt> and <tt>}</tt> then any lines with a
leading <tt>#</tt> will be handled by SWIG as preprocessor directives, when
you probably meant them as Python comments. Prior to SWIG 3.0.3, invalid
preprocessor directives were silently ignored, so generally using the wrong
delimiters resulted in such comments not appearing in the generated output
(though a comment starting with a valid preprocessor directive could cause
problems, for example: <tt># error handling</tt>). SWIG 3.0.3 and later report
an error for invalid preprocessor directives, so you may have to update
existing interface files to delimit blocks of Python code correctly.</p>
<p>Sometimes you may want to replace or modify the wrapper function <p>Sometimes you may want to replace or modify the wrapper function
that SWIG creates in the proxy <tt>.py</tt> file. The Python module that SWIG creates in the proxy <tt>.py</tt> file. The Python module
in SWIG provides some features that enable you to do this. First, to in SWIG provides some features that enable you to do this. First, to

View file

@ -147,7 +147,7 @@
<H2><a name="Ruby_nn2"></a>38.1 Preliminaries</H2> <H2><a name="Ruby_nn2"></a>38.1 Preliminaries</H2>
<p> SWIG 1.3 is known to work with Ruby versions 1.6 and later. <p> SWIG 3.0 is known to work with Ruby versions 1.8 and later.
Given the choice, you should use the latest stable version of Ruby. You Given the choice, you should use the latest stable version of Ruby. You
should also determine if your system supports shared libraries and should also determine if your system supports shared libraries and
dynamic loading. SWIG will work with or without dynamic loading, but dynamic loading. SWIG will work with or without dynamic loading, but
@ -191,7 +191,7 @@ header file. This file is usually contained in a directory such as </p>
<div class="code shell diagram"> <div class="code shell diagram">
<pre>/usr/lib/ruby/1.8/x86_64-linux-gnu/ruby.h <pre>/usr/lib/ruby/1.8/x86_64-linux-gnu/ruby.h
/usr/local/lib/ruby/1.6/i686-linux/ruby.h /usr/include/ruby-2.1.0/ruby.h
</pre> </pre>
</div> </div>
@ -201,8 +201,14 @@ installed, you can run Ruby to find out. For example: </p>
<div class="code shell"> <div class="code shell">
<pre>$ ruby -e 'puts $:.join("\n")' <pre>$ ruby -e 'puts $:.join("\n")'
/usr/local/lib/ruby/site_ruby/1.6 /usr/local/lib/ruby/site_ruby/1.6/i686-linux /usr/local/lib/site_ruby/2.1.0
/usr/local/lib/ruby/site_ruby /usr/local/lib/ruby/1.6 /usr/local/lib/ruby/1.6/i686-linux . /usr/local/lib/x86_64-linux-gnu/site_ruby
/usr/local/lib/site_ruby
/usr/lib/ruby/vendor_ruby/2.1.0
/usr/lib/x86_64-linux-gnu/ruby/vendor_ruby/2.1.0
/usr/lib/ruby/vendor_ruby
/usr/lib/ruby/2.1.0
/usr/lib/x86_64-linux-gnu/ruby/2.1.0
</pre> </pre>
</div> </div>
@ -260,7 +266,7 @@ operating system would look something like this: </p>
<div class="code shell"> <div class="code shell">
<pre>$ swig -ruby example.i <pre>$ swig -ruby example.i
$ gcc -O2 -fPIC -c example.c $ gcc -O2 -fPIC -c example.c
$ gcc -O2 -fPIC -c example_wrap.c -I/usr/local/lib/ruby/1.6/i686-linux $ gcc -O2 -fPIC -c example_wrap.c -I/usr/include/ruby-2.1.0
$ gcc -shared example.o example_wrap.o -o example.so $ gcc -shared example.o example_wrap.o -o example.so
</pre> </pre>
</div> </div>
@ -334,7 +340,7 @@ using the C++ compiler. For example: </p>
<pre> <pre>
$ swig -c++ -ruby example.i $ swig -c++ -ruby example.i
$ g++ -fPIC -c example.cxx $ g++ -fPIC -c example.cxx
$ g++ -fPIC -c example_wrap.cxx -I/usr/local/lib/ruby/1.6/i686-linux $ g++ -fPIC -c example_wrap.cxx -I/usr/include/ruby-2.1.0
$ g++ -shared example.o example_wrap.o -o example.so $ g++ -shared example.o example_wrap.o -o example.so
</pre> </pre>
</div> </div>
@ -685,7 +691,7 @@ For example, this struct declaration: </p>
</div> </div>
<p> gets wrapped as a <tt>Vector</tt> class, with <p> gets wrapped as a <tt>Vector</tt> class, with
Ruby instance methods <tt>x</tt>, <tt> x=</tt>, Ruby instance methods <tt>x</tt>, <tt>x=</tt>,
<tt>y</tt> and <tt>y=</tt>. These methods can <tt>y</tt> and <tt>y=</tt>. These methods can
be used to access structure data from Ruby as follows: </p> be used to access structure data from Ruby as follows: </p>
@ -1313,7 +1319,7 @@ chapter.</p>
<p>Some containers in the STL allow you to modify their default <p>Some containers in the STL allow you to modify their default
behavior by using so called functors or function objects. behavior by using so called functors or function objects.
Functors are often just a very simple struct with<tt> operator()</tt> Functors are often just a very simple struct with <tt>operator()</tt>
redefined or an actual C/C++ function. This allows you, for redefined or an actual C/C++ function. This allows you, for
example, to always keep the sort order of a STL container to your example, to always keep the sort order of a STL container to your
liking.</p> liking.</p>
@ -1327,7 +1333,7 @@ this includes <tt>std::set</tt>,
<tt>std::multiset</tt> <tt>std::multiset</tt>
and <tt>std::multimap</tt>.</p> and <tt>std::multimap</tt>.</p>
<p>The functors in swig are called<tt> swig::UnaryFunction</tt> <p>The functors in swig are called <tt>swig::UnaryFunction</tt>
and <tt>swig::BinaryFunction</tt>. and <tt>swig::BinaryFunction</tt>.
For C++ predicates (ie. functors that must return bool as a result) <tt>swig::UnaryPredicate</tt> For C++ predicates (ie. functors that must return bool as a result) <tt>swig::UnaryPredicate</tt>
@ -1380,8 +1386,8 @@ values they point at, while the non-const iterators can both read and
modify the values.</p> modify the values.</p>
<p>The Ruby STL wrappings support both type of iterators by using <p>The Ruby STL wrappings support both type of iterators by using
a proxy class in-between. This proxy class is <tt>swig::Iterator or a proxy class in-between. This proxy class is <tt>swig::Iterator</tt> or
swig::ConstIterator. </tt> Derived from them are template <tt>swig::ConstIterator</tt>. Derived from them are template
classes that need to be initialized with the actual iterator for the classes that need to be initialized with the actual iterator for the
container you are wrapping and often times with the beginning and container you are wrapping and often times with the beginning and
ending points of the iteration range.</p> ending points of the iteration range.</p>
@ -1450,7 +1456,7 @@ i
</pre> </pre>
</div> </div>
<p>If you'd rather have STL classes without any iterators, you should define<tt> -DSWIG_NO_EXPORT_ITERATOR_METHODS </tt>when running swig.</p> <p>If you'd rather have STL classes without any iterators, you should define <tt>-DSWIG_NO_EXPORT_ITERATOR_METHODS</tt> when running swig.</p>
<H3><a name="Ruby_nn24"></a>38.3.16 C++ Smart Pointers</H3> <H3><a name="Ruby_nn24"></a>38.3.16 C++ Smart Pointers</H3>
@ -2823,7 +2829,7 @@ not support optional arguments, such as Java and C#, effectively ignore
the value specified by this typemap as all arguments must be given.</p> the value specified by this typemap as all arguments must be given.</p>
<p> Once a default typemap has been applied to an argument, all <p> Once a default typemap has been applied to an argument, all
arguments that follow must have default values. See the <a href="http://www.swig.org/Doc1.3/SWIGDocumentation.html#SWIG_default_args"> arguments that follow must have default values. See the <a href="SWIG.html#SWIG_default_args">
Default/optional arguments</a> section for further information on Default/optional arguments</a> section for further information on
default argument wrapping.</p> default argument wrapping.</p>
@ -3017,7 +3023,7 @@ catch(char const *_e) {
<p> Note that if your methods do not have an exception <p> Note that if your methods do not have an exception
specification yet they do throw exceptions, SWIG cannot know how to specification yet they do throw exceptions, SWIG cannot know how to
deal with them. For a neat way to handle these, see the <a href="http://www.swig.org/Doc1.3/SWIGDocumentation.html#exception">Exception deal with them. For a neat way to handle these, see the <a href="Customization.html#Customization_exception">Exception
handling with %exception</a> section.</p> handling with %exception</a> section.</p>
<H4><a name="Ruby_directorin_typemap"></a>38.7.6.14 directorin typemap</H4> <H4><a name="Ruby_directorin_typemap"></a>38.7.6.14 directorin typemap</H4>
@ -4466,7 +4472,7 @@ and then type <tt>make</tt> to build the shared library: </p>
<pre>$ <b>ruby extconf.rb</b> <pre>$ <b>ruby extconf.rb</b>
creating Makefile creating Makefile
$ <b>make</b> $ <b>make</b>
g++ -fPIC -g -O2 -I. -I/usr/local/lib/ruby/1.7/i686-linux \ g++ -fPIC -g -O2 -I. -I/usr/include/ruby-2.1.0 \
-I. -c shape_wrap.cxx -I. -c shape_wrap.cxx
gcc -shared -L/usr/local/lib -o shape.so shape_wrap.o -L. \ gcc -shared -L/usr/local/lib -o shape.so shape_wrap.o -L. \
-lruby -lruby -lc</pre> -lruby -lruby -lc</pre>
@ -4997,7 +5003,7 @@ object from its underlying C++ object.</p>
<p>In general, you will only need to use the <tt>SWIG_RubyInstanceFor</tt>, <p>In general, you will only need to use the <tt>SWIG_RubyInstanceFor</tt>,
which is required for implementing mark functions as shown below. which is required for implementing mark functions as shown below.
However, if you implement your own free functions (see below) you may However, if you implement your own free functions (see below) you may
also have to call the<tt> SWIG_RubyRemoveTracking</tt> and <tt>RubyUnlinkObjects</tt> also have to call the <tt>SWIG_RubyRemoveTracking</tt> and <tt>RubyUnlinkObjects</tt>
methods.</p> methods.</p>
<H3><a name="Ruby_nn61"></a>38.10.4 Mark Functions</H3> <H3><a name="Ruby_nn61"></a>38.10.4 Mark Functions</H3>
@ -5351,7 +5357,7 @@ used for callbacks, for example. </p>
<p>To solve the problem, SWIG can now generate code with director <p>To solve the problem, SWIG can now generate code with director
functions containing the optional macros SWIG_INIT_STACK and functions containing the optional macros SWIG_INIT_STACK and
SWIG_RELEASE_STACK. These macros will try to force Ruby to SWIG_RELEASE_STACK. These macros will try to force Ruby to
reinitiliaze the beginning of the stack the first time a reinitialize the beginning of the stack the first time a
director director
function is called. This will lead Ruby to measure and not function is called. This will lead Ruby to measure and not
collect any VALUE objects defined from that point on. </p> collect any VALUE objects defined from that point on. </p>

View file

@ -138,6 +138,7 @@ can be obtained by typing <tt>swig -help</tt> or <tt>swig
-xml Generate XML wrappers -xml Generate XML wrappers
-c++ Enable C++ parsing -c++ Enable C++ parsing
-cppext <em>ext</em> Change file extension of C++ generated files to <em>ext</em> (default is cxx, except for PHP which uses cpp)
-D<em>symbol</em> Define a preprocessor symbol -D<em>symbol</em> Define a preprocessor symbol
-Fstandard Display error/warning messages in commonly used format -Fstandard Display error/warning messages in commonly used format
-Fmicrosoft Display error/warning messages in Microsoft format -Fmicrosoft Display error/warning messages in Microsoft format
@ -146,7 +147,7 @@ can be obtained by typing <tt>swig -help</tt> or <tt>swig
-l<em>file</em> Include a SWIG library file. -l<em>file</em> Include a SWIG library file.
-module <em>name</em> Set the name of the SWIG module -module <em>name</em> Set the name of the SWIG module
-o <em>outfile</em> Name of output file -o <em>outfile</em> Name of output file
-outcurrentdir Set default output dir to current dir instead of input file's path -outcurrentdir Set default output dir to current dir instead of input file's path
-outdir <em>dir</em> Set language specific files output directory -outdir <em>dir</em> Set language specific files output directory
-pcreversion Display PCRE version information -pcreversion Display PCRE version information
-swiglib Show location of SWIG library -swiglib Show location of SWIG library
@ -1046,7 +1047,7 @@ def filecopy(source,target):
</pre></div> </pre></div>
<p> <p>
In this case <tt>f1</tt>,<tt> f2</tt>, and <tt>buffer</tt> are all In this case <tt>f1</tt>, <tt>f2</tt>, and <tt>buffer</tt> are all
opaque objects containing C pointers. It doesn't matter what value opaque objects containing C pointers. It doesn't matter what value
they contain--our program works just fine without this knowledge.</p> they contain--our program works just fine without this knowledge.</p>
@ -1711,7 +1712,7 @@ wrapping a header file like this:
</pre></div> </pre></div>
<p> <p>
<tt>%rename </tt>applies a renaming operation to all future <tt>%rename</tt> applies a renaming operation to all future
occurrences of a name. The renaming applies to functions, variables, occurrences of a name. The renaming applies to functions, variables,
class and structure names, member functions, and member data. For class and structure names, member functions, and member data. For
example, if you had two-dozen C++ classes, all with a member function example, if you had two-dozen C++ classes, all with a member function
@ -3316,7 +3317,7 @@ Most importantly, define a type before it is used! A C compiler will tell you
if the full type information is not available if it is needed, whereas if the full type information is not available if it is needed, whereas
SWIG will usually not warn or error out as it is designed to work without SWIG will usually not warn or error out as it is designed to work without
full type information. However, if type information is not specified full type information. However, if type information is not specified
correctly, the wrappers can be sub-optimal and even result in uncompileable C/C++ code. correctly, the wrappers can be sub-optimal and even result in uncompilable C/C++ code.
<li>If your program has a main() function, you may need to rename it <li>If your program has a main() function, you may need to rename it
(read on). (read on).

View file

@ -1184,15 +1184,17 @@ public:
</div> </div>
<p> <p>
This produces uncompileable wrapper code because default values in C++ are This produces uncompilable wrapper code because default values in C++ are
evaluated in the same scope as the member function whereas SWIG evaluated in the same scope as the member function whereas SWIG
evaluates them in the scope of a wrapper function (meaning that the evaluates them in the scope of a wrapper function (meaning that the
values have to be public). values have to be public).
</p> </p>
<p> <p>
This feature is automatically turned on when wrapping <a href="SWIG.html#SWIG_default_args">C code with default arguments</a> The <tt>compactdefaultargs</tt> feature is automatically turned on when wrapping <a href="SWIG.html#SWIG_default_args">C code with default arguments</a>.
and whenever keyword arguments (kwargs) are specified for either C or C++ code. Some target languages will also automatically turn on this feature
if the keyword arguments feature (kwargs) is specified for either C or C++ functions, and the target language supports kwargs,
the <tt>compactdefaultargs</tt> feature is also automatically turned on.
Keyword arguments are a language feature of some scripting languages, for example Ruby and Python. Keyword arguments are a language feature of some scripting languages, for example Ruby and Python.
SWIG is unable to support kwargs when wrapping overloaded methods, so the default approach cannot be used. SWIG is unable to support kwargs when wrapping overloaded methods, so the default approach cannot be used.
</p> </p>
@ -1203,7 +1205,7 @@ SWIG is unable to support kwargs when wrapping overloaded methods, so the defaul
<p> <p>
SWIG wraps class members that are public following the C++ SWIG wraps class members that are public following the C++
conventions, i.e., by explicit public declaration or by the use of conventions, i.e., by explicit public declaration or by the use of
the <tt> using</tt> directive. In general, anything specified in a the <tt>using</tt> directive. In general, anything specified in a
private or protected section will be ignored, although the internal private or protected section will be ignored, although the internal
code generator sometimes looks at the contents of the private and code generator sometimes looks at the contents of the private and
protected sections so that it can properly generate code for default protected sections so that it can properly generate code for default
@ -2798,7 +2800,7 @@ public:
</pre></div> </pre></div>
<p> <p>
This code adds a<tt> __str__</tt> method to our class for producing a This code adds a <tt>__str__</tt> method to our class for producing a
string representation of the object. In Python, such a method would string representation of the object. In Python, such a method would
allow us to print the value of an object using the <tt>print</tt> allow us to print the value of an object using the <tt>print</tt>
command. command.
@ -2847,12 +2849,12 @@ struct Derived : Base {
<p> <p>
The following special variables are expanded if used within a %extend block: The following special variables are expanded if used within a %extend block:
$name, $symname, $overname, $decl, $fulldecl, $parentname and $parentsymname. $name, $symname, $overname, $decl, $fulldecl, $parentclassname and $parentclasssymname.
The <a href="Customization.html#Customization_exception_special_variables">Special variables</a> section provides more information each of these special variables. The <a href="Customization.html#Customization_exception_special_variables">Special variables</a> section provides more information each of these special variables.
</p> </p>
<p> <p>
The<tt> %extend</tt> directive follows all of the same conventions The <tt>%extend</tt> directive follows all of the same conventions
as its use with C structures. Please refer to the <a href="SWIG.html#SWIG_adding_member_functions">Adding member functions to C structures</a> as its use with C structures. Please refer to the <a href="SWIG.html#SWIG_adding_member_functions">Adding member functions to C structures</a>
section for further details. section for further details.
</p> </p>
@ -3565,7 +3567,7 @@ It is also possible to separate these declarations from the template class. For
template&lt;class T&gt; class List { template&lt;class T&gt; class List {
... ...
public: public:
List() { }; List() { }
T get(int index); T get(int index);
... ...
}; };
@ -3612,18 +3614,52 @@ and the second will take two integer arguments.
</p> </p>
<p> <p>
Needless to say, SWIG's template support provides plenty of Needless to say, SWIG's template support provides plenty of opportunities to
opportunities to break the universe. That said, an important final break the universe. That said, an important final point is that <b>SWIG does
point is that <b>SWIG does not perform extensive error checking of not perform extensive error checking of templates!</b> Specifically, SWIG does
templates!</b> Specifically, SWIG does not perform type checking nor not perform type checking nor does it check to see if the actual contents of the
does it check to see if the actual contents of the template template declaration make any sense. Since the C++ compiler checks this when it
declaration make any sense. Since the C++ compiler will hopefully compiles the resulting wrapper file, there is no practical reason for SWIG to
check this when it compiles the resulting wrapper file, there is no duplicate this functionality.
practical reason for SWIG to duplicate this functionality (besides,
none of the SWIG developers are masochistic enough to want to
implement this right now).
</p> </p>
<a name="SWIGPlus_template_nested_class_example"></a>
<p>
As SWIG's template support does not perform type checking <tt>%template</tt>
can be used as early as after a template declaration. You can, and rarely have
to, use <tt>%template</tt> before the template parameters have been declared.
For example:
</p>
<div class="code">
<pre>
template &lt;class T&gt; class OuterTemplateClass {};
// The nested class OuterClass::InnerClass inherits from the template class
// OuterTemplateClass&lt;OuterClass::InnerStruct&gt; and thus the template needs
// to be expanded with %template before the OuterClass declaration.
%template(OuterTemplateClass_OuterClass__InnerStruct)
OuterTemplateClass&lt;OuterClass::InnerStruct&gt;
// Don't forget to use %feature("flatnested") for OuterClass::InnerStruct and
// OuterClass::InnerClass if the target language doesn't support nested classes.
class OuterClass {
public:
// Forward declarations:
struct InnerStruct;
class InnerClass;
};
struct OuterClass::InnerStruct {};
// Expanding the template at this point with %template is too late as the
// OuterClass::InnerClass declaration is processed inside OuterClass.
class OuterClass::InnerClass : public OuterTemplateClass&lt;InnerStruct&gt; {};
</pre>
</div>
<p> <p>
<b>Compatibility Note</b>: The first implementation of template support relied heavily on <b>Compatibility Note</b>: The first implementation of template support relied heavily on
macro expansion in the preprocessor. Templates have been more tightly integrated into macro expansion in the preprocessor. Templates have been more tightly integrated into
@ -4998,6 +5034,12 @@ class Bar {
</pre> </pre>
</div> </div>
<p>
If a nested class, within an outer class, has to be used as a template parameter within the outer class, then the template will
have to be instantiated with <tt>%template</tt> before the beginning of the outer class.
An example can be found in the
<a href="#SWIGPlus_template_nested_class_example">Templates</a> section.
</p>
<p> <p>
<b>Compatibility Note:</b> <b>Compatibility Note:</b>

View file

@ -6,7 +6,7 @@
<body bgcolor="#ffffff"> <body bgcolor="#ffffff">
<H1><a name="Sections"></a>SWIG-3.0 Documentation</H1> <H1><a name="Sections"></a>SWIG-3.0 Documentation</H1>
Last update : SWIG-3.0.2 (4 Jun 2014) Last update : SWIG-3.0.5 (in progress)
<H2>Sections</H2> <H2>Sections</H2>

View file

@ -160,7 +160,7 @@ of the module. If the name of your SWIG module is "<tt>example</tt>", the
name of the corresponding object file should be name of the corresponding object file should be
"<tt>example.so</tt>". "<tt>example.so</tt>".
The name of the module is specified using the <tt>%module</tt> directive or the The name of the module is specified using the <tt>%module</tt> directive or the
<tt> -module</tt> command line option. <tt>-module</tt> command line option.
</p> </p>
<H3><a name="Tcl_nn5"></a>39.1.3 Static linking</H3> <H3><a name="Tcl_nn5"></a>39.1.3 Static linking</H3>
@ -504,7 +504,7 @@ name, but you can override it using the <tt>-prefix</tt> option.
</p> </p>
<p> <p>
When the<tt> -namespace</tt> option is used, objects in the module When the <tt>-namespace</tt> option is used, objects in the module
are always accessed with the namespace name such as <tt>Foo::bar</tt>. are always accessed with the namespace name such as <tt>Foo::bar</tt>.
</p> </p>
@ -1283,7 +1283,7 @@ you can use it in Tcl like this:
% x insert Lager % x insert Lager
% x get 1 % x get 1
Stout Stout
% puts [l cget -length] % puts [x cget -length]
3 3
% %
</pre></div> </pre></div>
@ -2365,7 +2365,7 @@ Tcl extension by specifying the following in an interface file :
$action // Gets substituted by actual function call $action // Gets substituted by actual function call
} }
catch (RangeError) { catch (RangeError) {
Tcl_SetStringObj(tcl_result,"Array index out-of-bounds"); Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
return TCL_ERROR; return TCL_ERROR;
} }
} }
@ -2384,7 +2384,7 @@ exception handler to only apply to specific methods like this:
$action $action
} }
catch (RangeError) { catch (RangeError) {
Tcl_SetStringObj(tcl_result,"Array index out-of-bounds"); Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
return TCL_ERROR; return TCL_ERROR;
} }
} }
@ -2394,7 +2394,7 @@ exception handler to only apply to specific methods like this:
$action $action
} }
catch (RangeError) { catch (RangeError) {
Tcl_SetStringObj(tcl_result,"Array index out-of-bounds"); Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
return TCL_ERROR; return TCL_ERROR;
} }
} }
@ -2419,7 +2419,7 @@ For example:
$action $action
} }
catch (RangeError) { catch (RangeError) {
Tcl_SetStringObj(tcl_result,"Array index out-of-bounds"); Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
return TCL_ERROR; return TCL_ERROR;
} }
} }
@ -2921,7 +2921,6 @@ int Tcl_GetDoubleFromObj(Tcl_Interp *, Tcl_Obj *o, double *dp);
<div class="code"> <div class="code">
<pre> <pre>
Tcl_Obj *Tcl_NewStringObj(char *str, int len); Tcl_Obj *Tcl_NewStringObj(char *str, int len);
void Tcl_SetStringObj(Tcl_Obj *obj, char *str, int len);
char *Tcl_GetStringFromObj(Tcl_Obj *obj, int *len); char *Tcl_GetStringFromObj(Tcl_Obj *obj, int *len);
void Tcl_AppendToObj(Tcl_Obj *obj, char *str, int len); void Tcl_AppendToObj(Tcl_Obj *obj, char *str, int len);
</pre> </pre>
@ -3037,9 +3036,10 @@ work)
<div class="code"> <div class="code">
<pre> <pre>
%typemap(out) char * { %typemap(out,noblock=1,fragment="SWIG_FromCharPtr") char *, const char * {
Tcl_SetStringObj($result,$1); Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)$1));
} }
</pre> </pre>
</div> </div>

View file

@ -2050,6 +2050,22 @@ wrap_foo() {
</pre> </pre>
</div> </div>
<p>There is an exception: if the variable name starts with the <tt>_global_</tt> prefix,
the argument number is not appended. Such variables can be used throughout the generated
wrapper function. For example, the above typemap could be rewritten to use <tt>_global_temp</tt>
instead of <tt>temp</tt> and the generated code would then contain a single <tt>_global_temp</tt> variable
instead of <tt>temp1</tt>, <tt>temp2</tt> and <tt>temp3</tt>:
</p>
<div class="code">
<pre>
%typemap(in) std::string * <b>(std::string _global_temp)</b> {
... as above ...
}
</pre>
</div>
<p> <p>
Some typemaps do not recognize local variables (or they may simply not Some typemaps do not recognize local variables (or they may simply not
apply). At this time, only typemaps that apply to argument conversion support this (input typemaps such as the "in" typemap). apply). At this time, only typemaps that apply to argument conversion support this (input typemaps such as the "in" typemap).
@ -3360,7 +3376,7 @@ list of strings like this:
</div> </div>
<p> <p>
To do this, you not only need to map a list of strings to <tt> char *argv[]</tt>, but the To do this, you not only need to map a list of strings to <tt>char *argv[]</tt>, but the
value of <tt>int argc</tt> is implicitly determined by the length of the list. Using only simple value of <tt>int argc</tt> is implicitly determined by the length of the list. Using only simple
typemaps, this type of conversion is possible, but extremely painful. typemaps, this type of conversion is possible, but extremely painful.
Multi-argument typemaps help in this situation. Multi-argument typemaps help in this situation.

View file

@ -349,9 +349,9 @@ These can be overridden using command line options, for example:
<div class="shell"><pre> <div class="shell"><pre>
$ swig -python -Fstandard example.i $ swig -python -Fstandard example.i
example.i:4: Syntax error in input. example.i:4: Syntax error in input(1).
$ swig -python -Fmicrosoft example.i $ swig -python -Fmicrosoft example.i
example.i(4) : Syntax error in input. example.i(4) : Syntax error in input(1).
</pre></div> </pre></div>
<H2><a name="Warnings_nn9"></a>15.9 Warning number reference</H2> <H2><a name="Warnings_nn9"></a>15.9 Warning number reference</H2>

View file

@ -130,6 +130,7 @@ OBJS = $(SRCS:.c=.@OBJEXT@) $(CXXSRCS:.cxx=.@OBJEXT@)
distclean: distclean:
rm -f Makefile rm -f Makefile
rm -f d/example.mk
rm -f xml/Makefile rm -f xml/Makefile
################################################################## ##################################################################
@ -595,7 +596,7 @@ java_cpp: $(SRCDIR_SRCS)
# ---------------------------------------------------------------- # ----------------------------------------------------------------
java_compile: $(SRCDIR_SRCS) java_compile: $(SRCDIR_SRCS)
$(COMPILETOOL) $(JAVAC) $(JAVACFLAGS) $(addprefix $(SRCDIR),$(JAVASRCS)) $(COMPILETOOL) $(JAVAC) $(addprefix $(SRCDIR),$(JAVASRCS))
# ----------------------------------------------------------------- # -----------------------------------------------------------------
# Run java example # Run java example
@ -632,9 +633,6 @@ java_clean:
ROOT_DIR = @ROOT_DIR@ ROOT_DIR = @ROOT_DIR@
JSINCLUDES = @JSCOREINC@ @JSV8INC@ JSINCLUDES = @JSCOREINC@ @JSV8INC@
JSDYNAMICLINKING = @JSCOREDYNAMICLINKING@ @JSV8DYNAMICLINKING@ JSDYNAMICLINKING = @JSCOREDYNAMICLINKING@ @JSV8DYNAMICLINKING@
JSSO =@JSSO@
JSLDSHARED = @JSLDSHARED@
JSCXXSHARED = @JSCXXSHARED@
NODEJS = @NODEJS@ NODEJS = @NODEJS@
NODEGYP = @NODEGYP@ NODEGYP = @NODEGYP@
@ -730,7 +728,7 @@ javascript_clean:
rm -rf build rm -rf build
rm -f *_wrap* $(RUNME) rm -f *_wrap* $(RUNME)
rm -f core @EXTRA_CLEAN@ rm -f core @EXTRA_CLEAN@
rm -f *.@OBJEXT@ *@JSSO@ *.$(SO) rm -f *.@OBJEXT@ *@SO@
rm -f binding.gyp example-gypcopy.cxx rm -f binding.gyp example-gypcopy.cxx
cd $(ROOT_DIR)/Tools/javascript && $(MAKE) -s clean cd $(ROOT_DIR)/Tools/javascript && $(MAKE) -s clean
@ -738,10 +736,10 @@ javascript_clean:
##### ANDROID ###### ##### ANDROID ######
################################################################## ##################################################################
ANDROID = android ANDROID = @ANDROID@
ANDROID_NDK_BUILD = ndk-build ANDROID_NDK_BUILD = @NDKBUILD@
ANDROID_ADB = adb ANDROID_ADB = @ADB@
ANT = ant ANT = @ANT@
TARGETID = 1 TARGETID = 1
# ---------------------------------------------------------------- # ----------------------------------------------------------------
@ -784,7 +782,7 @@ android_version:
# ----------------------------------------------------------------- # -----------------------------------------------------------------
android_clean: android_clean:
test -n "$(SRCDIR)" && cd $(SRCDIR) ; ant -q -logfile /dev/null clean test -n "$(SRCDIR)" && cd $(SRCDIR) ; $(ANT) -q -logfile /dev/null clean
rm -f $(INTERFACEDIR)$(TARGET)_wrap.* rm -f $(INTERFACEDIR)$(TARGET)_wrap.*
rm -f `find $(PACKAGEDIR) -name \*.java | grep -v $(PROJECTNAME).java` rm -f `find $(PACKAGEDIR) -name \*.java | grep -v $(PROJECTNAME).java`
rm -rf obj rm -rf obj
@ -1095,7 +1093,7 @@ ruby_version:
# ----------------------------------------------------------------- # -----------------------------------------------------------------
ruby_clean: ruby_clean:
rm -f *_wrap* *~ .~* myruby@EXEEXT@ *.pm rm -f *_wrap* *~ .~* myruby@EXEEXT@
rm -f core @EXTRA_CLEAN@ rm -f core @EXTRA_CLEAN@
rm -f *.@OBJEXT@ *$(RUBY_SO) rm -f *.@OBJEXT@ *$(RUBY_SO)
@ -1396,6 +1394,7 @@ csharp_run:
# Version check below also works with MS csc.exe which does not understand --version # Version check below also works with MS csc.exe which does not understand --version
csharp_version: csharp_version:
$(CSHARPCOMPILER) --version | head -n 1 $(CSHARPCOMPILER) --version | head -n 1
if test -n "$(CSHARPCILINTERPRETER)" ; then "$(CSHARPCILINTERPRETER)" --version ; fi
# ----------------------------------------------------------------- # -----------------------------------------------------------------
# Cleaning the CSharp examples # Cleaning the CSharp examples
@ -1924,7 +1923,7 @@ d_compile: $(SRCDIR_SRCS)
# ----------------------------------------------------------------- # -----------------------------------------------------------------
d_run: d_run:
$(RUNTOOL) $(D_RUNME) $(RUNPIPE) env LD_LIBRARY_PATH=$$PWD $(RUNTOOL) $(D_RUNME) $(RUNPIPE)
# ----------------------------------------------------------------- # -----------------------------------------------------------------
# Version display # Version display

View file

@ -7,7 +7,7 @@ public:
} }
virtual ~Shape() { virtual ~Shape() {
nshapes--; nshapes--;
}; }
double x, y; double x, y;
void move(double dx, double dy); void move(double dx, double dy);
virtual double area(void) = 0; virtual double area(void) = 0;
@ -19,7 +19,7 @@ class Circle : public Shape {
private: private:
double radius; double radius;
public: public:
Circle(double r) : radius(r) { }; Circle(double r) : radius(r) { }
virtual double area(void); virtual double area(void);
virtual double perimeter(void); virtual double perimeter(void);
}; };
@ -28,7 +28,7 @@ class Square : public Shape {
private: private:
double width; double width;
public: public:
Square(double w) : width(w) { }; Square(double w) : width(w) { }
virtual double area(void); virtual double area(void);
virtual double perimeter(void); virtual double perimeter(void);
}; };

View file

@ -4,8 +4,8 @@ class Vector {
private: private:
double x,y,z; double x,y,z;
public: public:
Vector() : x(0), y(0), z(0) { }; Vector() : x(0), y(0), z(0) { }
Vector(double x, double y, double z) : x(x), y(y), z(z) { }; Vector(double x, double y, double z) : x(x), y(y), z(z) { }
friend Vector operator+(const Vector &a, const Vector &b); friend Vector operator+(const Vector &a, const Vector &b);
char *print(); char *print();
}; };
@ -20,7 +20,3 @@ public:
Vector &operator[](int); Vector &operator[](int);
int size(); int size();
}; };

View file

@ -29,7 +29,7 @@ public:
VectorArray(int maxsize); VectorArray(int maxsize);
~VectorArray(); ~VectorArray();
int size(); int size();
/* This wrapper provides an alternative to the [] operator */ /* This wrapper provides an alternative to the [] operator */
%extend { %extend {
Vector &get(int index) { Vector &get(int index) {
@ -40,7 +40,3 @@ public:
} }
} }
}; };

View file

@ -1,27 +1 @@
ifeq (2,$(D_VERSION)) include ../example.mk
WORKING_DIR = d2/
else
WORKING_DIR = d1/
endif
TOP = ../../..
SWIG = $(TOP)/../preinst-swig
EXTRA_CFLAGS = -I../ ../example.cxx example_wrap.cxx
EXTRA_LDFLAGS = example.o example_wrap.o
TARGET = example_wrap
SWIGOPT =
DSRCS = *.d
DFLAGS = -ofrunme
check: build
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' d_run
build:
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' EXTRA_CFLAGS='$(EXTRA_CFLAGS)' EXTRA_LDFLAGS='$(EXTRA_LDFLAGS)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT) -outcurrentdir ../example.i' TARGET='$(TARGET)' d_cpp; \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' DSRCS='$(DSRCS)' DFLAGS='$(DFLAGS)' d_compile
clean:
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' d_clean

View file

@ -1,27 +1 @@
ifeq (2,$(D_VERSION)) include ../example.mk
WORKING_DIR = d2/
else
WORKING_DIR = d1/
endif
TOP = ../../..
SWIG = $(TOP)/../preinst-swig
EXTRA_CFLAGS = -I../ ../example.cxx example_wrap.cxx
EXTRA_LDFLAGS = example.o example_wrap.o
TARGET = example_wrap
SWIGOPT =
DSRCS = *.d
DFLAGS = -ofrunme
check: build
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' d_run
build:
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' EXTRA_CFLAGS='$(EXTRA_CFLAGS)' EXTRA_LDFLAGS='$(EXTRA_LDFLAGS)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT) -outcurrentdir ../example.i' TARGET='$(TARGET)' d_cpp; \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' DSRCS='$(DSRCS)' DFLAGS='$(DFLAGS)' d_compile
clean:
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' d_clean

View file

@ -1,27 +1 @@
ifeq (2,$(D_VERSION)) include ../example.mk
WORKING_DIR = d2/
else
WORKING_DIR = d1/
endif
TOP = ../../..
SWIG = $(TOP)/../preinst-swig
EXTRA_CFLAGS = -I../ example_wrap.c
EXTRA_LDFLAGS = example_wrap.o
TARGET = example_wrap
SWIGOPT =
DSRCS = *.d
DFLAGS = -ofrunme
check: build
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' d_run
build:
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' EXTRA_CFLAGS='$(EXTRA_CFLAGS)' EXTRA_LDFLAGS='$(EXTRA_LDFLAGS)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT) -outcurrentdir ../example.i' TARGET='$(TARGET)' d; \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' DSRCS='$(DSRCS)' DFLAGS='$(DFLAGS)' d_compile
clean:
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' d_clean

View file

@ -1,23 +0,0 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
* Version 1.3.41
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
* ----------------------------------------------------------------------------- */
module example;
static import example_wrap;
static import tango.stdc.stringz;
public const int ICONST = 42;
public const double FCONST = 2.1828;
public const char CCONST = 'x';
public const char CCONST2 = '\n';
public const char[] SCONST = "Hello World";
public const char[] SCONST2 = "\"Hello World\"";
public const double EXPR = 42+3*(2.1828);
public const int iconst = 37;
public const double fconst = 3.14;

View file

@ -1,27 +1 @@
ifeq (2,$(D_VERSION)) include ../example.mk
WORKING_DIR = d2/
else
WORKING_DIR = d1/
endif
TOP = ../../..
SWIG = $(TOP)/../preinst-swig
EXTRA_CFLAGS = -I../ ../example.cxx example_wrap.cxx
EXTRA_LDFLAGS = example.o example_wrap.o
TARGET = example_wrap
SWIGOPT =
DSRCS = *.d
DFLAGS = -ofrunme
check: build
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' d_run
build:
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' EXTRA_CFLAGS='$(EXTRA_CFLAGS)' EXTRA_LDFLAGS='$(EXTRA_LDFLAGS)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT) -outcurrentdir ../example.i' TARGET='$(TARGET)' d_cpp; \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' DSRCS='$(DSRCS)' DFLAGS='$(DFLAGS)' d_compile
clean:
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' d_clean

59
Examples/d/example.mk.in Normal file
View file

@ -0,0 +1,59 @@
#
# Common Makefile code for building D examples.
#
# We actually need to configure this to gain access to the default D version to
# use when D_VERSION is not set. Using Examples/Makefile.in is not enough, as
# the location of the source files (d1/ or d2/) depends on it. The alternative
# would be to add the functionality specific to Examples/d (as opposed to the
# test suite) directly to Examples/Makefile.in.
#
# This file is supposed to be included from a Makefile in the subdirectory
# corresponding to a specific example.
#
ifeq (,$(D_VERSION))
D_VERSION = @DDEFAULTVERSION@
endif
ifeq (1,$(D_VERSION))
VERSION_DIR = d1/
else
VERSION_DIR = d2/
endif
EXAMPLES_TOP = ../../..
SWIG_TOP = ../../../..
SWIG = $(SWIG_TOP)/preinst-swig
EXTRA_CFLAGS =
EXTRA_CXXFLAGS =
EXTRA_LDFLAGS =
TARGET = example_wrap
SWIGOPT = -outcurrentdir
DFLAGS = -ofrunme
ifeq (,$(SRCDIR))
DSRCS = *.d
else
DSRCS = *.d $(addprefix ../$(SRCDIR)$(VERSION_DIR),runme.d)
endif
check: build
$(MAKE) -C $(VERSION_DIR) -f $(EXAMPLES_TOP)/Makefile SRCDIR='../$(SRCDIR)' d_run
build:
mkdir -p $(VERSION_DIR)
if [ -f $(SRCDIR)example.cxx ]; then \
$(MAKE) -C $(VERSION_DIR) -f $(EXAMPLES_TOP)/Makefile SRCDIR='../$(SRCDIR)' EXTRA_CXXFLAGS='$(EXTRA_CXXFLAGS)' EXTRA_LDFLAGS='$(EXTRA_LDFLAGS)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='example.i' CXXSRCS='example.cxx' d_cpp; \
elif [ -f $(SRCDIR)example.c ]; then \
$(MAKE) -C $(VERSION_DIR) -f $(EXAMPLES_TOP)/Makefile SRCDIR='../$(SRCDIR)' EXTRA_CFLAGS='$(EXTRA_CFLAGS)' EXTRA_LDFLAGS='$(EXTRA_LDFLAGS)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='example.i' SRCS='example.c' d; \
else \
$(MAKE) -C $(VERSION_DIR) -f $(EXAMPLES_TOP)/Makefile SRCDIR='../$(SRCDIR)' EXTRA_CFLAGS='$(EXTRA_CFLAGS)' EXTRA_LDFLAGS='$(EXTRA_LDFLAGS)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='example.i' SRCS='' d; \
fi
$(MAKE) -C $(VERSION_DIR) -f $(EXAMPLES_TOP)/Makefile SRCDIR='../$(SRCDIR)' DSRCS='$(DSRCS)' DFLAGS='$(DFLAGS)' d_compile
clean:
if [ -d $(VERSION_DIR) ]; then \
$(MAKE) -C $(VERSION_DIR) -f $(EXAMPLES_TOP)/Makefile SRCDIR='../$(SRCDIR)' d_clean; \
fi
test -f $(VERSION_DIR)runme.d || rm -rf $(VERSION_DIR) # Only delete dir if out of source

View file

@ -1,27 +1 @@
ifeq (2,$(D_VERSION)) include ../example.mk
WORKING_DIR = d2/
else
WORKING_DIR = d1/
endif
TOP = ../../..
SWIG = $(TOP)/../preinst-swig
EXTRA_CFLAGS = -I../ ../example.cxx example_wrap.cxx
EXTRA_LDFLAGS = example.o example_wrap.o
TARGET = example_wrap
SWIGOPT =
DSRCS = *.d
DFLAGS = -ofrunme
check: build
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' d_run
build:
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' EXTRA_CFLAGS='$(EXTRA_CFLAGS)' EXTRA_LDFLAGS='$(EXTRA_LDFLAGS)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT) -outcurrentdir ../example.i' TARGET='$(TARGET)' d_cpp; \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' DSRCS='$(DSRCS)' DFLAGS='$(DFLAGS)' d_compile
clean:
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' d_clean

View file

@ -1,27 +1 @@
ifeq (2,$(D_VERSION)) include ../example.mk
WORKING_DIR = d2/
else
WORKING_DIR = d1/
endif
TOP = ../../..
SWIG = $(TOP)/../preinst-swig
EXTRA_CFLAGS = -I../ ../example.c example_wrap.c
EXTRA_LDFLAGS = example.o example_wrap.o
TARGET = example_wrap
SWIGOPT =
DSRCS = *.d
DFLAGS = -ofrunme
check: build
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' d_run
build:
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' EXTRA_CFLAGS='$(EXTRA_CFLAGS)' EXTRA_LDFLAGS='$(EXTRA_LDFLAGS)' EXTRA_LDFLAGS='$(EXTRA_LDFLAGS)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT) -outcurrentdir ../example.i' TARGET='$(TARGET)' d; \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' DSRCS='$(DSRCS)' DFLAGS='$(DFLAGS)' d_compile
clean:
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' d_clean

View file

@ -1,27 +1 @@
ifeq (2,$(D_VERSION)) include ../example.mk
WORKING_DIR = d2/
else
WORKING_DIR = d1/
endif
TOP = ../../..
SWIG = $(TOP)/../preinst-swig
EXTRA_CFLAGS = -I../ ../example.c example_wrap.c
EXTRA_LDFLAGS = example.o example_wrap.o
TARGET = example_wrap
SWIGOPT =
DSRCS = *.d
DFLAGS = -ofrunme
check: build
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' d_run
build:
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' EXTRA_CFLAGS='$(EXTRA_CFLAGS)' EXTRA_LDFLAGS='$(EXTRA_LDFLAGS)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT) -outcurrentdir ../example.i' TARGET='$(TARGET)' d; \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' DSRCS='$(DSRCS)' DFLAGS='$(DFLAGS)' d_compile
clean:
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' d_clean

View file

@ -1,27 +1 @@
ifeq (2,$(D_VERSION)) include ../example.mk
WORKING_DIR = d2/
else
WORKING_DIR = d1/
endif
TOP = ../../..
SWIG = $(TOP)/../preinst-swig
EXTRA_CFLAGS = -I../ ../example.c example_wrap.c
EXTRA_LDFLAGS = example.o example_wrap.o
TARGET = example_wrap
SWIGOPT =
DSRCS = *.d
DFLAGS = -ofrunme
check: build
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' d_run
build:
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' EXTRA_CFLAGS='$(EXTRA_CFLAGS)' EXTRA_LDFLAGS='$(EXTRA_LDFLAGS)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT) -outcurrentdir ../example.i' TARGET='$(TARGET)' d; \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' DSRCS='$(DSRCS)' DFLAGS='$(DFLAGS)' d_compile
clean:
cd $(WORKING_DIR); \
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' d_clean

View file

@ -4,8 +4,8 @@ class Vector {
private: private:
double x,y,z; double x,y,z;
public: public:
Vector() : x(0), y(0), z(0) { }; Vector() : x(0), y(0), z(0) { }
Vector(double x, double y, double z) : x(x), y(y), z(z) { }; Vector(double x, double y, double z) : x(x), y(y), z(z) { }
friend Vector operator+(const Vector &a, const Vector &b); friend Vector operator+(const Vector &a, const Vector &b);
char *print(); char *print();
}; };
@ -20,7 +20,3 @@ public:
Vector &operator[](int); Vector &operator[](int);
int size(); int size();
}; };

View file

@ -29,7 +29,7 @@ public:
VectorArray(int maxsize); VectorArray(int maxsize);
~VectorArray(); ~VectorArray();
int size(); int size();
/* This wrapper provides an alternative to the [] operator */ /* This wrapper provides an alternative to the [] operator */
%extend { %extend {
Vector &get(int index) { Vector &get(int index) {

View file

@ -4,8 +4,8 @@ class Vector {
private: private:
double x,y,z; double x,y,z;
public: public:
Vector() : x(0), y(0), z(0) { }; Vector() : x(0), y(0), z(0) { }
Vector(double x, double y, double z) : x(x), y(y), z(z) { }; Vector(double x, double y, double z) : x(x), y(y), z(z) { }
friend Vector operator+(const Vector &a, const Vector &b); friend Vector operator+(const Vector &a, const Vector &b);
char *print(); char *print();
}; };
@ -20,7 +20,3 @@ public:
Vector &operator[](int); Vector &operator[](int);
int size(); int size();
}; };

View file

@ -29,7 +29,7 @@ public:
VectorArray(int maxsize); VectorArray(int maxsize);
~VectorArray(); ~VectorArray();
int size(); int size();
/* This wrapper provides an alternative to the [] operator */ /* This wrapper provides an alternative to the [] operator */
%extend { %extend {
Vector &get(int index) { Vector &get(int index) {
@ -40,7 +40,3 @@ public:
} }
} }
}; };

View file

@ -7,12 +7,18 @@ else
JSENGINE=node JSENGINE=node
endif endif
ifneq (, $(V8_VERSION))
JSV8_VERSION=$(V8_VERSION)
else
JSV8_VERSION=0x031110
endif
EXAMPLES_TOP=../.. EXAMPLES_TOP=../..
SWIG_TOP=../../.. SWIG_TOP=../../..
SWIG = $(SWIG_TOP)/preinst-swig SWIG = $(SWIG_TOP)/preinst-swig
TARGET = example TARGET = example
INTERFACE = example.i INTERFACE = example.i
SWIGOPT=-$(JSENGINE) SWIGOPT=-$(JSENGINE) -DV8_VERSION=$(JSV8_VERSION)
check: build check: build
$(MAKE) -f $(EXAMPLES_TOP)/Makefile SRCDIR='$(SRCDIR)' JSENGINE='$(JSENGINE)' TARGET='$(TARGET)' javascript_run $(MAKE) -f $(EXAMPLES_TOP)/Makefile SRCDIR='$(SRCDIR)' JSENGINE='$(JSENGINE)' TARGET='$(TARGET)' javascript_run

View file

@ -4,8 +4,8 @@ class Vector {
private: private:
double x,y,z; double x,y,z;
public: public:
Vector() : x(0), y(0), z(0) { }; Vector() : x(0), y(0), z(0) { }
Vector(double x, double y, double z) : x(x), y(y), z(z) { }; Vector(double x, double y, double z) : x(x), y(y), z(z) { }
friend Vector operator+(const Vector &a, const Vector &b); friend Vector operator+(const Vector &a, const Vector &b);
char *print(); char *print();
}; };
@ -20,7 +20,3 @@ public:
Vector &operator[](int); Vector &operator[](int);
int size(); int size();
}; };

View file

@ -29,7 +29,7 @@ public:
VectorArray(int maxsize); VectorArray(int maxsize);
~VectorArray(); ~VectorArray();
int size(); int size();
/* This wrapper provides an alternative to the [] operator */ /* This wrapper provides an alternative to the [] operator */
%extend { %extend {
Vector &get(int index) { Vector &get(int index) {

View file

@ -9,20 +9,20 @@ console.log(example.maxdouble(3.14,2.18));
iv = new example.vecint(100); iv = new example.vecint(100);
dv = new example.vecdouble(1000); dv = new example.vecdouble(1000);
for(i=0;i<=100;i++) for(i=0;i<100;i++)
iv.setitem(i,2*i); iv.setitem(i,2*i);
for(i=0;i<=1000;i++) for(i=0;i<1000;i++)
dv.setitem(i, 1.0/(i+1)); dv.setitem(i, 1.0/(i+1));
sum = 0; sum = 0;
for(i=0;i<=100;i++) for(i=0;i<100;i++)
sum = sum + iv.getitem(i); sum = sum + iv.getitem(i);
console.log(sum); console.log(sum);
sum = 0.0; sum = 0.0;
for(i=0;i<=1000;i++) for(i=0;i<1000;i++)
sum = sum + dv.getitem(i); sum = sum + dv.getitem(i);
console.log(sum); console.log(sum);

View file

@ -3,25 +3,25 @@ print "[lua] This is runme.lua"
-- we do not need to load the library, as it was already in the interpreter -- we do not need to load the library, as it was already in the interpreter
-- but let's check anyway -- but let's check anyway
assert(type(example)=='table',"Don't appear to have loaded the example module") assert(type(example)=='table',"Don't appear to have loaded the example module")
-- note: we will copy the functions from example table into global
-- this will help us later
for k,v in pairs(example) do _G[k]=v end
-- our add function -- note: we will copy the functions from example table into global
-- this will help us later
for k,v in pairs(example) do _G[k]=v end
-- our add function
-- we will be calling this from C -- we will be calling this from C
function add(a,b) function add(a,b)
print("[lua] this is function add(",a,b,")") print("[lua] this is function add(",a,b,")")
c=a+b c=a+b
print("[lua] returning",c) print("[lua] returning",c)
return c return c
end end
function append(a,b) function append(a,b)
print("[lua] this is function append(",a,b,")") print("[lua] this is function append(",a,b,")")
c=a..b c=a..b
print("[lua] returning",c) print("[lua] returning",c)
return c return c
end end

View file

@ -1,7 +1,7 @@
class Base { class Base {
public: public:
Base() { }; Base() { }
virtual ~Base() { }; virtual ~Base() { }
virtual const char * A() const { virtual const char * A() const {
return "Base::A"; return "Base::A";
} }

View file

@ -8,7 +8,7 @@ public:
} }
virtual ~Shape() { virtual ~Shape() {
nshapes--; nshapes--;
}; }
double x, y; double x, y;
void move(double dx, double dy); void move(double dx, double dy);
virtual double area(void) = 0; virtual double area(void) = 0;
@ -20,7 +20,7 @@ class Circle : public Shape {
private: private:
double radius; double radius;
public: public:
Circle(double r) : radius(r) { }; Circle(double r) : radius(r) { }
virtual double area(void); virtual double area(void);
virtual double perimeter(void); virtual double perimeter(void);
}; };
@ -29,7 +29,7 @@ class Square : public Shape {
private: private:
double width; double width;
public: public:
Square(double w) : width(w) { }; Square(double w) : width(w) { }
virtual double area(void); virtual double area(void);
virtual double perimeter(void); virtual double perimeter(void);
}; };

View file

@ -4,8 +4,8 @@ struct Vector {
private: private:
double x,y,z; double x,y,z;
public: public:
Vector() : x(0), y(0), z(0) { }; Vector() : x(0), y(0), z(0) { }
Vector(double x, double y, double z) : x(x), y(y), z(z) { }; Vector(double x, double y, double z) : x(x), y(y), z(z) { }
Vector operator+(const Vector &b) const; Vector operator+(const Vector &b) const;
char *print(); char *print();
}; };

View file

@ -1,5 +1,8 @@
/* File : example.i */ /* File : example.i */
%module(directors="1") swigexample %module(directors="1") swigexample
%feature("autodoc", 1);
%{ %{
#include "example.h" #include "example.h"
%} %}

View file

@ -1,6 +1,8 @@
/* File : example.i */ /* File : example.i */
%module swigexample %module swigexample
%feature("autodoc", 1);
%{ %{
#include "example.h" #include "example.h"
%} %}

View file

@ -1,6 +1,8 @@
/* File : example.i */ /* File : example.i */
%module swigexample %module swigexample
%feature("autodoc", 1);
/* A few preprocessor macros */ /* A few preprocessor macros */
#define ICONST 42 #define ICONST 42

View file

@ -1,6 +1,8 @@
/* File : example.i */ /* File : example.i */
%module swigexample %module swigexample
%feature("autodoc", 1);
%contract gcd(int x, int y) { %contract gcd(int x, int y) {
require: require:
x >= 0; x >= 0;

View file

@ -1,6 +1,8 @@
/* File : example.i */ /* File : example.i */
%module swigexample %module swigexample
%feature("autodoc", 1);
%{ %{
#include "example.h" #include "example.h"
%} %}

View file

@ -1,5 +1,8 @@
/* File : example.i */ /* File : example.i */
%module(directors="1") swigexample %module(directors="1") swigexample
%feature("autodoc", 1);
%{ %{
#include "example.h" #include "example.h"
%} %}

View file

@ -1,5 +1,8 @@
/* File : example.i */ /* File : example.i */
%module swigexample %module swigexample
%feature("autodoc", 1);
%{ %{
#include "example.h" #include "example.h"
%} %}

View file

@ -1,5 +1,8 @@
/* File : example.i */ /* File : example.i */
%module swigexample %module swigexample
%feature("autodoc", 1);
%{ %{
#include "example.h" #include "example.h"
%} %}

View file

@ -1,6 +1,7 @@
/* File : example.i */ /* File : example.i */
%module swigexample %module swigexample
%feature("autodoc", 1);
%inline %{ %inline %{
// From B. Strousjoup, "The C++ Programming Language, Third Edition", p. 514 // From B. Strousjoup, "The C++ Programming Language, Third Edition", p. 514

View file

@ -1,5 +1,8 @@
/* File : example.i */ /* File : example.i */
/* module name given on cmdline */ /* module name given on cmdline */
%feature("autodoc", 1);
%{ %{
#include "example.h" #include "example.h"
%} %}

View file

@ -1,6 +1,10 @@
/* File : example.i */ /* File : example.i */
%module swigexample %module swigexample
%feature("autodoc", 1);
#pragma SWIG nowarn=SWIGWARN_IGNORE_OPERATOR_EQ #pragma SWIG nowarn=SWIGWARN_IGNORE_OPERATOR_EQ
%{ %{
#include "example.h" #include "example.h"
%} %}

View file

@ -1,6 +1,8 @@
/* File : example.i */ /* File : example.i */
%module swigexample %module swigexample
%feature("autodoc", 1);
%{ %{
extern void add(int *, int *, int *); extern void add(int *, int *, int *);
extern void sub(int *, int *, int *); extern void sub(int *, int *, int *);

View file

@ -4,8 +4,8 @@ class Vector {
private: private:
double x,y,z; double x,y,z;
public: public:
Vector() : x(0), y(0), z(0) { }; Vector() : x(0), y(0), z(0) { }
Vector(double x, double y, double z) : x(x), y(y), z(z) { }; Vector(double x, double y, double z) : x(x), y(y), z(z) { }
friend Vector operator+(const Vector &a, const Vector &b); friend Vector operator+(const Vector &a, const Vector &b);
char *print(); char *print();
}; };

View file

@ -4,6 +4,8 @@
%module swigexample %module swigexample
%feature("autodoc", 1);
%{ %{
#include "example.h" #include "example.h"
%} %}

View file

@ -1,6 +1,8 @@
/* File : example.i */ /* File : example.i */
%module swigexample %module swigexample
%feature("autodoc", 1);
%inline %{ %inline %{
extern int gcd(int x, int y); extern int gcd(int x, int y);
extern double Foo; extern double Foo;

View file

@ -1,6 +1,8 @@
/* File : example.i */ /* File : example.i */
%module swigexample %module swigexample
%feature("autodoc", 1);
%{ %{
#include "example.h" #include "example.h"
%} %}

View file

@ -1,5 +1,8 @@
/* File : example.i */ /* File : example.i */
%module swigexample %module swigexample
%feature("autodoc", 1);
%{ %{
#include "example.h" #include "example.h"
%} %}

View file

@ -2,8 +2,8 @@
class Base { class Base {
public: public:
Base() { }; Base() { }
virtual ~Base() { }; virtual ~Base() { }
virtual void A() { virtual void A() {
printf("I'm Base::A\n"); printf("I'm Base::A\n");
} }

View file

@ -4,8 +4,8 @@ class Vector {
private: private:
double x,y,z; double x,y,z;
public: public:
Vector() : x(0), y(0), z(0) { }; Vector() : x(0), y(0), z(0) { }
Vector(double x, double y, double z) : x(x), y(y), z(z) { }; Vector(double x, double y, double z) : x(x), y(y), z(z) { }
friend Vector operator+(const Vector &a, const Vector &b); friend Vector operator+(const Vector &a, const Vector &b);
char *print(); char *print();
}; };
@ -20,7 +20,3 @@ public:
Vector &operator[](int); Vector &operator[](int);
int size(); int size();
}; };

View file

@ -29,7 +29,7 @@ public:
VectorArray(int maxsize); VectorArray(int maxsize);
~VectorArray(); ~VectorArray();
int size(); int size();
/* This wrapper provides an alternative to the [] operator */ /* This wrapper provides an alternative to the [] operator */
%extend { %extend {
Vector &get(int index) { Vector &get(int index) {
@ -40,7 +40,3 @@ public:
} }
} }
}; };

View file

@ -9,7 +9,7 @@ public:
} }
virtual ~Shape() { virtual ~Shape() {
nshapes--; nshapes--;
}; }
double x, y; double x, y;
void move(double dx, double dy); void move(double dx, double dy);
virtual double area(void) = 0; virtual double area(void) = 0;
@ -22,8 +22,8 @@ class Circle : public Shape {
private: private:
double radius; double radius;
public: public:
Circle(double r) : radius(r) { }; Circle(double r) : radius(r) { }
~Circle() { }; ~Circle() { }
void set_radius( double r ); void set_radius( double r );
virtual double area(void); virtual double area(void);
virtual double perimeter(void); virtual double perimeter(void);
@ -33,7 +33,7 @@ class Square : public Shape {
private: private:
double width; double width;
public: public:
Square(double w) : width(w) { }; Square(double w) : width(w) { }
~Square() { } ~Square() { }
virtual double area(void); virtual double area(void);
virtual double perimeter(void); virtual double perimeter(void);
@ -44,7 +44,7 @@ private:
typedef std::vector<Shape*>::iterator iterator; typedef std::vector<Shape*>::iterator iterator;
std::vector<Shape*> shapes; std::vector<Shape*> shapes;
public: public:
ShapeContainer() : shapes() {}; ShapeContainer() : shapes() {}
~ShapeContainer(); ~ShapeContainer();
void addShape( Shape *s ); void addShape( Shape *s );
}; };

View file

@ -9,7 +9,7 @@ public:
} }
virtual ~Shape() { virtual ~Shape() {
nshapes--; nshapes--;
}; }
double x, y; double x, y;
void move(double dx, double dy); void move(double dx, double dy);
virtual double area(void) = 0; virtual double area(void) = 0;
@ -22,8 +22,8 @@ class Circle : public Shape {
private: private:
double radius; double radius;
public: public:
Circle(double r) : radius(r) { }; Circle(double r) : radius(r) { }
~Circle() { }; ~Circle() { }
void set_radius( double r ); void set_radius( double r );
virtual double area(void); virtual double area(void);
virtual double perimeter(void); virtual double perimeter(void);
@ -33,7 +33,7 @@ class Square : public Shape {
private: private:
double width; double width;
public: public:
Square(double w) : width(w) { }; Square(double w) : width(w) { }
~Square() { } ~Square() { }
virtual double area(void); virtual double area(void);
virtual double perimeter(void); virtual double perimeter(void);

View file

@ -4,8 +4,8 @@ class Vector {
private: private:
double x,y,z; double x,y,z;
public: public:
Vector() : x(0), y(0), z(0) { }; Vector() : x(0), y(0), z(0) { }
Vector(double x, double y, double z) : x(x), y(y), z(z) { }; Vector(double x, double y, double z) : x(x), y(y), z(z) { }
friend Vector operator+(const Vector &a, const Vector &b); friend Vector operator+(const Vector &a, const Vector &b);
char *as_string(); char *as_string();
}; };
@ -20,7 +20,3 @@ public:
Vector &operator[](int); Vector &operator[](int);
int size(); int size();
}; };

View file

@ -1,10 +1,6 @@
/* File : example.i */ /* File : example.i */
/* This example has nothing to do with references but the name is used by all /* This file has a few "typical" uses of C++ references. */
* the other languages so it's hard to rename to something more meaningful.
*
* Mostly it shows how to use %extend.
*/
%module example %module example
@ -33,8 +29,8 @@ public:
VectorArray(int maxsize); VectorArray(int maxsize);
~VectorArray(); ~VectorArray();
int size(); int size();
/* This wrapper provides an alternative to the [] operator */ /* This wrapper provides an alternative to the [] operator */
%extend { %extend {
Vector &get(int index) { Vector &get(int index) {
printf("VectorArray extended get: %p %d\n", (void *)$self, index); printf("VectorArray extended get: %p %d\n", (void *)$self, index);

View file

@ -24,7 +24,6 @@ simple
smartptr smartptr
std_vector std_vector
std_map std_map
swigrun
template template
varargs varargs
variables variables

View file

@ -10,3 +10,12 @@
/* Let's just grab the original header file here */ /* Let's just grab the original header file here */
%include "example.h" %include "example.h"
%inline %{
// The -builtin SWIG option results in SWIGPYTHON_BUILTIN being defined
#ifdef SWIGPYTHON_BUILTIN
bool is_python_builtin() { return true; }
#else
bool is_python_builtin() { return false; }
#endif
%}

View file

@ -20,10 +20,17 @@ try:
except RuntimeError,e: except RuntimeError,e:
print e.args[0] print e.args[0]
try: if not example.is_python_builtin():
t.hosed() try:
except example.Exc,e: t.hosed()
print e.code, e.msg except example.Exc,e:
print e.code, e.msg
else:
try:
t.hosed()
except BaseException,e:
# Throwing builtin classes as exceptions not supported (-builtin option)
print e
for i in range(1,4): for i in range(1,4):
try: try:

View file

@ -109,6 +109,12 @@
%template(doubleQueue) Queue<double>; %template(doubleQueue) Queue<double>;
%inline %{
// The -builtin SWIG option results in SWIGPYTHON_BUILTIN being defined
#ifdef SWIGPYTHON_BUILTIN
bool is_python_builtin() { return true; }
#else
bool is_python_builtin() { return false; }
#endif
%}

View file

@ -1,10 +1,16 @@
# file: runme.py # file: runme.py
import example import example
if example.is_python_builtin():
print "Skipping example: -builtin option does not support %exceptionclass"
exit(0)
q = example.intQueue(10) q = example.intQueue(10)
print "Inserting items into intQueue" print "Inserting items into intQueue"
print type(example.FullError)
try: try:
for i in range(0,100): for i in range(0,100):
q.enqueue(i) q.enqueue(i)

View file

@ -2,8 +2,8 @@
class Base { class Base {
public: public:
Base() { }; Base() { }
virtual ~Base() { }; virtual ~Base() { }
virtual void A() { virtual void A() {
printf("I'm Base::A\n"); printf("I'm Base::A\n");
} }

View file

@ -11,7 +11,8 @@ import_packages_subdirs = \
from_init2 \ from_init2 \
from_init3 \ from_init3 \
relativeimport1 \ relativeimport1 \
relativeimport1 relativeimport2 \
relativeimport3
check: build check: build
if test "x$(SRCDIR)" != x; then \ if test "x$(SRCDIR)" != x; then \

View file

@ -1,6 +1,10 @@
# Test import of modules content from within __init__.py
print "Testing %module(package=...) + python 'import' in __init__.py"
import sys import sys
import os.path
# Test import of modules content from within __init__.py
testname = os.path.basename(os.path.dirname(os.path.abspath(__file__)))
print "Testing " + testname + " - %module(package=...) + python 'import' in __init__.py"
if sys.version_info < (3,0): if sys.version_info < (3,0):
import py2.pkg2 import py2.pkg2
print " Finished importing py2.pkg2" print " Finished importing py2.pkg2"

View file

@ -1,6 +1,10 @@
# Test import of modules content from within __init__.py
print "Testing %module(package=...) + python 'import' in __init__.py"
import sys import sys
import os.path
# Test import of modules content from within __init__.py
testname = os.path.basename(os.path.dirname(os.path.abspath(__file__)))
print "Testing " + testname + " - %module(package=...) + python 'import' in __init__.py"
if sys.version_info < (3,0): if sys.version_info < (3,0):
import py2.pkg2 import py2.pkg2
print " Finished importing py2.pkg2" print " Finished importing py2.pkg2"

View file

@ -1,6 +1,10 @@
# Test import of modules content from within __init__.py
print "Testing %module(package=...) + python 'import' in __init__.py"
import sys import sys
import os.path
# Test import of modules content from within __init__.py
testname = os.path.basename(os.path.dirname(os.path.abspath(__file__)))
print "Testing " + testname + " - %module(package=...) + python 'import' in __init__.py"
if sys.version_info < (3,0): if sys.version_info < (3,0):
import py2.pkg2 import py2.pkg2
print " Finished importing py2.pkg2" print " Finished importing py2.pkg2"

View file

@ -1,6 +1,10 @@
# Test import of modules content from within __init__.py
print "Testing %module(package=...) with -relativeimport"
import sys import sys
import os.path
# Test import of modules content from within __init__.py
testname = os.path.basename(os.path.dirname(os.path.abspath(__file__)))
print "Testing " + testname + " - %module(package=...) with -relativeimport"
if sys.version_info < (3,0): if sys.version_info < (3,0):
import py2.pkg2.bar import py2.pkg2.bar
print " Finished importing py2.pkg2.bar" print " Finished importing py2.pkg2.bar"

View file

@ -1,6 +1,10 @@
# Test import of modules content from within __init__.py
print "Testing %module(package=...) + python 'import' in __init__.py"
import sys import sys
import os.path
# Test import of modules content from within __init__.py
testname = os.path.basename(os.path.dirname(os.path.abspath(__file__)))
print "Testing " + testname + " - %module(package=...) + python 'import' in __init__.py"
if sys.version_info < (3,0): if sys.version_info < (3,0):
import py2.pkg2.bar import py2.pkg2.bar
print " Finished importing py2.pkg2.bar" print " Finished importing py2.pkg2.bar"

View file

@ -1,9 +0,0 @@
# Test import of modules content from within __init__.py
print("Testing %module(package=...) + python 'import' in __init__.py")
import sys
if sys.version_info < (3, 0):
import py2.pkg2.bar
print(" Finished importing py2.pkg2.bar")
else:
import py3.pkg2.bar
print(" Finished importing py3.pkg2.bar")

View file

@ -0,0 +1,25 @@
TOP = ../../..
SWIG = $(realpath $(TOP)/../preinst-swig)
SWIGOPT =
LIBS =
PY3 =
ifeq (,$(PY3))
PKG1DIR = "py2"
else
PKG1DIR = "py3"
endif
check: build
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' python_run
build:
cd $(PKG1DIR) && $(MAKE) SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT) -relativeimport' LIBS='$(LIBS)' build
static:
cd $(PKG1DIR) && $(MAKE) SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT) -relativeimport' LIBS='$(LIBS)' static
clean:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' python_clean
cd py2 && $(MAKE) clean
cd py3 && $(MAKE) clean

View file

@ -0,0 +1,22 @@
This example tests the %import directive and -relativeimport swig option.
Use 'python runme.py' to run a test.
Overview:
---------
The example defines 2 different extension modules--each wrapping a separate C++
class.
pyX/pkg2/pkg3/foo.i - Pkg3_Foo class
pyX/pkg2/bar.i - Pkg2_Bar class derived from Pkg3_Foo
The code is processed by swig with -relativeimport flag. The runtime test
imports pyX.pkg2.bar module.
If everything works well, the module pyX.pkg2.bar shall load properly.
Unix:
-----
- Run make
- Run the test as described above

View file

@ -0,0 +1,14 @@
TOP = ../../../..
SWIG = $(realpath $(TOP)/../preinst-swig)
SWIGOPT =
LIBS =
build:
cd pkg2 && $(MAKE) SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' LIBS='$(LIBS)' build
static:
cd pkg2 && $(MAKE) SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' LIBS='$(LIBS)' static
clean:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' python_clean
cd pkg2 && $(MAKE) clean

View file

@ -0,0 +1,18 @@
TOP = ../../../../..
SWIG = $(realpath $(TOP)/../preinst-swig)
SWIGOPT =
LIBS =
build:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' \
LIBS='$(LIBS)' TARGET='bar' INTERFACE='bar.i' python_cpp
cd pkg3 && $(MAKE) SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' LIBS='$(LIBS)' build
static:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' \
LIBS='$(LIBS)' TARGET='bar' INTERFACE='bar.i' python_cpp
cd pkg3 && $(MAKE) SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' LIBS='$(LIBS)' static
clean:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' TARGET='bar' python_clean
cd pkg3 && $(MAKE) clean

View file

@ -0,0 +1,5 @@
#ifndef PY2_PKG2_BAR_HPP
#define PY2_PKG2_BAR_HPP
#include "../../py2/pkg2/pkg3/foo.hpp"
struct Pkg2_Bar : Pkg3_Foo {};
#endif /* PY2_PKG2_BAR_HPP */

View file

@ -0,0 +1,6 @@
%module(package="py2.pkg2") bar
%{
#include "../../py2/pkg2/bar.hpp"
%}
%import (module="foo", package="py2.pkg2.pkg3") "../../py2/pkg2/pkg3/foo.hpp"
%include "../../py2/pkg2/bar.hpp"

View file

@ -0,0 +1,15 @@
TOP = ../../../../../..
SWIG = $(realpath $(TOP)/../preinst-swig)
SWIGOPT =
LIBS =
build:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' \
LIBS='$(LIBS)' TARGET='foo' INTERFACE='foo.i' python_cpp
static:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' \
LIBS='$(LIBS)' TARGET='foo' INTERFACE='foo.i' python_cpp_static
clean:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' TARGET='foo' python_clean

View file

@ -0,0 +1,4 @@
#ifndef PY2_PKG2_PKG3_FOO_HPP
#define PY2_PKG2_PKG3_FOO_HPP
struct Pkg3_Foo {};
#endif /* PY2_PKG2_PKG3_FOO_HPP */

View file

@ -0,0 +1,5 @@
%module(package="py2.pkg2.pkg3") foo
%{
#include "../../../py2/pkg2/pkg3/foo.hpp"
%}
%include "../../../py2/pkg2/pkg3/foo.hpp"

View file

@ -0,0 +1,14 @@
TOP = ../../../..
SWIG = $(realpath $(TOP)/../preinst-swig)
SWIGOPT =
LIBS =
build:
cd pkg2 && $(MAKE) SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' LIBS='$(LIBS)' build
static:
cd pkg2 && $(MAKE) SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' LIBS='$(LIBS)' static
clean:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' python_clean
cd pkg2 && $(MAKE) clean

Some files were not shown because too many files have changed in this diff Show more