swig/Examples
Richard Beare da1c6c60d3 This is a modification to support use of tricky enumerations in R. It
includes the addition of a _runme for an existing test - preproc_constants
that was previously not run. That tests includes a preprocessor based
setting of an enumeration which is ignored by the existing r enumeration
infrastructure. The new version correctly reports the enumeration value
as 4 - previous versions set it to 0. Traditional enumerations are unchanged.

The approach used to deal with these enumerations is similar to that of
other languages, and requires a call to a C function at runtime to return
the enumeration value. The previous approach figured out the values statically
and this is still used where possible. The need for a runtime call leads to
changes in when swig code is used in packages - see below.

One test that previously passed now fails - namely the R sourcing of
preproc_constants.R, as the enumeration code requires the shared library,
which isn't loaded by that script.

There is also a modification to the way the R _runme.R files are used.
The call to R CMD BATCH now includes a --args option that indicates
the source folder for the unittest.R file, and the first couple
of lines of the _runme.R files deal with correctly locating this.
Out of source tests now run correctly.

This work was motivated by problems generating the SimpleITK binding,
specifically with some of the more complex enumerations.

This approach does have some issues wrt to code in packages, but I can't
see an alternative. The problem with packages is that the R code setting
up the enumeration structures requires the shared library so that the C
functions returning enumeration values can be called. The enumeration
setup code thus needs to be moved to the package initialisation section.
For SimpleITK I do this using an R script, which I think is an acceptable
solution. The core part of the process is the following function. I dump
all the enumeration stuff into a .onload function. This is only necessary
if some of the enumerations are tricky.

splitSwigFile <- function(filename, onloadfile, mainfile)
{
p1 <- parse(file=filename)

getdefineEnum <- function(X)
{
return (is.call(X) & (X[[1]]=="defineEnumeration"))
}

dd <- sapply(p1, getdefineEnum)

enums <- p1[dd]
enums <- unlist(lapply(enums, deparse))

enums <- c(".onLoad <- function(libname, pkgname) {", enums, "}")

everythingelse <- p1[!dd]
everythingelse <- unlist(lapply(everythingelse, deparse))
writeLines(everythingelse, mainfile)
writeLines(enums, onloadfile)

}
2015-08-10 09:37:04 +10:00
..
android Fix out of source clean-android-examples 2014-05-15 23:28:47 +01:00
chicken Add in CPPFLAGS and LDFLAGS to examples/test-suite 2014-05-15 23:11:08 +01:00
contract Remove bogus ; after } in examples 2014-11-07 15:34:43 +13:00
csharp Remove unused std_string.i from callback examples 2015-05-10 11:49:28 +01:00
d Remove unused std_string.i from callback examples 2015-05-10 11:49:28 +01:00
go [Go] update build instructions in Examples/go/index.html 2015-08-05 07:19:05 -07:00
guile Guile gitignore and consistent naming in examples 2015-04-26 00:17:42 +01:00
java Remove unused std_string.i from callback examples 2015-05-10 11:49:28 +01:00
javascript Eliminate trivial differences between the reference examples 2014-11-07 15:34:43 +13:00
lua Fix line endings in lua example 2014-11-27 20:23:28 +00:00
modula3 Remove bogus ; after } in examples 2014-11-07 15:34:43 +13:00
mzscheme Allow examples and test-suite to be built out of source tree 2014-05-11 23:21:10 +02:00
ocaml Allow examples and test-suite to be built out of source tree 2014-05-11 23:21:10 +02:00
octave Remove unused std_string.i from callback examples 2015-05-10 11:49:28 +01:00
perl5 Remove unused std_string.i from callback examples 2015-05-10 11:49:28 +01:00
php Remove unused std_string.i from callback examples 2015-05-10 11:49:28 +01:00
pike Allow examples and test-suite to be built out of source tree 2014-05-11 23:21:10 +02:00
python Warning fixes in generated Python code for 64bit Visual C++ on Windows. 2015-07-03 20:59:25 +01:00
r Allow examples and test-suite to be built out of source tree 2014-05-11 23:21:10 +02:00
ruby Eliminate trivial differences between the reference examples 2014-11-07 15:34:43 +13:00
s-exp
scilab Fix typo 2015-01-19 07:59:23 +00:00
tcl Eliminate trivial differences between the reference examples 2014-11-07 15:34:43 +13:00
test-suite This is a modification to support use of tricky enumerations in R. It 2015-08-10 09:37:04 +10:00
xml
index.html
Makefile.in [Go] Add Makefile testing support for changes in upcoming Go 1.5 release. 2015-06-19 14:29:38 -07:00
README Improve Examples/README 2014-02-21 08:14:24 +13:00

SWIG Examples

The subdirectories of "Examples" named after SWIG's language backends
contain a number of simple examples that are primarily used for testing.

The file 'index.html' is the top of a hyperlinked document that
contains information about all of the examples along with various
notes related to each example.

Note: All of the examples rely upon the Makefile in this directory.
You may need to edit it to reflect the configuration of your machine
in case the configure script guesses incorrect settings.


*** Special note concerning C++ ***

The configure script is currently unable to handle all of the possible
options for producing dynamically loadable C++ extensions.  Here are
the rules of thumb for making C++ work:

 -  Try using the C++ as the linker for the shared library.  For example:

         g++ -shared $(OBJS) -o module.so

 -  If that doesn't work, you may need to explicitly link against some
    kind of C++ runtime library.  For example:

         ld -G $(OBJS) -L/opt/SUNWspro/lib -lCrun -o module.so

    This can be set by modifying the setting of CPP_DLLIBS in the
    Makefile.


*** Special note for SWIG Maintainers ***

When you add an example, consider arranging for the example to be also
useful as part of the SWIG testing framework.  To do this, include in
the example makefile a target "check" ("check: all" is sufficient for a
first pass), and add an invocation to ../Makefile.in under target
"check-examples" (or whatever is appropriate).  Later, we can add or
expand the actions under target "check" to do more in-depth testing.