unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Re: 04/05: gnu: swig: Patch for Octave 4.4.
       [not found] ` <20180529222052.5A8DA20537@vcs0.savannah.gnu.org>
@ 2018-05-30  6:25   ` Mark H Weaver
  2018-05-30 14:49     ` Kei Kebreau
  2018-05-30 14:49     ` Kei Kebreau
  0 siblings, 2 replies; 7+ messages in thread
From: Mark H Weaver @ 2018-05-30  6:25 UTC (permalink / raw)
  To: Kei Kebreau; +Cc: guix-devel

kkebreau@posteo.net (Kei Kebreau) writes:

> kkebreau pushed a commit to branch master
> in repository guix.
>
> commit 3771000f893d4b53e302f5bca07afeba69e76cd4
> Author: Kei Kebreau <kkebreau@posteo.net>
> Date:   Fri May 25 22:25:21 2018 -0400
>
>     gnu: swig: Patch for Octave 4.4.

On the core-updates branch, "guix refresh -l swig" reports that updating
swig requires 1453 rebuilds.  That's too many, so I reverted it.

Instead, I suggest creating a different 'swig' package for octave that
inherits from the primary one and adds this patch.

What do you think?

      Mark

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: 04/05: gnu: swig: Patch for Octave 4.4.
  2018-05-30  6:25   ` 04/05: gnu: swig: Patch for Octave 4.4 Mark H Weaver
  2018-05-30 14:49     ` Kei Kebreau
@ 2018-05-30 14:49     ` Kei Kebreau
  2018-05-30 18:53       ` Mark H Weaver
  1 sibling, 1 reply; 7+ messages in thread
From: Kei Kebreau @ 2018-05-30 14:49 UTC (permalink / raw)
  To: Mark H Weaver; +Cc: guix-devel


[-- Attachment #1.1: Type: text/plain, Size: 737 bytes --]

Mark H Weaver <mhw@netris.org> writes:

> kkebreau@posteo.net (Kei Kebreau) writes:
>
>> kkebreau pushed a commit to branch master
>> in repository guix.
>>
>> commit 3771000f893d4b53e302f5bca07afeba69e76cd4
>> Author: Kei Kebreau <kkebreau@posteo.net>
>> Date:   Fri May 25 22:25:21 2018 -0400
>>
>>     gnu: swig: Patch for Octave 4.4.
>
> On the core-updates branch, "guix refresh -l swig" reports that updating
> swig requires 1453 rebuilds.  That's too many, so I reverted it.
>
> Instead, I suggest creating a different 'swig' package for octave that
> inherits from the primary one and adds this patch.
>
> What do you think?
>
>       Mark

I agree that this will work. Is the attached patch something like what
you're thinking?

[-- Attachment #1.2: 0001-gnu-shogun-Use-a-patched-swig-for-Octave-4.4.patch --]
[-- Type: text/plain, Size: 40919 bytes --]

From 475a7698fd4c88ea688cb43499344e65ffaf5b84 Mon Sep 17 00:00:00 2001
From: Kei Kebreau <kkebreau@posteo.net>
Date: Wed, 30 May 2018 08:34:42 -0400
Subject: [PATCH] gnu: shogun: Use a patched swig for Octave 4.4.

* gnu/packages/machine-learning.scm (swig-for-octave): New variable
* gnu/packages/machine-learning.scm (shogun)[inputs]: Replace swig with
swig-for-octave.
* gnu/packages/patches/swig-octave-patches.patch: New file.
* gnu/local.mk (dist_patch_DATA): Register patch.
---
 gnu/local.mk                                  |    1 +
 gnu/packages/machine-learning.scm             |   10 +-
 .../patches/swig-octave-patches.patch         | 1119 +++++++++++++++++
 3 files changed, 1129 insertions(+), 1 deletion(-)
 create mode 100644 gnu/packages/patches/swig-octave-patches.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 7734586f0..895d33012 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1106,6 +1106,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/steghide-fixes.patch			\
   %D%/packages/patches/strace-kernel-4.16.patch			\
   %D%/packages/patches/superlu-dist-scotchmetis.patch		\
+  %D%/packages/patches/swig-octave-patches.patch		\
   %D%/packages/patches/swish-e-search.patch			\
   %D%/packages/patches/swish-e-format-security.patch		\
   %D%/packages/patches/synfigstudio-fix-ui-with-gtk3.patch 	\
diff --git a/gnu/packages/machine-learning.scm b/gnu/packages/machine-learning.scm
index e135ee0ee..4d54584a7 100644
--- a/gnu/packages/machine-learning.scm
+++ b/gnu/packages/machine-learning.scm
@@ -365,6 +365,14 @@ value imputation, classifier creation, generalization error estimation and
 sample proximities between pairs of cases.")
     (license license:gpl3+)))
 
+(define swig-for-octave
+  (package/inherit swig
+    (name (string-append (package-name swig) "-for-octave"))
+    (source
+     (origin
+       (inherit (package-source swig))
+       (patches (search-patches "swig-octave-patches.patch"))))))
+
 (define-public shogun
   (package
     (name "shogun")
@@ -487,7 +495,7 @@ sample proximities between pairs of cases.")
        ("numpy" ,python-numpy)
        ("r-minimal" ,r-minimal)
        ("octave" ,octave)
-       ("swig" ,swig)
+       ("swig" ,swig-for-octave)
        ("eigen" ,eigen)
        ("hdf5" ,hdf5)
        ("atlas" ,atlas)
diff --git a/gnu/packages/patches/swig-octave-patches.patch b/gnu/packages/patches/swig-octave-patches.patch
new file mode 100644
index 000000000..9fb64a7b1
--- /dev/null
+++ b/gnu/packages/patches/swig-octave-patches.patch
@@ -0,0 +1,1119 @@
+This patch represents the recently added support for Octave version 4.4 found
+here:
+
+https://github.com/swig/swig/commit/12c66f9b7d884020e896ce92b9783bc3bac95d2d
+
+diff -urN swig-3.0.12.old/CHANGES.current swig-3.0.12.new/CHANGES.current
+--- swig-3.0.12.old/CHANGES.current	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/CHANGES.current	2018-05-26 08:40:06.501850058 -0400
+@@ -4,6 +4,14 @@
+ Issue # numbers mentioned below can be found on Github. For more details, add
+ the issue number to the end of the URL: https://github.com/swig/swig/issues/
+ 
++Version 4.0.0 (in progress)
++===========================
++
++2018-05-12: kwwette
++            [Octave] add support for version 4.4
++            - Should not introduce any user-visible incompatibilities
++
++
+ Version 3.0.12 (27 Jan 2017)
+ ============================
+ 
+diff -urN swig-3.0.12.old/Examples/Makefile.in swig-3.0.12.new/Examples/Makefile.in
+--- swig-3.0.12.old/Examples/Makefile.in	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/Examples/Makefile.in	2018-05-26 08:39:16.510124553 -0400
+@@ -463,7 +463,7 @@
+ # -----------------------------------------------------------------
+ 
+ octave_run:
+-	OCTAVE_HISTFILE=/dev/null $(RUNTOOL) $(OCTAVE) $(OCTAVE_SCRIPT) $(RUNPIPE)
++	env OCTAVE_PATH= OCTAVE_HISTFILE=/dev/null $(RUNTOOL) $(OCTAVE) $(OCTAVE_SCRIPT) $(RUNPIPE)
+ 
+ # -----------------------------------------------------------------
+ # Version display
+diff -urN swig-3.0.12.old/Examples/octave/module_load/runme.m swig-3.0.12.new/Examples/octave/module_load/runme.m
+--- swig-3.0.12.old/Examples/octave/module_load/runme.m	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/Examples/octave/module_load/runme.m	2018-05-26 08:39:16.518124669 -0400
+@@ -5,63 +5,73 @@
+ 
+ # load module
+ clear all;
++assert(exist("swigexample") == 3);
+ swigexample;
++assert(isglobal("swigexample"));
+ assert(cvar.ivar == ifunc);
+-assert(exist("swigexample","var"));
+ clear all
++assert(exist("swigexample") == 3);
+ swigexample;
++assert(isglobal("swigexample"));
+ assert(cvar.ivar == ifunc);
+-assert(exist("swigexample","var"));
+ clear all
+ 
+ # load module in a function globally before base context
+ clear all;
+-function testme
++function testme_1
++  assert(exist("swigexample") == 3);
+   swigexample;
++  assert(isglobal("swigexample"));
+   assert(cvar.ivar == ifunc);
+-  assert(exist("swigexample","var"));
+ endfunction
+-testme
+-testme
++testme_1
++testme_1
++assert(exist("swigexample") == 3);
+ swigexample;
++assert(isglobal("swigexample"));
+ assert(cvar.ivar == ifunc);
+-assert(exist("swigexample","var"));
+ clear all
+-function testme
++function testme_2
++  assert(exist("swigexample") == 3);
+   swigexample;
++  assert(isglobal("swigexample"));
+   assert(cvar.ivar == ifunc);
+-  assert(exist("swigexample","var"));
+ endfunction
+-testme
+-testme
++testme_2
++testme_2
++assert(exist("swigexample") == 3);
+ swigexample;
++assert(isglobal("swigexample"));
+ assert(cvar.ivar == ifunc);
+-assert(exist("swigexample","var"));
+ clear all
+ 
+ # load module in a function globally after base context
+ clear all;
++assert(exist("swigexample") == 3);
+ swigexample;
++assert(isglobal("swigexample"));
+ assert(cvar.ivar == ifunc);
+-assert(exist("swigexample","var"));
+-function testme
++function testme_3
++  assert(exist("swigexample") == 3);
+   swigexample;
++  assert(isglobal("swigexample"));
+   assert(cvar.ivar == ifunc);
+-  assert(exist("swigexample","var"));
+ endfunction
+-testme
+-testme
++testme_3
++testme_3
+ clear all
++assert(exist("swigexample") == 3);
+ swigexample;
++assert(isglobal("swigexample"));
+ assert(cvar.ivar == ifunc);
+-assert(exist("swigexample","var"));
+-function testme
++function testme_4
++  assert(exist("swigexample") == 3);
+   swigexample;
++  assert(isglobal("swigexample"));
+   assert(cvar.ivar == ifunc);
+-  assert(exist("swigexample","var"));
+ endfunction
+-testme
+-testme
++testme_4
++testme_4
+ clear all
+ 
+ # octave 3.0.5 randomly crashes on the remaining tests
+@@ -71,13 +81,16 @@
+ 
+ # load module with no cvar
+ clear all;
++who;
++assert(exist("swigexample2") == 3);
+ swigexample2;
++assert(isglobal("swigexample2"));
+ assert(swigexample2.ivar == ifunc);
+-assert(exist("swigexample2","var"));
+-assert(!isglobal("cvar"))
++assert(!exist("cvar", "var"));
+ clear all
++assert(exist("swigexample2") == 3);
+ swigexample2;
++assert(isglobal("swigexample2"));
+ assert(swigexample2.ivar == ifunc);
+-assert(exist("swigexample2","var"));
+-assert(!isglobal("cvar"))
++assert(!exist("cvar", "var"));
+ clear all
+diff -urN swig-3.0.12.old/Examples/test-suite/octave/Makefile.in swig-3.0.12.new/Examples/test-suite/octave/Makefile.in
+--- swig-3.0.12.old/Examples/test-suite/octave/Makefile.in	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/Examples/test-suite/octave/Makefile.in	2018-05-26 08:39:16.511124567 -0400
+@@ -59,7 +59,7 @@
+ # a file is found which has _runme.m appended after the testcase name.
+ run_testcase = \
+ 	if [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \
+-	  env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH OCTAVE_PATH=$(srcdir):$$OCTAVE_PATH $(RUNTOOL) $(OCTAVE) $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); \
++	  env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH OCTAVE_PATH=$(srcdir) OCTAVE_HISTFILE=/dev/null $(RUNTOOL) $(OCTAVE) $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); \
+ 	fi
+ 
+ # Clean: remove the generated .m file
+diff -urN swig-3.0.12.old/Examples/test-suite/octave/Makefile.in.orig swig-3.0.12.new/Examples/test-suite/octave/Makefile.in.orig
+--- swig-3.0.12.old/Examples/test-suite/octave/Makefile.in.orig	1969-12-31 19:00:00.000000000 -0500
++++ swig-3.0.12.new/Examples/test-suite/octave/Makefile.in.orig	2017-01-27 18:52:02.000000000 -0500
+@@ -0,0 +1,92 @@
++#######################################################################
++# Makefile for octave test-suite
++#######################################################################
++
++LANGUAGE     = octave
++OCTAVE       = @OCTAVE@
++SCRIPTSUFFIX = _runme.m
++
++srcdir       = @srcdir@
++top_srcdir   = @top_srcdir@
++top_builddir = @top_builddir@
++
++CPP_TEST_CASES += \
++	li_std_pair_extra \
++	li_std_string_extra \
++	octave_cell_deref\
++	octave_dim
++
++CPP_TEST_BROKEN += \
++	implicittest \
++	li_implicit \
++	li_std_set \
++	li_std_stream
++
++#C_TEST_CASES +=
++
++#
++# This test only works with modern C compilers
++#
++#C_TEST_CASES += \
++#	complextest
++
++include $(srcdir)/../common.mk
++
++# Overridden variables here
++LIBS       = -L.
++CSRCS      = octave_empty.c
++
++# Custom tests - tests with additional commandline options
++# none!
++
++# Rules for the different types of tests
++%.cpptest:
++	$(setup)
++	+$(swig_and_compile_cpp)
++	$(run_testcase)
++
++%.ctest:
++	$(setup)
++	+$(swig_and_compile_c)
++	$(run_testcase)
++
++%.multicpptest:
++	$(setup)
++	+$(swig_and_compile_multi_cpp)
++	$(run_testcase)
++
++# Runs the testcase. A testcase is only run if
++# a file is found which has _runme.m appended after the testcase name.
++run_testcase = \
++	if [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \
++	  env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH OCTAVE_PATH=$(srcdir):$$OCTAVE_PATH $(RUNTOOL) $(OCTAVE) $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); \
++	fi
++
++# Clean: remove the generated .m file
++%.clean:
++	@rm -f hugemod.h hugemod_a.i hugemod_b.i hugemod_a.m hugemod_b.m hugemod_runme.m
++	@rm -f $*.m;
++
++clean:
++	$(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile SRCDIR='$(SRCDIR)' octave_clean
++
++cvsignore:
++	@echo '*wrap* *.mc *.so *.dll *.exp *.lib'
++	@echo Makefile
++	@for i in ${CPP_TEST_CASES} ${C_TEST_CASES}; do echo $$i.m; done
++	@for i in ${CPP_TEST_CASES} ${C_TEST_CASES}; do if grep -q $${i}_runme.m CVS/Entries ; then echo $${i}_runme.m; fi; done
++	@echo clientdata_prop_a.m
++	@echo clientdata_prop_b.m
++	@echo imports_a.m
++	@echo imports_b.m
++	@echo mod_a.m mod_b.m
++	@echo hugemod.h hugemod_a.i hugemod_b.i hugemod_a.m hugemod_b.m hugemod_runme.m
++	@echo template_typedef_import.m
++
++
++hugemod:
++	perl hugemod.pl
++	$(MAKE) hugemod_a.cpptest
++	$(MAKE) hugemod_b.cpptest
++	time $(OCTAVE) hugemod_runme.m
++	time $(OCTAVE) hugemod_runme.m
+diff -urN swig-3.0.12.old/Examples/test-suite/register_par.i swig-3.0.12.new/Examples/test-suite/register_par.i
+--- swig-3.0.12.old/Examples/test-suite/register_par.i	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/Examples/test-suite/register_par.i	2018-05-26 08:40:28.146164544 -0400
+@@ -2,5 +2,5 @@
+ 
+ // bug # 924413
+ %inline {
+-  void clear_tree_flags(register struct tree *tp, register int i) {}
++  void clear_tree_flags(register struct swig_tree *tp, register int i) {}
+ }
+diff -urN swig-3.0.12.old/Examples/test-suite/register_par.i.orig swig-3.0.12.new/Examples/test-suite/register_par.i.orig
+--- swig-3.0.12.old/Examples/test-suite/register_par.i.orig	1969-12-31 19:00:00.000000000 -0500
++++ swig-3.0.12.new/Examples/test-suite/register_par.i.orig	2018-05-26 08:39:16.518124669 -0400
+@@ -0,0 +1,6 @@
++%module register_par
++
++// bug # 924413
++%inline {
++  void clear_tree_flags(register struct tree *tp, register int i) {}
++}
+diff -urN swig-3.0.12.old/Examples/test-suite/register_par.i.rej swig-3.0.12.new/Examples/test-suite/register_par.i.rej
+--- swig-3.0.12.old/Examples/test-suite/register_par.i.rej	1969-12-31 19:00:00.000000000 -0500
++++ swig-3.0.12.new/Examples/test-suite/register_par.i.rej	2018-05-26 08:39:16.518124669 -0400
+@@ -0,0 +1,15 @@
++--- Examples/test-suite/register_par.i
+++++ Examples/test-suite/register_par.i
++@@ -1,10 +1,10 @@
++ %module register_par
++ 
++ %{
++-struct tree;
+++struct swig_tree;
++ %}
++ 
++ // bug # 924413
++ %inline {
++-  void clear_tree_flags(register struct tree *tp, register int i) {}
+++  void clear_tree_flags(register struct swig_tree *tp, register int i) {}
++ }
+diff -urN swig-3.0.12.old/Lib/octave/octcontainer.swg swig-3.0.12.new/Lib/octave/octcontainer.swg
+--- swig-3.0.12.old/Lib/octave/octcontainer.swg	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/Lib/octave/octcontainer.swg	2018-05-26 08:39:16.488124234 -0400
+@@ -567,7 +567,11 @@
+ 	  if (seq) *seq = p;
+ 	  return SWIG_OLDOBJ;
+ 	}
++%#if SWIG_OCTAVE_PREREQ(4,4,0)
++      } else if (obj.iscell()) {
++%#else
+       } else if (obj.is_cell()) {
++%#endif
+ 	try {
+ 	  OctSequence_Cont<value_type> octseq(obj);
+ 	  if (seq) {
+diff -urN swig-3.0.12.old/Lib/octave/octprimtypes.swg swig-3.0.12.new/Lib/octave/octprimtypes.swg
+--- swig-3.0.12.old/Lib/octave/octprimtypes.swg	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/Lib/octave/octprimtypes.swg	2018-05-26 08:39:16.492124292 -0400
+@@ -18,7 +18,11 @@
+ SWIGINTERN int
+ SWIG_AsVal_dec(bool)(const octave_value& ov, bool *val)
+ {
++%#if SWIG_OCTAVE_PREREQ(4,4,0)
++  if (!ov.islogical())
++%#else
+   if (!ov.is_bool_type())
++%#endif
+     return SWIG_ERROR;
+   if (val)
+     *val = ov.bool_value();
+@@ -214,7 +218,13 @@
+ SWIGINTERN int
+ SWIG_AsCharPtrAndSize(octave_value ov, char** cptr, size_t* psize, int *alloc)
+ {
+-  if (ov.is_cell() && ov.rows() == 1 && ov.columns() == 1)
++  if (
++%#if SWIG_OCTAVE_PREREQ(4,4,0)
++    ov.iscell()
++%#else
++    ov.is_cell()
++%#endif
++    && ov.rows() == 1 && ov.columns() == 1)
+     ov = ov.cell_value()(0);
+   if (!ov.is_string())
+     return SWIG_TypeError;
+diff -urN swig-3.0.12.old/Lib/octave/octrun.swg swig-3.0.12.new/Lib/octave/octrun.swg
+--- swig-3.0.12.old/Lib/octave/octrun.swg	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/Lib/octave/octrun.swg	2018-05-26 08:39:16.509124538 -0400
+@@ -151,6 +151,67 @@
+     const swig_type_info **base;
+   };
+ 
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++  // in Octave 4.4 behaviour of octave_builtin() appears to have changed and 'self' argument is no longer passed
++  // to function (maybe because this is now a 'method'??) so need to create our own octave_function subclass
++#define SWIG_OCTAVE_BOUND_FUNC(func, args) octave_value(new octave_swig_bound_func(func, args))
++  class octave_swig_bound_func : public octave_function {
++  public:
++
++    octave_swig_bound_func(void) : octave_function(), method(0), first_args()
++      { }
++
++    octave_swig_bound_func(octave_function* _method, octave_value_list _first_args)
++      : octave_function("", ""), method(_method), first_args(_first_args)
++      { }
++
++    octave_swig_bound_func(const octave_swig_bound_func& f) = delete;
++
++    octave_swig_bound_func& operator= (const octave_swig_bound_func& f) = delete;
++
++    ~octave_swig_bound_func(void) = default;
++
++    bool is_function(void) const { return true; }
++
++    octave_function* function_value(bool = false) { return this; }
++
++    octave_value_list call(octave::tree_evaluator& tw, int nargout = 0, const octave_value_list& args = octave_value_list()) {
++      octave_value_list all_args;
++      all_args.append(first_args);
++      all_args.append(args);
++      return method->call(tw, nargout, all_args);
++    }
++
++    octave_value subsref(const std::string &ops, const std::list < octave_value_list > &idx) {
++      octave_value_list ovl = subsref(ops, idx, 1);
++      return ovl.length() ? ovl(0) : octave_value();
++    }
++
++    octave_value_list subsref(const std::string &ops, const std::list < octave_value_list > &idx, int nargout) {
++      assert(ops.size() > 0);
++      assert(ops.size() == idx.size());
++      if (ops != "(")
++        error("invalid function call");
++      octave::tree_evaluator& tw = octave::interpreter::the_interpreter()->get_evaluator();
++      return call(tw, nargout, *idx.begin());
++    }
++
++  protected:
++
++    octave_function* method;
++    octave_value_list first_args;
++
++    std::set<std::string> dispatch_classes;
++
++  private:
++
++    DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA
++  };
++  DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA(octave_swig_bound_func, "octave_swig_bound_func", "octave_swig_bound_func");
++#else
++#define SWIG_OCTAVE_BOUND_FUNC(func, args) octave_value(func)
++#endif
++
+   // octave_swig_type plays the role of both the shadow class and the class 
+   // representation within Octave, since there is no support for classes.
+   //
+@@ -323,13 +384,17 @@
+     }
+ 
+     octave_value_list member_deref(member_value_pair *m, const octave_value_list &args) {
+-      if (m->second.is_defined())
+-	return m->second;
+-      else if (m->first) {
++      if (m->second.is_defined()) {
++        if (m->second.is_function() || m->second.is_function_handle()) {
++          return SWIG_OCTAVE_BOUND_FUNC(m->second.function_value(), args);
++        } else {
++          return m->second;
++        }
++      } else if (m->first) {
+ 	if (m->first->get_method)
+ 	  return m->first->get_method(args, 1);
+ 	else if (m->first->method)
+-	  return octave_value(new octave_builtin(m->first->method));
++          return SWIG_OCTAVE_BOUND_FUNC(new octave_builtin(m->first->method), args);
+       }
+       error("undefined member");
+       return octave_value_list();
+@@ -383,7 +448,11 @@
+         return dim_vector(1,1);
+ 
+       // Return value should be cell or matrix of integers
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++      if (out.iscell()) {
++#else
+       if (out.is_cell()) {
++#endif
+         const Cell & c=out.cell_value();
+         int ndim = c.rows();
+         if (ndim==1 && c.columns()!=1) ndim = c.columns();
+@@ -401,7 +470,11 @@
+           if (error_state) return dim_vector(1,1);
+         }
+         return d;
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++      } else if (out.is_matrix_type() || out.isnumeric() ) {
++#else
+       } else if (out.is_matrix_type() || out.is_numeric_type() ) {
++#endif
+         if (out.rows()==1 || out.columns()==1) {
+            Array<int> a = out.int_vector_value();
+            if (error_state) return dim_vector(1,1);
+@@ -476,8 +549,12 @@
+       }
+       types.insert(types.end(), rhs.types.begin(), rhs.types.end());
+       members.insert(rhs.members.begin(), rhs.members.end());
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++      assign(rhs.swig_type_name(), rhs.as_value());
++#else
+       rhs.types.clear();
+       rhs.members.clear();
++#endif
+     }
+ 
+     typedef member_map::const_iterator swig_member_const_iterator;
+@@ -848,7 +925,14 @@
+       octave_function *fcn = is_valid_function(symbol, std::string(), false);
+       if (!fcn)
+ 	return false;
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++      octave::tree_evaluator& tw = octave::interpreter::the_interpreter()->get_evaluator();
++      octave_value_list retval = fcn->call(tw, 1, args);
++      if (retval.length() == 1)
++        ret = retval(0);
++#else
+       ret = fcn->do_multi_index_op(1, args)(0);
++#endif
+       return true;
+     }
+ 
+@@ -1238,7 +1322,13 @@
+   }
+ 
+   SWIGRUNTIME octave_swig_type *swig_value_deref(octave_value ov) {
+-    if (ov.is_cell() && ov.rows() == 1 && ov.columns() == 1)
++    if (
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++      ov.iscell()
++#else
++      ov.is_cell()
++#endif
++      && ov.rows() == 1 && ov.columns() == 1)
+       ov = ov.cell_value()(0);
+     return swig_value_deref(*ov.internal_rep());
+   }
+@@ -1261,12 +1351,24 @@
+ SWIGRUNTIME octave_value swig_binary_op_##name(const octave_base_value&lhs,const octave_base_value &rhs) { \
+   return octave_swig_type::dispatch_binary_op(lhs,rhs,#name); \
+ }
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++#define swigreg_unary_op(name) \
++if (!octave_value_typeinfo::lookup_unary_op(octave_value::op_##name,tid)) \
++typeinfo.register_unary_op(octave_value::op_##name,tid,swig_unary_op_##name);
++#else
+ #define swigreg_unary_op(name) \
+ if (!octave_value_typeinfo::lookup_unary_op(octave_value::op_##name,tid)) \
+ octave_value_typeinfo::register_unary_op(octave_value::op_##name,tid,swig_unary_op_##name);
++#endif
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++#define swigreg_binary_op(name) \
++if (!octave_value_typeinfo::lookup_binary_op(octave_value::op_##name,tid1,tid2)) \
++typeinfo.register_binary_op(octave_value::op_##name,tid1,tid2,swig_binary_op_##name);
++#else
+ #define swigreg_binary_op(name) \
+ if (!octave_value_typeinfo::lookup_binary_op(octave_value::op_##name,tid1,tid2)) \
+ octave_value_typeinfo::register_binary_op(octave_value::op_##name,tid1,tid2,swig_binary_op_##name);
++#endif
+ 
+   swig_unary_op(not);
+   swig_unary_op(uplus);
+@@ -1300,6 +1402,9 @@
+   swig_binary_op(el_or);
+ 
+   SWIGRUNTIME void SWIG_InstallUnaryOps(int tid) {
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++    octave::type_info& typeinfo = octave::interpreter::the_interpreter()->get_type_info();
++#endif
+     swigreg_unary_op(not);
+     swigreg_unary_op(uplus);
+     swigreg_unary_op(uminus);
+@@ -1309,6 +1414,9 @@
+     swigreg_unary_op(decr);
+   }
+   SWIGRUNTIME void SWIG_InstallBinaryOps(int tid1, int tid2) {
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++    octave::type_info& typeinfo = octave::interpreter::the_interpreter()->get_type_info();
++#endif
+     swigreg_binary_op(add);
+     swigreg_binary_op(sub);
+     swigreg_binary_op(mul);
+@@ -1357,7 +1465,13 @@
+ }
+ 
+ SWIGRUNTIME int SWIG_Octave_ConvertPtrAndOwn(octave_value ov, void **ptr, swig_type_info *type, int flags, int *own) {
+-  if (ov.is_cell() && ov.rows() == 1 && ov.columns() == 1)
++    if (
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++      ov.iscell()
++#else
++      ov.is_cell()
++#endif
++      && ov.rows() == 1 && ov.columns() == 1)
+     ov = ov.cell_value()(0);
+   if (!ov.is_defined() ||
+       (ov.is_matrix_type() && ov.rows() == 0 && ov.columns() == 0) ) {
+@@ -1390,14 +1504,30 @@
+ }
+ 
+ SWIGRUNTIMEINLINE octave_value SWIG_Octave_GetGlobalValue(std::string name) {
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++  octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table();
++  return symtab.global_varval(name);
++#else
+   return get_global_value(name, true);
++#endif
+ }
+ 
+ SWIGRUNTIME void SWIG_Octave_SetGlobalValue(std::string name, const octave_value& value) {
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++  octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table();
++  symtab.global_assign(name, value);
++#else
+   set_global_value(name, value);
++#endif
+ }
+ 
+ SWIGRUNTIME void SWIG_Octave_LinkGlobalValue(std::string name) {
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++  octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table();
++  octave::symbol_scope symscope = octave::interpreter::the_interpreter()->get_current_scope();
++  symscope.assign(name, symtab.global_varval(name));
++  symscope.mark_global(name);
++#else
+ #if !SWIG_OCTAVE_PREREQ(3,2,0)
+   link_to_global_variable(curr_sym_tab->lookup(name, true));
+ #else
+@@ -1406,6 +1536,7 @@
+ #endif
+   symbol_table::mark_global(name);
+ #endif
++#endif
+ }
+ 
+ SWIGRUNTIME swig_module_info *SWIG_Octave_GetModule(void *clientdata) {
+diff -urN swig-3.0.12.old/Lib/octave/octruntime.swg swig-3.0.12.new/Lib/octave/octruntime.swg
+--- swig-3.0.12.old/Lib/octave/octruntime.swg	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/Lib/octave/octruntime.swg	2018-05-26 08:39:16.507124509 -0400
+@@ -139,7 +139,11 @@
+ #endif
+ #if SWIG_OCTAVE_PREREQ(4,2,0)
+     try {
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++      octave::feval(name, octave_value_list(), 0);
++#else
+       feval(name, octave_value_list(), 0);
++#endif
+       retn = true;
+     } catch (octave::execution_exception&) { }
+ #else
+@@ -170,7 +174,7 @@
+     frame.protect_var(discard_error_messages);          discard_error_messages = true;
+     frame.protect_var(discard_warning_messages);        discard_warning_messages = true;
+ #else
+-    unwind_protect::begin_frame("SWIG_Octave_LoadModule");
++    unwind_protect::begin_frame("SWIG_Octave_InstallFunction");
+     unwind_protect_int(error_state);                    error_state = 0;
+     unwind_protect_int(warning_state);                  warning_state = 0;
+     unwind_protect_bool(discard_error_messages);        discard_error_messages = true;
+@@ -181,7 +185,11 @@
+     args.append(octloadfcn->fcn_file_name());
+ #if SWIG_OCTAVE_PREREQ(4,2,0)
+     try {
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++      octave::feval("autoload", args, 0);
++#else
+       feval("autoload", args, 0);
++#endif
+       retn = true;
+     } catch (octave::execution_exception&) { }
+ #else
+@@ -312,6 +320,8 @@
+ Loads the SWIG-generated module `" SWIG_name_d "'.\n\
+ @end deftypefn";
+ 
++void __swig_atexit__(void) { ::_Exit(0); }
++
+ DEFUN_DLD( SWIG_name, args, nargout, SWIG_name_usage ) {
+ 
+   static octave_swig_type* module_ns = 0;
+@@ -322,7 +332,9 @@
+   // version 3.4.*, but reappeared in 4.2.*, so turn on for all versions after 3.2.*.
+   // can be turned off with macro definition.
+ #ifndef SWIG_OCTAVE_NO_SEGFAULT_HACK
+-#if SWIG_OCTAVE_PREREQ(3,2,0)
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++  atexit(__swig_atexit__);
++#elif SWIG_OCTAVE_PREREQ(3,2,0)
+   octave_exit = ::_Exit;
+ #endif
+ #endif
+@@ -351,15 +363,54 @@
+                      "__swig_atexit__; "
+                      "atexit(\"__swig_atexit__\", false); "
+                      "atexit(\"__swig_atexit__\")");
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++    octave::feval("evalin", eval_args, 0);
++#else
+     feval("evalin", eval_args, 0);
+ #endif
++#endif
+ 
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++    {
++      octave::type_info& typeinfo = octave::interpreter::the_interpreter()->get_type_info();
++      string_vector types = typeinfo.installed_type_names();
++      bool register_octave_swig_ref = true;
++      bool register_octave_swig_packed = true;
++      bool register_octave_swig_bound_func = true;
++      for (int i = 0; i < types.numel(); ++i) {
++        if (types(i) == octave_swig_ref::static_type_name()) {
++          register_octave_swig_ref = false;
++        }
++        if (types(i) == octave_swig_packed::static_type_name()) {
++          register_octave_swig_packed = false;
++        }
++        if (types(i) == octave_swig_bound_func::static_type_name()) {
++          register_octave_swig_bound_func = false;
++        }
++      }
++      if (register_octave_swig_ref) {
++        octave_swig_ref::register_type();
++      }
++      if (register_octave_swig_packed) {
++        octave_swig_packed::register_type();
++      }
++      if (register_octave_swig_bound_func) {
++        octave_swig_bound_func::register_type();
++      }
++    }
++#else
+     octave_swig_ref::register_type();
+     octave_swig_packed::register_type();
++#endif
+     SWIG_InitializeModule(0);
+     SWIG_PropagateClientData();
+ 
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++    octave::call_stack& stack = octave::interpreter::the_interpreter()->get_call_stack();
++    octave_function *me = stack.current();
++#else
+     octave_function *me = octave_call_stack::current();
++#endif
+ 
+     if (!SWIG_Octave_InstallFunction(me, "subclass")) {
+       return octave_value_list();
+@@ -426,10 +477,12 @@
+       }
+     }
+ 
+-#if !SWIG_OCTAVE_PREREQ(3,2,0)
+-    mlock(me->name());
+-#else
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++    octave::interpreter::the_interpreter()->mlock();
++#elif SWIG_OCTAVE_PREREQ(3,2,0)
+     mlock();
++#else
++    mlock(me->name());
+ #endif
+ 
+   }
+diff -urN swig-3.0.12.old/Lib/octave/std_pair.i swig-3.0.12.new/Lib/octave/std_pair.i
+--- swig-3.0.12.old/Lib/octave/std_pair.i	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/Lib/octave/std_pair.i	2018-05-26 08:39:16.489124248 -0400
+@@ -38,7 +38,13 @@
+       }
+ 
+       static int asval(const octave_value& obj, std::pair<T,U> *val) {
+-	if (obj.is_cell()) {
++	if (
++%#if SWIG_OCTAVE_PREREQ(4,4,0)
++          obj.iscell()
++%#else
++          obj.is_cell()
++%#endif
++        ) {
+ 	  Cell c=obj.cell_value();
+ 	  if (c.numel()<2) {
+ 	    error("pair from Cell array requires at least two elements");
+@@ -96,7 +102,13 @@
+       }
+ 
+       static int asptr(const octave_value& obj, std::pair<T,U> **val) {
+-	if (obj.is_cell()) {
++	if (
++%#if SWIG_OCTAVE_PREREQ(4,4,0)
++          obj.iscell()
++%#else
++          obj.is_cell()
++%#endif
++        ) {
+ 	  Cell c=obj.cell_value();
+ 	  if (c.numel()<2) {
+ 	    error("pair from Cell array requires at least two elements");
+diff -urN swig-3.0.12.old/.travis.yml swig-3.0.12.new/.travis.yml
+--- swig-3.0.12.old/.travis.yml	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/.travis.yml	2018-05-26 08:39:16.520124698 -0400
+@@ -92,6 +92,11 @@
+       dist: trusty
+     - compiler: gcc
+       os: linux
++      env: SWIGLANG=octave SWIGJOBS=-j2 VER=4.4 CPP11=1
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
+       env: SWIGLANG=perl5
+       sudo: required
+       dist: trusty
+diff -urN swig-3.0.12.old/.travis.yml.orig swig-3.0.12.new/.travis.yml.orig
+--- swig-3.0.12.old/.travis.yml.orig	1969-12-31 19:00:00.000000000 -0500
++++ swig-3.0.12.new/.travis.yml.orig	2017-01-27 18:52:02.000000000 -0500
+@@ -0,0 +1,334 @@
++language: cpp
++matrix:
++  include:
++    - compiler: clang
++      os: linux
++      env: SWIGLANG=
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=
++      sudo: required
++      dist: trusty
++    - os: linux
++      env: SWIGLANG= SWIG_CC=gcc-5 SWIG_CXX=g++-5 CPP11=1
++      sudo: required
++      dist: trusty
++    - os: linux
++      env: SWIGLANG= SWIG_CC=gcc-6 SWIG_CXX=g++-6
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=csharp
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=d
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=go
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=go VER=1.5
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=guile
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=java
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=javascript ENGINE=node
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=javascript ENGINE=jsc
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=javascript ENGINE=v8
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=lua
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=lua VER=5.3
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=octave SWIGJOBS=-j2 # 3.8
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=octave SWIGJOBS=-j2 VER=4.0
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=octave SWIGJOBS=-j2 VER=4.2 CPP11=1
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=perl5
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=php5
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=php VER=7.0
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=php VER=7.1
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python VER=2.4
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python VER=2.5
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python VER=2.6
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python # 2.7
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python PY3=3 VER=3.2
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python PY3=3 VER=3.3
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python PY3=3 VER=3.4
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python PY3=3 VER=3.5
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python SWIG_FEATURES=-builtin VER=2.6
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python SWIG_FEATURES=-builtin
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.4
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.5
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.5 SWIGOPTPY3=
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python SWIG_FEATURES=-O
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python SWIG_FEATURES=-classic
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=r
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=ruby VER=1.9.3
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=ruby VER=2.0.0
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=ruby VER=2.3.0
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=scilab
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=tcl
++      sudo: required
++      dist: trusty
++    - os: linux
++      env: SWIGLANG=csharp SWIG_CC=gcc-5 SWIG_CXX=g++-5 CPP11=1
++      sudo: required
++      dist: trusty
++    - os: linux
++      env: SWIGLANG=java SWIG_CC=gcc-5 SWIG_CXX=g++-5 CPP11=1
++      sudo: required
++      dist: trusty
++    - os: linux
++      env: SWIGLANG=python SWIG_CC=gcc-5 SWIG_CXX=g++-5 CPP11=1
++      sudo: required
++      dist: trusty
++    - os: linux
++      env: SWIGLANG=csharp SWIG_CC=gcc-6 SWIG_CXX=g++-6 CPP14=1
++      sudo: required
++      dist: trusty
++    - os: linux
++      env: SWIGLANG=java SWIG_CC=gcc-6 SWIG_CXX=g++-6 CPP14=1
++      sudo: required
++      dist: trusty
++    - os: linux
++      env: SWIGLANG=python SWIG_CC=gcc-6 SWIG_CXX=g++-6 CPP14=1
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: osx
++      env: SWIGLANG=
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=csharp
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=go
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=guile
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=java
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=lua
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=perl5
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=php5
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=python
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=python PY3=3
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=ruby
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=tcl
++
++  allow_failures:
++    # Lots of failing tests currently
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=ocaml
++      sudo: required
++      dist: trusty
++    # Not quite working yet
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python SWIG_FEATURES=-O
++      sudo: required
++      dist: trusty
++before_install:
++  - date -u
++  - uname -a
++  - if test "$TRAVIS_OS_NAME" = "linux"; then lscpu && cat /proc/cpuinfo | grep "model name" && cat /proc/meminfo | grep MemTotal; fi
++  - if test "$TRAVIS_OS_NAME" = "osx"; then sysctl -a | grep brand_string; fi
++    # Travis overrides CC environment with compiler predefined values
++  - if test -n "$SWIG_CC"; then export CC="$SWIG_CC"; fi
++  - if test -n "$SWIG_CXX"; then export CXX="$SWIG_CXX"; fi
++install:
++  - if test "$TRAVIS_OS_NAME" = "linux"; then source Tools/travis-linux-install.sh; fi
++  - if test "$TRAVIS_OS_NAME" = "osx"; then source Tools/travis-osx-install.sh; fi
++  - if test -n "$CPP11"; then CONFIGOPTS+=(--enable-cpp11-testing --without-maximum-compile-warnings "CXXFLAGS=-std=c++11 -Wall -Wextra" "CFLAGS=-std=c11 -Wall -Wextra") && export CSTD=c11 && export CPPSTD=c++11; fi
++  - if test -n "$CPP14"; then CONFIGOPTS+=(--enable-cpp11-testing --without-maximum-compile-warnings "CXXFLAGS=-std=c++14 -Wall -Wextra" "CFLAGS=-std=c11 -Wall -Wextra") && export CSTD=c11 && export CPPSTD=c++14; fi
++  - ls -la $(which $CC)
++  - ls -la $(which $CXX)
++  - $CC --version
++  - $CXX --version
++script:
++  - echo 'Configuring...' && echo -en 'travis_fold:start:script.1\\r'
++  - if test -n "$SWIGLANG"; then CONFIGOPTS+=(--without-alllang --with-$WITHLANG); fi
++  - echo "${CONFIGOPTS[@]}"
++  - ./autogen.sh && mkdir -p build/build && cd build/build && ../../configure "${CONFIGOPTS[@]}"
++  - echo -en 'travis_fold:end:script.1\\r'
++  - make -s $SWIGJOBS
++  - ./swig -version && ./swig -pcreversion
++  - if test -z "$SWIGLANG"; then make -s $SWIGJOBS check-ccache; fi
++  - if test -z "$SWIGLANG"; then make -s $SWIGJOBS check-errors-test-suite; fi
++  - echo 'Installing...' && echo -en 'travis_fold:start:script.2\\r'
++  - if test -z "$SWIGLANG"; then sudo make -s install && swig -version && ccache-swig -V; fi
++  - echo -en 'travis_fold:end:script.2\\r'
++  # Stricter compile flags for examples. Various headers and SWIG generated code prevents full use of -pedantic.
++  - if test -n "$SWIGLANG"; then cflags=$($TRAVIS_BUILD_DIR/Tools/testflags.py --language $SWIGLANG --cflags --std=$CSTD --compiler=$CC) && echo $cflags; fi
++  - if test -n "$SWIGLANG"; then cxxflags=$($TRAVIS_BUILD_DIR/Tools/testflags.py --language $SWIGLANG --cxxflags --std=$CPPSTD --compiler=$CC) && echo $cxxflags; fi
++  - if test -n "$SWIGLANG"; then make -s check-$SWIGLANG-version; fi
++  - if test -n "$SWIGLANG"; then make check-$SWIGLANG-enabled; fi
++  - if test -n "$SWIGLANG"; then make $SWIGJOBS check-$SWIGLANG-examples CFLAGS="$cflags" CXXFLAGS="$cxxflags"; fi
++  - if test -n "$SWIGLANG"; then make $SWIGJOBS check-$SWIGLANG-test-suite CFLAGS="$cflags" CXXFLAGS="$cxxflags"; fi
++  - echo 'Cleaning...' && echo -en 'travis_fold:start:script.3\\r'
++  - make check-maintainer-clean && ../../configure $CONFIGOPTS
++  - echo -en 'travis_fold:end:script.3\\r'
-- 
2.17.1


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: 04/05: gnu: swig: Patch for Octave 4.4.
  2018-05-30  6:25   ` 04/05: gnu: swig: Patch for Octave 4.4 Mark H Weaver
@ 2018-05-30 14:49     ` Kei Kebreau
  2018-05-30 14:49     ` Kei Kebreau
  1 sibling, 0 replies; 7+ messages in thread
From: Kei Kebreau @ 2018-05-30 14:49 UTC (permalink / raw)
  To: Mark H Weaver; +Cc: guix-devel


[-- Attachment #1.1: Type: text/plain, Size: 838 bytes --]

Mark H Weaver <mhw@netris.org> writes:

> kkebreau@posteo.net (Kei Kebreau) writes:
>
>> kkebreau pushed a commit to branch master
>> in repository guix.
>>
>> commit 3771000f893d4b53e302f5bca07afeba69e76cd4
>> Author: Kei Kebreau <kkebreau@posteo.net>
>> Date:   Fri May 25 22:25:21 2018 -0400
>>
>>     gnu: swig: Patch for Octave 4.4.
>
> On the core-updates branch, "guix refresh -l swig" reports that updating
> swig requires 1453 rebuilds.  That's too many, so I reverted it.
>
> Instead, I suggest creating a different 'swig' package for octave that
> inherits from the primary one and adds this patch.
>
> What do you think?
>
>       Mark

I agree that this will work. Is the attached patch something like what
you're thinking?

(Apologies if you get two of these messages; it seems to me like the
first one didn't go through.)


[-- Attachment #1.2: 0001-gnu-shogun-Use-a-patched-swig-for-Octave-4.4.patch --]
[-- Type: text/plain, Size: 40919 bytes --]

From 475a7698fd4c88ea688cb43499344e65ffaf5b84 Mon Sep 17 00:00:00 2001
From: Kei Kebreau <kkebreau@posteo.net>
Date: Wed, 30 May 2018 08:34:42 -0400
Subject: [PATCH] gnu: shogun: Use a patched swig for Octave 4.4.

* gnu/packages/machine-learning.scm (swig-for-octave): New variable
* gnu/packages/machine-learning.scm (shogun)[inputs]: Replace swig with
swig-for-octave.
* gnu/packages/patches/swig-octave-patches.patch: New file.
* gnu/local.mk (dist_patch_DATA): Register patch.
---
 gnu/local.mk                                  |    1 +
 gnu/packages/machine-learning.scm             |   10 +-
 .../patches/swig-octave-patches.patch         | 1119 +++++++++++++++++
 3 files changed, 1129 insertions(+), 1 deletion(-)
 create mode 100644 gnu/packages/patches/swig-octave-patches.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 7734586f0..895d33012 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1106,6 +1106,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/steghide-fixes.patch			\
   %D%/packages/patches/strace-kernel-4.16.patch			\
   %D%/packages/patches/superlu-dist-scotchmetis.patch		\
+  %D%/packages/patches/swig-octave-patches.patch		\
   %D%/packages/patches/swish-e-search.patch			\
   %D%/packages/patches/swish-e-format-security.patch		\
   %D%/packages/patches/synfigstudio-fix-ui-with-gtk3.patch 	\
diff --git a/gnu/packages/machine-learning.scm b/gnu/packages/machine-learning.scm
index e135ee0ee..4d54584a7 100644
--- a/gnu/packages/machine-learning.scm
+++ b/gnu/packages/machine-learning.scm
@@ -365,6 +365,14 @@ value imputation, classifier creation, generalization error estimation and
 sample proximities between pairs of cases.")
     (license license:gpl3+)))
 
+(define swig-for-octave
+  (package/inherit swig
+    (name (string-append (package-name swig) "-for-octave"))
+    (source
+     (origin
+       (inherit (package-source swig))
+       (patches (search-patches "swig-octave-patches.patch"))))))
+
 (define-public shogun
   (package
     (name "shogun")
@@ -487,7 +495,7 @@ sample proximities between pairs of cases.")
        ("numpy" ,python-numpy)
        ("r-minimal" ,r-minimal)
        ("octave" ,octave)
-       ("swig" ,swig)
+       ("swig" ,swig-for-octave)
        ("eigen" ,eigen)
        ("hdf5" ,hdf5)
        ("atlas" ,atlas)
diff --git a/gnu/packages/patches/swig-octave-patches.patch b/gnu/packages/patches/swig-octave-patches.patch
new file mode 100644
index 000000000..9fb64a7b1
--- /dev/null
+++ b/gnu/packages/patches/swig-octave-patches.patch
@@ -0,0 +1,1119 @@
+This patch represents the recently added support for Octave version 4.4 found
+here:
+
+https://github.com/swig/swig/commit/12c66f9b7d884020e896ce92b9783bc3bac95d2d
+
+diff -urN swig-3.0.12.old/CHANGES.current swig-3.0.12.new/CHANGES.current
+--- swig-3.0.12.old/CHANGES.current	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/CHANGES.current	2018-05-26 08:40:06.501850058 -0400
+@@ -4,6 +4,14 @@
+ Issue # numbers mentioned below can be found on Github. For more details, add
+ the issue number to the end of the URL: https://github.com/swig/swig/issues/
+ 
++Version 4.0.0 (in progress)
++===========================
++
++2018-05-12: kwwette
++            [Octave] add support for version 4.4
++            - Should not introduce any user-visible incompatibilities
++
++
+ Version 3.0.12 (27 Jan 2017)
+ ============================
+ 
+diff -urN swig-3.0.12.old/Examples/Makefile.in swig-3.0.12.new/Examples/Makefile.in
+--- swig-3.0.12.old/Examples/Makefile.in	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/Examples/Makefile.in	2018-05-26 08:39:16.510124553 -0400
+@@ -463,7 +463,7 @@
+ # -----------------------------------------------------------------
+ 
+ octave_run:
+-	OCTAVE_HISTFILE=/dev/null $(RUNTOOL) $(OCTAVE) $(OCTAVE_SCRIPT) $(RUNPIPE)
++	env OCTAVE_PATH= OCTAVE_HISTFILE=/dev/null $(RUNTOOL) $(OCTAVE) $(OCTAVE_SCRIPT) $(RUNPIPE)
+ 
+ # -----------------------------------------------------------------
+ # Version display
+diff -urN swig-3.0.12.old/Examples/octave/module_load/runme.m swig-3.0.12.new/Examples/octave/module_load/runme.m
+--- swig-3.0.12.old/Examples/octave/module_load/runme.m	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/Examples/octave/module_load/runme.m	2018-05-26 08:39:16.518124669 -0400
+@@ -5,63 +5,73 @@
+ 
+ # load module
+ clear all;
++assert(exist("swigexample") == 3);
+ swigexample;
++assert(isglobal("swigexample"));
+ assert(cvar.ivar == ifunc);
+-assert(exist("swigexample","var"));
+ clear all
++assert(exist("swigexample") == 3);
+ swigexample;
++assert(isglobal("swigexample"));
+ assert(cvar.ivar == ifunc);
+-assert(exist("swigexample","var"));
+ clear all
+ 
+ # load module in a function globally before base context
+ clear all;
+-function testme
++function testme_1
++  assert(exist("swigexample") == 3);
+   swigexample;
++  assert(isglobal("swigexample"));
+   assert(cvar.ivar == ifunc);
+-  assert(exist("swigexample","var"));
+ endfunction
+-testme
+-testme
++testme_1
++testme_1
++assert(exist("swigexample") == 3);
+ swigexample;
++assert(isglobal("swigexample"));
+ assert(cvar.ivar == ifunc);
+-assert(exist("swigexample","var"));
+ clear all
+-function testme
++function testme_2
++  assert(exist("swigexample") == 3);
+   swigexample;
++  assert(isglobal("swigexample"));
+   assert(cvar.ivar == ifunc);
+-  assert(exist("swigexample","var"));
+ endfunction
+-testme
+-testme
++testme_2
++testme_2
++assert(exist("swigexample") == 3);
+ swigexample;
++assert(isglobal("swigexample"));
+ assert(cvar.ivar == ifunc);
+-assert(exist("swigexample","var"));
+ clear all
+ 
+ # load module in a function globally after base context
+ clear all;
++assert(exist("swigexample") == 3);
+ swigexample;
++assert(isglobal("swigexample"));
+ assert(cvar.ivar == ifunc);
+-assert(exist("swigexample","var"));
+-function testme
++function testme_3
++  assert(exist("swigexample") == 3);
+   swigexample;
++  assert(isglobal("swigexample"));
+   assert(cvar.ivar == ifunc);
+-  assert(exist("swigexample","var"));
+ endfunction
+-testme
+-testme
++testme_3
++testme_3
+ clear all
++assert(exist("swigexample") == 3);
+ swigexample;
++assert(isglobal("swigexample"));
+ assert(cvar.ivar == ifunc);
+-assert(exist("swigexample","var"));
+-function testme
++function testme_4
++  assert(exist("swigexample") == 3);
+   swigexample;
++  assert(isglobal("swigexample"));
+   assert(cvar.ivar == ifunc);
+-  assert(exist("swigexample","var"));
+ endfunction
+-testme
+-testme
++testme_4
++testme_4
+ clear all
+ 
+ # octave 3.0.5 randomly crashes on the remaining tests
+@@ -71,13 +81,16 @@
+ 
+ # load module with no cvar
+ clear all;
++who;
++assert(exist("swigexample2") == 3);
+ swigexample2;
++assert(isglobal("swigexample2"));
+ assert(swigexample2.ivar == ifunc);
+-assert(exist("swigexample2","var"));
+-assert(!isglobal("cvar"))
++assert(!exist("cvar", "var"));
+ clear all
++assert(exist("swigexample2") == 3);
+ swigexample2;
++assert(isglobal("swigexample2"));
+ assert(swigexample2.ivar == ifunc);
+-assert(exist("swigexample2","var"));
+-assert(!isglobal("cvar"))
++assert(!exist("cvar", "var"));
+ clear all
+diff -urN swig-3.0.12.old/Examples/test-suite/octave/Makefile.in swig-3.0.12.new/Examples/test-suite/octave/Makefile.in
+--- swig-3.0.12.old/Examples/test-suite/octave/Makefile.in	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/Examples/test-suite/octave/Makefile.in	2018-05-26 08:39:16.511124567 -0400
+@@ -59,7 +59,7 @@
+ # a file is found which has _runme.m appended after the testcase name.
+ run_testcase = \
+ 	if [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \
+-	  env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH OCTAVE_PATH=$(srcdir):$$OCTAVE_PATH $(RUNTOOL) $(OCTAVE) $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); \
++	  env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH OCTAVE_PATH=$(srcdir) OCTAVE_HISTFILE=/dev/null $(RUNTOOL) $(OCTAVE) $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); \
+ 	fi
+ 
+ # Clean: remove the generated .m file
+diff -urN swig-3.0.12.old/Examples/test-suite/octave/Makefile.in.orig swig-3.0.12.new/Examples/test-suite/octave/Makefile.in.orig
+--- swig-3.0.12.old/Examples/test-suite/octave/Makefile.in.orig	1969-12-31 19:00:00.000000000 -0500
++++ swig-3.0.12.new/Examples/test-suite/octave/Makefile.in.orig	2017-01-27 18:52:02.000000000 -0500
+@@ -0,0 +1,92 @@
++#######################################################################
++# Makefile for octave test-suite
++#######################################################################
++
++LANGUAGE     = octave
++OCTAVE       = @OCTAVE@
++SCRIPTSUFFIX = _runme.m
++
++srcdir       = @srcdir@
++top_srcdir   = @top_srcdir@
++top_builddir = @top_builddir@
++
++CPP_TEST_CASES += \
++	li_std_pair_extra \
++	li_std_string_extra \
++	octave_cell_deref\
++	octave_dim
++
++CPP_TEST_BROKEN += \
++	implicittest \
++	li_implicit \
++	li_std_set \
++	li_std_stream
++
++#C_TEST_CASES +=
++
++#
++# This test only works with modern C compilers
++#
++#C_TEST_CASES += \
++#	complextest
++
++include $(srcdir)/../common.mk
++
++# Overridden variables here
++LIBS       = -L.
++CSRCS      = octave_empty.c
++
++# Custom tests - tests with additional commandline options
++# none!
++
++# Rules for the different types of tests
++%.cpptest:
++	$(setup)
++	+$(swig_and_compile_cpp)
++	$(run_testcase)
++
++%.ctest:
++	$(setup)
++	+$(swig_and_compile_c)
++	$(run_testcase)
++
++%.multicpptest:
++	$(setup)
++	+$(swig_and_compile_multi_cpp)
++	$(run_testcase)
++
++# Runs the testcase. A testcase is only run if
++# a file is found which has _runme.m appended after the testcase name.
++run_testcase = \
++	if [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \
++	  env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH OCTAVE_PATH=$(srcdir):$$OCTAVE_PATH $(RUNTOOL) $(OCTAVE) $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); \
++	fi
++
++# Clean: remove the generated .m file
++%.clean:
++	@rm -f hugemod.h hugemod_a.i hugemod_b.i hugemod_a.m hugemod_b.m hugemod_runme.m
++	@rm -f $*.m;
++
++clean:
++	$(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile SRCDIR='$(SRCDIR)' octave_clean
++
++cvsignore:
++	@echo '*wrap* *.mc *.so *.dll *.exp *.lib'
++	@echo Makefile
++	@for i in ${CPP_TEST_CASES} ${C_TEST_CASES}; do echo $$i.m; done
++	@for i in ${CPP_TEST_CASES} ${C_TEST_CASES}; do if grep -q $${i}_runme.m CVS/Entries ; then echo $${i}_runme.m; fi; done
++	@echo clientdata_prop_a.m
++	@echo clientdata_prop_b.m
++	@echo imports_a.m
++	@echo imports_b.m
++	@echo mod_a.m mod_b.m
++	@echo hugemod.h hugemod_a.i hugemod_b.i hugemod_a.m hugemod_b.m hugemod_runme.m
++	@echo template_typedef_import.m
++
++
++hugemod:
++	perl hugemod.pl
++	$(MAKE) hugemod_a.cpptest
++	$(MAKE) hugemod_b.cpptest
++	time $(OCTAVE) hugemod_runme.m
++	time $(OCTAVE) hugemod_runme.m
+diff -urN swig-3.0.12.old/Examples/test-suite/register_par.i swig-3.0.12.new/Examples/test-suite/register_par.i
+--- swig-3.0.12.old/Examples/test-suite/register_par.i	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/Examples/test-suite/register_par.i	2018-05-26 08:40:28.146164544 -0400
+@@ -2,5 +2,5 @@
+ 
+ // bug # 924413
+ %inline {
+-  void clear_tree_flags(register struct tree *tp, register int i) {}
++  void clear_tree_flags(register struct swig_tree *tp, register int i) {}
+ }
+diff -urN swig-3.0.12.old/Examples/test-suite/register_par.i.orig swig-3.0.12.new/Examples/test-suite/register_par.i.orig
+--- swig-3.0.12.old/Examples/test-suite/register_par.i.orig	1969-12-31 19:00:00.000000000 -0500
++++ swig-3.0.12.new/Examples/test-suite/register_par.i.orig	2018-05-26 08:39:16.518124669 -0400
+@@ -0,0 +1,6 @@
++%module register_par
++
++// bug # 924413
++%inline {
++  void clear_tree_flags(register struct tree *tp, register int i) {}
++}
+diff -urN swig-3.0.12.old/Examples/test-suite/register_par.i.rej swig-3.0.12.new/Examples/test-suite/register_par.i.rej
+--- swig-3.0.12.old/Examples/test-suite/register_par.i.rej	1969-12-31 19:00:00.000000000 -0500
++++ swig-3.0.12.new/Examples/test-suite/register_par.i.rej	2018-05-26 08:39:16.518124669 -0400
+@@ -0,0 +1,15 @@
++--- Examples/test-suite/register_par.i
+++++ Examples/test-suite/register_par.i
++@@ -1,10 +1,10 @@
++ %module register_par
++ 
++ %{
++-struct tree;
+++struct swig_tree;
++ %}
++ 
++ // bug # 924413
++ %inline {
++-  void clear_tree_flags(register struct tree *tp, register int i) {}
+++  void clear_tree_flags(register struct swig_tree *tp, register int i) {}
++ }
+diff -urN swig-3.0.12.old/Lib/octave/octcontainer.swg swig-3.0.12.new/Lib/octave/octcontainer.swg
+--- swig-3.0.12.old/Lib/octave/octcontainer.swg	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/Lib/octave/octcontainer.swg	2018-05-26 08:39:16.488124234 -0400
+@@ -567,7 +567,11 @@
+ 	  if (seq) *seq = p;
+ 	  return SWIG_OLDOBJ;
+ 	}
++%#if SWIG_OCTAVE_PREREQ(4,4,0)
++      } else if (obj.iscell()) {
++%#else
+       } else if (obj.is_cell()) {
++%#endif
+ 	try {
+ 	  OctSequence_Cont<value_type> octseq(obj);
+ 	  if (seq) {
+diff -urN swig-3.0.12.old/Lib/octave/octprimtypes.swg swig-3.0.12.new/Lib/octave/octprimtypes.swg
+--- swig-3.0.12.old/Lib/octave/octprimtypes.swg	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/Lib/octave/octprimtypes.swg	2018-05-26 08:39:16.492124292 -0400
+@@ -18,7 +18,11 @@
+ SWIGINTERN int
+ SWIG_AsVal_dec(bool)(const octave_value& ov, bool *val)
+ {
++%#if SWIG_OCTAVE_PREREQ(4,4,0)
++  if (!ov.islogical())
++%#else
+   if (!ov.is_bool_type())
++%#endif
+     return SWIG_ERROR;
+   if (val)
+     *val = ov.bool_value();
+@@ -214,7 +218,13 @@
+ SWIGINTERN int
+ SWIG_AsCharPtrAndSize(octave_value ov, char** cptr, size_t* psize, int *alloc)
+ {
+-  if (ov.is_cell() && ov.rows() == 1 && ov.columns() == 1)
++  if (
++%#if SWIG_OCTAVE_PREREQ(4,4,0)
++    ov.iscell()
++%#else
++    ov.is_cell()
++%#endif
++    && ov.rows() == 1 && ov.columns() == 1)
+     ov = ov.cell_value()(0);
+   if (!ov.is_string())
+     return SWIG_TypeError;
+diff -urN swig-3.0.12.old/Lib/octave/octrun.swg swig-3.0.12.new/Lib/octave/octrun.swg
+--- swig-3.0.12.old/Lib/octave/octrun.swg	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/Lib/octave/octrun.swg	2018-05-26 08:39:16.509124538 -0400
+@@ -151,6 +151,67 @@
+     const swig_type_info **base;
+   };
+ 
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++  // in Octave 4.4 behaviour of octave_builtin() appears to have changed and 'self' argument is no longer passed
++  // to function (maybe because this is now a 'method'??) so need to create our own octave_function subclass
++#define SWIG_OCTAVE_BOUND_FUNC(func, args) octave_value(new octave_swig_bound_func(func, args))
++  class octave_swig_bound_func : public octave_function {
++  public:
++
++    octave_swig_bound_func(void) : octave_function(), method(0), first_args()
++      { }
++
++    octave_swig_bound_func(octave_function* _method, octave_value_list _first_args)
++      : octave_function("", ""), method(_method), first_args(_first_args)
++      { }
++
++    octave_swig_bound_func(const octave_swig_bound_func& f) = delete;
++
++    octave_swig_bound_func& operator= (const octave_swig_bound_func& f) = delete;
++
++    ~octave_swig_bound_func(void) = default;
++
++    bool is_function(void) const { return true; }
++
++    octave_function* function_value(bool = false) { return this; }
++
++    octave_value_list call(octave::tree_evaluator& tw, int nargout = 0, const octave_value_list& args = octave_value_list()) {
++      octave_value_list all_args;
++      all_args.append(first_args);
++      all_args.append(args);
++      return method->call(tw, nargout, all_args);
++    }
++
++    octave_value subsref(const std::string &ops, const std::list < octave_value_list > &idx) {
++      octave_value_list ovl = subsref(ops, idx, 1);
++      return ovl.length() ? ovl(0) : octave_value();
++    }
++
++    octave_value_list subsref(const std::string &ops, const std::list < octave_value_list > &idx, int nargout) {
++      assert(ops.size() > 0);
++      assert(ops.size() == idx.size());
++      if (ops != "(")
++        error("invalid function call");
++      octave::tree_evaluator& tw = octave::interpreter::the_interpreter()->get_evaluator();
++      return call(tw, nargout, *idx.begin());
++    }
++
++  protected:
++
++    octave_function* method;
++    octave_value_list first_args;
++
++    std::set<std::string> dispatch_classes;
++
++  private:
++
++    DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA
++  };
++  DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA(octave_swig_bound_func, "octave_swig_bound_func", "octave_swig_bound_func");
++#else
++#define SWIG_OCTAVE_BOUND_FUNC(func, args) octave_value(func)
++#endif
++
+   // octave_swig_type plays the role of both the shadow class and the class 
+   // representation within Octave, since there is no support for classes.
+   //
+@@ -323,13 +384,17 @@
+     }
+ 
+     octave_value_list member_deref(member_value_pair *m, const octave_value_list &args) {
+-      if (m->second.is_defined())
+-	return m->second;
+-      else if (m->first) {
++      if (m->second.is_defined()) {
++        if (m->second.is_function() || m->second.is_function_handle()) {
++          return SWIG_OCTAVE_BOUND_FUNC(m->second.function_value(), args);
++        } else {
++          return m->second;
++        }
++      } else if (m->first) {
+ 	if (m->first->get_method)
+ 	  return m->first->get_method(args, 1);
+ 	else if (m->first->method)
+-	  return octave_value(new octave_builtin(m->first->method));
++          return SWIG_OCTAVE_BOUND_FUNC(new octave_builtin(m->first->method), args);
+       }
+       error("undefined member");
+       return octave_value_list();
+@@ -383,7 +448,11 @@
+         return dim_vector(1,1);
+ 
+       // Return value should be cell or matrix of integers
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++      if (out.iscell()) {
++#else
+       if (out.is_cell()) {
++#endif
+         const Cell & c=out.cell_value();
+         int ndim = c.rows();
+         if (ndim==1 && c.columns()!=1) ndim = c.columns();
+@@ -401,7 +470,11 @@
+           if (error_state) return dim_vector(1,1);
+         }
+         return d;
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++      } else if (out.is_matrix_type() || out.isnumeric() ) {
++#else
+       } else if (out.is_matrix_type() || out.is_numeric_type() ) {
++#endif
+         if (out.rows()==1 || out.columns()==1) {
+            Array<int> a = out.int_vector_value();
+            if (error_state) return dim_vector(1,1);
+@@ -476,8 +549,12 @@
+       }
+       types.insert(types.end(), rhs.types.begin(), rhs.types.end());
+       members.insert(rhs.members.begin(), rhs.members.end());
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++      assign(rhs.swig_type_name(), rhs.as_value());
++#else
+       rhs.types.clear();
+       rhs.members.clear();
++#endif
+     }
+ 
+     typedef member_map::const_iterator swig_member_const_iterator;
+@@ -848,7 +925,14 @@
+       octave_function *fcn = is_valid_function(symbol, std::string(), false);
+       if (!fcn)
+ 	return false;
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++      octave::tree_evaluator& tw = octave::interpreter::the_interpreter()->get_evaluator();
++      octave_value_list retval = fcn->call(tw, 1, args);
++      if (retval.length() == 1)
++        ret = retval(0);
++#else
+       ret = fcn->do_multi_index_op(1, args)(0);
++#endif
+       return true;
+     }
+ 
+@@ -1238,7 +1322,13 @@
+   }
+ 
+   SWIGRUNTIME octave_swig_type *swig_value_deref(octave_value ov) {
+-    if (ov.is_cell() && ov.rows() == 1 && ov.columns() == 1)
++    if (
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++      ov.iscell()
++#else
++      ov.is_cell()
++#endif
++      && ov.rows() == 1 && ov.columns() == 1)
+       ov = ov.cell_value()(0);
+     return swig_value_deref(*ov.internal_rep());
+   }
+@@ -1261,12 +1351,24 @@
+ SWIGRUNTIME octave_value swig_binary_op_##name(const octave_base_value&lhs,const octave_base_value &rhs) { \
+   return octave_swig_type::dispatch_binary_op(lhs,rhs,#name); \
+ }
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++#define swigreg_unary_op(name) \
++if (!octave_value_typeinfo::lookup_unary_op(octave_value::op_##name,tid)) \
++typeinfo.register_unary_op(octave_value::op_##name,tid,swig_unary_op_##name);
++#else
+ #define swigreg_unary_op(name) \
+ if (!octave_value_typeinfo::lookup_unary_op(octave_value::op_##name,tid)) \
+ octave_value_typeinfo::register_unary_op(octave_value::op_##name,tid,swig_unary_op_##name);
++#endif
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++#define swigreg_binary_op(name) \
++if (!octave_value_typeinfo::lookup_binary_op(octave_value::op_##name,tid1,tid2)) \
++typeinfo.register_binary_op(octave_value::op_##name,tid1,tid2,swig_binary_op_##name);
++#else
+ #define swigreg_binary_op(name) \
+ if (!octave_value_typeinfo::lookup_binary_op(octave_value::op_##name,tid1,tid2)) \
+ octave_value_typeinfo::register_binary_op(octave_value::op_##name,tid1,tid2,swig_binary_op_##name);
++#endif
+ 
+   swig_unary_op(not);
+   swig_unary_op(uplus);
+@@ -1300,6 +1402,9 @@
+   swig_binary_op(el_or);
+ 
+   SWIGRUNTIME void SWIG_InstallUnaryOps(int tid) {
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++    octave::type_info& typeinfo = octave::interpreter::the_interpreter()->get_type_info();
++#endif
+     swigreg_unary_op(not);
+     swigreg_unary_op(uplus);
+     swigreg_unary_op(uminus);
+@@ -1309,6 +1414,9 @@
+     swigreg_unary_op(decr);
+   }
+   SWIGRUNTIME void SWIG_InstallBinaryOps(int tid1, int tid2) {
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++    octave::type_info& typeinfo = octave::interpreter::the_interpreter()->get_type_info();
++#endif
+     swigreg_binary_op(add);
+     swigreg_binary_op(sub);
+     swigreg_binary_op(mul);
+@@ -1357,7 +1465,13 @@
+ }
+ 
+ SWIGRUNTIME int SWIG_Octave_ConvertPtrAndOwn(octave_value ov, void **ptr, swig_type_info *type, int flags, int *own) {
+-  if (ov.is_cell() && ov.rows() == 1 && ov.columns() == 1)
++    if (
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++      ov.iscell()
++#else
++      ov.is_cell()
++#endif
++      && ov.rows() == 1 && ov.columns() == 1)
+     ov = ov.cell_value()(0);
+   if (!ov.is_defined() ||
+       (ov.is_matrix_type() && ov.rows() == 0 && ov.columns() == 0) ) {
+@@ -1390,14 +1504,30 @@
+ }
+ 
+ SWIGRUNTIMEINLINE octave_value SWIG_Octave_GetGlobalValue(std::string name) {
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++  octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table();
++  return symtab.global_varval(name);
++#else
+   return get_global_value(name, true);
++#endif
+ }
+ 
+ SWIGRUNTIME void SWIG_Octave_SetGlobalValue(std::string name, const octave_value& value) {
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++  octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table();
++  symtab.global_assign(name, value);
++#else
+   set_global_value(name, value);
++#endif
+ }
+ 
+ SWIGRUNTIME void SWIG_Octave_LinkGlobalValue(std::string name) {
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++  octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table();
++  octave::symbol_scope symscope = octave::interpreter::the_interpreter()->get_current_scope();
++  symscope.assign(name, symtab.global_varval(name));
++  symscope.mark_global(name);
++#else
+ #if !SWIG_OCTAVE_PREREQ(3,2,0)
+   link_to_global_variable(curr_sym_tab->lookup(name, true));
+ #else
+@@ -1406,6 +1536,7 @@
+ #endif
+   symbol_table::mark_global(name);
+ #endif
++#endif
+ }
+ 
+ SWIGRUNTIME swig_module_info *SWIG_Octave_GetModule(void *clientdata) {
+diff -urN swig-3.0.12.old/Lib/octave/octruntime.swg swig-3.0.12.new/Lib/octave/octruntime.swg
+--- swig-3.0.12.old/Lib/octave/octruntime.swg	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/Lib/octave/octruntime.swg	2018-05-26 08:39:16.507124509 -0400
+@@ -139,7 +139,11 @@
+ #endif
+ #if SWIG_OCTAVE_PREREQ(4,2,0)
+     try {
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++      octave::feval(name, octave_value_list(), 0);
++#else
+       feval(name, octave_value_list(), 0);
++#endif
+       retn = true;
+     } catch (octave::execution_exception&) { }
+ #else
+@@ -170,7 +174,7 @@
+     frame.protect_var(discard_error_messages);          discard_error_messages = true;
+     frame.protect_var(discard_warning_messages);        discard_warning_messages = true;
+ #else
+-    unwind_protect::begin_frame("SWIG_Octave_LoadModule");
++    unwind_protect::begin_frame("SWIG_Octave_InstallFunction");
+     unwind_protect_int(error_state);                    error_state = 0;
+     unwind_protect_int(warning_state);                  warning_state = 0;
+     unwind_protect_bool(discard_error_messages);        discard_error_messages = true;
+@@ -181,7 +185,11 @@
+     args.append(octloadfcn->fcn_file_name());
+ #if SWIG_OCTAVE_PREREQ(4,2,0)
+     try {
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++      octave::feval("autoload", args, 0);
++#else
+       feval("autoload", args, 0);
++#endif
+       retn = true;
+     } catch (octave::execution_exception&) { }
+ #else
+@@ -312,6 +320,8 @@
+ Loads the SWIG-generated module `" SWIG_name_d "'.\n\
+ @end deftypefn";
+ 
++void __swig_atexit__(void) { ::_Exit(0); }
++
+ DEFUN_DLD( SWIG_name, args, nargout, SWIG_name_usage ) {
+ 
+   static octave_swig_type* module_ns = 0;
+@@ -322,7 +332,9 @@
+   // version 3.4.*, but reappeared in 4.2.*, so turn on for all versions after 3.2.*.
+   // can be turned off with macro definition.
+ #ifndef SWIG_OCTAVE_NO_SEGFAULT_HACK
+-#if SWIG_OCTAVE_PREREQ(3,2,0)
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++  atexit(__swig_atexit__);
++#elif SWIG_OCTAVE_PREREQ(3,2,0)
+   octave_exit = ::_Exit;
+ #endif
+ #endif
+@@ -351,15 +363,54 @@
+                      "__swig_atexit__; "
+                      "atexit(\"__swig_atexit__\", false); "
+                      "atexit(\"__swig_atexit__\")");
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++    octave::feval("evalin", eval_args, 0);
++#else
+     feval("evalin", eval_args, 0);
+ #endif
++#endif
+ 
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++    {
++      octave::type_info& typeinfo = octave::interpreter::the_interpreter()->get_type_info();
++      string_vector types = typeinfo.installed_type_names();
++      bool register_octave_swig_ref = true;
++      bool register_octave_swig_packed = true;
++      bool register_octave_swig_bound_func = true;
++      for (int i = 0; i < types.numel(); ++i) {
++        if (types(i) == octave_swig_ref::static_type_name()) {
++          register_octave_swig_ref = false;
++        }
++        if (types(i) == octave_swig_packed::static_type_name()) {
++          register_octave_swig_packed = false;
++        }
++        if (types(i) == octave_swig_bound_func::static_type_name()) {
++          register_octave_swig_bound_func = false;
++        }
++      }
++      if (register_octave_swig_ref) {
++        octave_swig_ref::register_type();
++      }
++      if (register_octave_swig_packed) {
++        octave_swig_packed::register_type();
++      }
++      if (register_octave_swig_bound_func) {
++        octave_swig_bound_func::register_type();
++      }
++    }
++#else
+     octave_swig_ref::register_type();
+     octave_swig_packed::register_type();
++#endif
+     SWIG_InitializeModule(0);
+     SWIG_PropagateClientData();
+ 
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++    octave::call_stack& stack = octave::interpreter::the_interpreter()->get_call_stack();
++    octave_function *me = stack.current();
++#else
+     octave_function *me = octave_call_stack::current();
++#endif
+ 
+     if (!SWIG_Octave_InstallFunction(me, "subclass")) {
+       return octave_value_list();
+@@ -426,10 +477,12 @@
+       }
+     }
+ 
+-#if !SWIG_OCTAVE_PREREQ(3,2,0)
+-    mlock(me->name());
+-#else
++#if SWIG_OCTAVE_PREREQ(4,4,0)
++    octave::interpreter::the_interpreter()->mlock();
++#elif SWIG_OCTAVE_PREREQ(3,2,0)
+     mlock();
++#else
++    mlock(me->name());
+ #endif
+ 
+   }
+diff -urN swig-3.0.12.old/Lib/octave/std_pair.i swig-3.0.12.new/Lib/octave/std_pair.i
+--- swig-3.0.12.old/Lib/octave/std_pair.i	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/Lib/octave/std_pair.i	2018-05-26 08:39:16.489124248 -0400
+@@ -38,7 +38,13 @@
+       }
+ 
+       static int asval(const octave_value& obj, std::pair<T,U> *val) {
+-	if (obj.is_cell()) {
++	if (
++%#if SWIG_OCTAVE_PREREQ(4,4,0)
++          obj.iscell()
++%#else
++          obj.is_cell()
++%#endif
++        ) {
+ 	  Cell c=obj.cell_value();
+ 	  if (c.numel()<2) {
+ 	    error("pair from Cell array requires at least two elements");
+@@ -96,7 +102,13 @@
+       }
+ 
+       static int asptr(const octave_value& obj, std::pair<T,U> **val) {
+-	if (obj.is_cell()) {
++	if (
++%#if SWIG_OCTAVE_PREREQ(4,4,0)
++          obj.iscell()
++%#else
++          obj.is_cell()
++%#endif
++        ) {
+ 	  Cell c=obj.cell_value();
+ 	  if (c.numel()<2) {
+ 	    error("pair from Cell array requires at least two elements");
+diff -urN swig-3.0.12.old/.travis.yml swig-3.0.12.new/.travis.yml
+--- swig-3.0.12.old/.travis.yml	2017-01-27 18:52:02.000000000 -0500
++++ swig-3.0.12.new/.travis.yml	2018-05-26 08:39:16.520124698 -0400
+@@ -92,6 +92,11 @@
+       dist: trusty
+     - compiler: gcc
+       os: linux
++      env: SWIGLANG=octave SWIGJOBS=-j2 VER=4.4 CPP11=1
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
+       env: SWIGLANG=perl5
+       sudo: required
+       dist: trusty
+diff -urN swig-3.0.12.old/.travis.yml.orig swig-3.0.12.new/.travis.yml.orig
+--- swig-3.0.12.old/.travis.yml.orig	1969-12-31 19:00:00.000000000 -0500
++++ swig-3.0.12.new/.travis.yml.orig	2017-01-27 18:52:02.000000000 -0500
+@@ -0,0 +1,334 @@
++language: cpp
++matrix:
++  include:
++    - compiler: clang
++      os: linux
++      env: SWIGLANG=
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=
++      sudo: required
++      dist: trusty
++    - os: linux
++      env: SWIGLANG= SWIG_CC=gcc-5 SWIG_CXX=g++-5 CPP11=1
++      sudo: required
++      dist: trusty
++    - os: linux
++      env: SWIGLANG= SWIG_CC=gcc-6 SWIG_CXX=g++-6
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=csharp
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=d
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=go
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=go VER=1.5
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=guile
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=java
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=javascript ENGINE=node
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=javascript ENGINE=jsc
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=javascript ENGINE=v8
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=lua
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=lua VER=5.3
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=octave SWIGJOBS=-j2 # 3.8
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=octave SWIGJOBS=-j2 VER=4.0
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=octave SWIGJOBS=-j2 VER=4.2 CPP11=1
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=perl5
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=php5
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=php VER=7.0
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=php VER=7.1
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python VER=2.4
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python VER=2.5
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python VER=2.6
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python # 2.7
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python PY3=3 VER=3.2
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python PY3=3 VER=3.3
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python PY3=3 VER=3.4
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python PY3=3 VER=3.5
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python SWIG_FEATURES=-builtin VER=2.6
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python SWIG_FEATURES=-builtin
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.4
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.5
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.5 SWIGOPTPY3=
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python SWIG_FEATURES=-O
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python SWIG_FEATURES=-classic
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=r
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=ruby VER=1.9.3
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=ruby VER=2.0.0
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=ruby VER=2.3.0
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=scilab
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=tcl
++      sudo: required
++      dist: trusty
++    - os: linux
++      env: SWIGLANG=csharp SWIG_CC=gcc-5 SWIG_CXX=g++-5 CPP11=1
++      sudo: required
++      dist: trusty
++    - os: linux
++      env: SWIGLANG=java SWIG_CC=gcc-5 SWIG_CXX=g++-5 CPP11=1
++      sudo: required
++      dist: trusty
++    - os: linux
++      env: SWIGLANG=python SWIG_CC=gcc-5 SWIG_CXX=g++-5 CPP11=1
++      sudo: required
++      dist: trusty
++    - os: linux
++      env: SWIGLANG=csharp SWIG_CC=gcc-6 SWIG_CXX=g++-6 CPP14=1
++      sudo: required
++      dist: trusty
++    - os: linux
++      env: SWIGLANG=java SWIG_CC=gcc-6 SWIG_CXX=g++-6 CPP14=1
++      sudo: required
++      dist: trusty
++    - os: linux
++      env: SWIGLANG=python SWIG_CC=gcc-6 SWIG_CXX=g++-6 CPP14=1
++      sudo: required
++      dist: trusty
++    - compiler: gcc
++      os: osx
++      env: SWIGLANG=
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=csharp
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=go
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=guile
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=java
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=lua
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=perl5
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=php5
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=python
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=python PY3=3
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=ruby
++    - compiler: clang
++      os: osx
++      env: SWIGLANG=tcl
++
++  allow_failures:
++    # Lots of failing tests currently
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=ocaml
++      sudo: required
++      dist: trusty
++    # Not quite working yet
++    - compiler: gcc
++      os: linux
++      env: SWIGLANG=python SWIG_FEATURES=-O
++      sudo: required
++      dist: trusty
++before_install:
++  - date -u
++  - uname -a
++  - if test "$TRAVIS_OS_NAME" = "linux"; then lscpu && cat /proc/cpuinfo | grep "model name" && cat /proc/meminfo | grep MemTotal; fi
++  - if test "$TRAVIS_OS_NAME" = "osx"; then sysctl -a | grep brand_string; fi
++    # Travis overrides CC environment with compiler predefined values
++  - if test -n "$SWIG_CC"; then export CC="$SWIG_CC"; fi
++  - if test -n "$SWIG_CXX"; then export CXX="$SWIG_CXX"; fi
++install:
++  - if test "$TRAVIS_OS_NAME" = "linux"; then source Tools/travis-linux-install.sh; fi
++  - if test "$TRAVIS_OS_NAME" = "osx"; then source Tools/travis-osx-install.sh; fi
++  - if test -n "$CPP11"; then CONFIGOPTS+=(--enable-cpp11-testing --without-maximum-compile-warnings "CXXFLAGS=-std=c++11 -Wall -Wextra" "CFLAGS=-std=c11 -Wall -Wextra") && export CSTD=c11 && export CPPSTD=c++11; fi
++  - if test -n "$CPP14"; then CONFIGOPTS+=(--enable-cpp11-testing --without-maximum-compile-warnings "CXXFLAGS=-std=c++14 -Wall -Wextra" "CFLAGS=-std=c11 -Wall -Wextra") && export CSTD=c11 && export CPPSTD=c++14; fi
++  - ls -la $(which $CC)
++  - ls -la $(which $CXX)
++  - $CC --version
++  - $CXX --version
++script:
++  - echo 'Configuring...' && echo -en 'travis_fold:start:script.1\\r'
++  - if test -n "$SWIGLANG"; then CONFIGOPTS+=(--without-alllang --with-$WITHLANG); fi
++  - echo "${CONFIGOPTS[@]}"
++  - ./autogen.sh && mkdir -p build/build && cd build/build && ../../configure "${CONFIGOPTS[@]}"
++  - echo -en 'travis_fold:end:script.1\\r'
++  - make -s $SWIGJOBS
++  - ./swig -version && ./swig -pcreversion
++  - if test -z "$SWIGLANG"; then make -s $SWIGJOBS check-ccache; fi
++  - if test -z "$SWIGLANG"; then make -s $SWIGJOBS check-errors-test-suite; fi
++  - echo 'Installing...' && echo -en 'travis_fold:start:script.2\\r'
++  - if test -z "$SWIGLANG"; then sudo make -s install && swig -version && ccache-swig -V; fi
++  - echo -en 'travis_fold:end:script.2\\r'
++  # Stricter compile flags for examples. Various headers and SWIG generated code prevents full use of -pedantic.
++  - if test -n "$SWIGLANG"; then cflags=$($TRAVIS_BUILD_DIR/Tools/testflags.py --language $SWIGLANG --cflags --std=$CSTD --compiler=$CC) && echo $cflags; fi
++  - if test -n "$SWIGLANG"; then cxxflags=$($TRAVIS_BUILD_DIR/Tools/testflags.py --language $SWIGLANG --cxxflags --std=$CPPSTD --compiler=$CC) && echo $cxxflags; fi
++  - if test -n "$SWIGLANG"; then make -s check-$SWIGLANG-version; fi
++  - if test -n "$SWIGLANG"; then make check-$SWIGLANG-enabled; fi
++  - if test -n "$SWIGLANG"; then make $SWIGJOBS check-$SWIGLANG-examples CFLAGS="$cflags" CXXFLAGS="$cxxflags"; fi
++  - if test -n "$SWIGLANG"; then make $SWIGJOBS check-$SWIGLANG-test-suite CFLAGS="$cflags" CXXFLAGS="$cxxflags"; fi
++  - echo 'Cleaning...' && echo -en 'travis_fold:start:script.3\\r'
++  - make check-maintainer-clean && ../../configure $CONFIGOPTS
++  - echo -en 'travis_fold:end:script.3\\r'
-- 
2.17.1


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: 04/05: gnu: swig: Patch for Octave 4.4.
  2018-05-30 14:49     ` Kei Kebreau
@ 2018-05-30 18:53       ` Mark H Weaver
  2018-05-31 17:59         ` Kei Kebreau
  0 siblings, 1 reply; 7+ messages in thread
From: Mark H Weaver @ 2018-05-30 18:53 UTC (permalink / raw)
  To: Kei Kebreau; +Cc: guix-devel

Hi Kei,

Kei Kebreau <kkebreau@posteo.net> writes:

> Mark H Weaver <mhw@netris.org> writes:
>
>> Instead, I suggest creating a different 'swig' package for octave that
>> inherits from the primary one and adds this patch.
>
> I agree that this will work. Is the attached patch something like what
> you're thinking?

Yes, although I have some suggestions:

> From 475a7698fd4c88ea688cb43499344e65ffaf5b84 Mon Sep 17 00:00:00 2001
> From: Kei Kebreau <kkebreau@posteo.net>
> Date: Wed, 30 May 2018 08:34:42 -0400
> Subject: [PATCH] gnu: shogun: Use a patched swig for Octave 4.4.
>
> * gnu/packages/machine-learning.scm (swig-for-octave): New variable
> * gnu/packages/machine-learning.scm (shogun)[inputs]: Replace swig with
> swig-for-octave.
> * gnu/packages/patches/swig-octave-patches.patch: New file.
> * gnu/local.mk (dist_patch_DATA): Register patch.
[...]
> diff --git a/gnu/packages/machine-learning.scm b/gnu/packages/machine-learning.scm
> index e135ee0ee..4d54584a7 100644
> --- a/gnu/packages/machine-learning.scm
> +++ b/gnu/packages/machine-learning.scm
> @@ -365,6 +365,14 @@ value imputation, classifier creation, generalization error estimation and
>  sample proximities between pairs of cases.")
>      (license license:gpl3+)))
>  
> +(define swig-for-octave
> +  (package/inherit swig
> +    (name (string-append (package-name swig) "-for-octave"))
> +    (source
> +     (origin
> +       (inherit (package-source swig))
> +       (patches (search-patches "swig-octave-patches.patch"))))))

For the patches field, how about something like this:

   (patches (append (origin-patches (package-source swig))
                    (search-patches "swig-octave-patches.patch")))

so if someone adds a patch to swig, it will automatically get picked up
by this one too.

Please add a comment above the 'swig-for-octave' definition explaining
what it's for.  I was confused at first that you didn't change the
octave definition, but now I guess that it's for other packages that
wish to use octave via swig, or something along those lines?  It should
be good to explain in a comment.

Also, I think it would be better to put the 'swig-for-octave' definition
immediately after the one for 'swig', so that it's more likely to be
noticed by people working on swig.  This package has more connection to
swig than it does to shogun.  It has no direct connection to 'shogun'
except that shogun is currently the only user of it.

Another question: instead of adding the patch, how about changing the
origin to build from a git checkout?  The advantage of that is that it
requires less trust from users.  I look at this big patch and I wonder
if I should check to make sure it matches what upstream has (I didn't).
If it's a git checkout, there's less trust needed.  It would also make
later upgrades easier.

It might also be better to call the package "swig-git" or something,
dunno.

What do you think?  Thanks for working on it.

      Mark

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: 04/05: gnu: swig: Patch for Octave 4.4.
  2018-05-30 18:53       ` Mark H Weaver
@ 2018-05-31 17:59         ` Kei Kebreau
  2018-06-07 15:30           ` Kei Kebreau
  0 siblings, 1 reply; 7+ messages in thread
From: Kei Kebreau @ 2018-05-31 17:59 UTC (permalink / raw)
  To: Mark H Weaver; +Cc: guix-devel


[-- Attachment #1.1: Type: text/plain, Size: 3437 bytes --]

Mark H Weaver <mhw@netris.org> writes:

> Hi Kei,
>
> Kei Kebreau <kkebreau@posteo.net> writes:
>
>> Mark H Weaver <mhw@netris.org> writes:
>>
>>> Instead, I suggest creating a different 'swig' package for octave that
>>> inherits from the primary one and adds this patch.
>>
>> I agree that this will work. Is the attached patch something like what
>> you're thinking?
>
> Yes, although I have some suggestions:
>
>> From 475a7698fd4c88ea688cb43499344e65ffaf5b84 Mon Sep 17 00:00:00 2001
>> From: Kei Kebreau <kkebreau@posteo.net>
>> Date: Wed, 30 May 2018 08:34:42 -0400
>> Subject: [PATCH] gnu: shogun: Use a patched swig for Octave 4.4.
>>
>> * gnu/packages/machine-learning.scm (swig-for-octave): New variable
>> * gnu/packages/machine-learning.scm (shogun)[inputs]: Replace swig with
>> swig-for-octave.
>> * gnu/packages/patches/swig-octave-patches.patch: New file.
>> * gnu/local.mk (dist_patch_DATA): Register patch.
> [...]
>> diff --git a/gnu/packages/machine-learning.scm b/gnu/packages/machine-learning.scm
>> index e135ee0ee..4d54584a7 100644
>> --- a/gnu/packages/machine-learning.scm
>> +++ b/gnu/packages/machine-learning.scm
>> @@ -365,6 +365,14 @@ value imputation, classifier creation, generalization error estimation and
>>  sample proximities between pairs of cases.")
>>      (license license:gpl3+)))
>>  
>> +(define swig-for-octave
>> +  (package/inherit swig
>> +    (name (string-append (package-name swig) "-for-octave"))
>> +    (source
>> +     (origin
>> +       (inherit (package-source swig))
>> +       (patches (search-patches "swig-octave-patches.patch"))))))
>
> For the patches field, how about something like this:
>
>    (patches (append (origin-patches (package-source swig))
>                     (search-patches "swig-octave-patches.patch")))
>
> so if someone adds a patch to swig, it will automatically get picked up
> by this one too.
>
> Please add a comment above the 'swig-for-octave' definition explaining
> what it's for.  I was confused at first that you didn't change the
> octave definition, but now I guess that it's for other packages that
> wish to use octave via swig, or something along those lines?  It should
> be good to explain in a comment.
>
> Also, I think it would be better to put the 'swig-for-octave' definition
> immediately after the one for 'swig', so that it's more likely to be
> noticed by people working on swig.  This package has more connection to
> swig than it does to shogun.  It has no direct connection to 'shogun'
> except that shogun is currently the only user of it.
>
> Another question: instead of adding the patch, how about changing the
> origin to build from a git checkout?  The advantage of that is that it
> requires less trust from users.  I look at this big patch and I wonder
> if I should check to make sure it matches what upstream has (I didn't).
> If it's a git checkout, there's less trust needed.  It would also make
> later upgrades easier.
>
> It might also be better to call the package "swig-git" or something,
> dunno.
>
> What do you think?  Thanks for working on it.
>
>       Mark

Other than Shogun's Python/SWIG-related build failure (attached), this
patch seems to work fairly well. There appears to be an upstream issue
related to the invalid conversion mentioned in the build failure. I'm
keeping an eye on it for any new developments.


[-- Attachment #1.2: 0001-gnu-shogun-Use-a-patched-swig-for-Octave-4.4.patch --]
[-- Type: text/plain, Size: 3036 bytes --]

From deb75abebf74be37d2afedd9e5d8f8b07c65ab06 Mon Sep 17 00:00:00 2001
From: Kei Kebreau <kkebreau@posteo.net>
Date: Wed, 30 May 2018 08:34:42 -0400
Subject: [PATCH] gnu: shogun: Use a patched swig for Octave 4.4.

* gnu/packages/swig.scm (swig-git): New variable
* gnu/packages/machine-learning.scm (shogun)[inputs]: Replace swig with
swig-git.
---
 gnu/packages/machine-learning.scm |  2 +-
 gnu/packages/swig.scm             | 34 +++++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/gnu/packages/machine-learning.scm b/gnu/packages/machine-learning.scm
index e135ee0ee..bc618bad2 100644
--- a/gnu/packages/machine-learning.scm
+++ b/gnu/packages/machine-learning.scm
@@ -487,7 +487,7 @@ sample proximities between pairs of cases.")
        ("numpy" ,python-numpy)
        ("r-minimal" ,r-minimal)
        ("octave" ,octave)
-       ("swig" ,swig)
+       ("swig" ,swig-git)
        ("eigen" ,eigen)
        ("hdf5" ,hdf5)
        ("atlas" ,atlas)
diff --git a/gnu/packages/swig.scm b/gnu/packages/swig.scm
index b931db412..3a1139dbb 100644
--- a/gnu/packages/swig.scm
+++ b/gnu/packages/swig.scm
@@ -20,8 +20,12 @@
 (define-module (gnu packages swig)
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (guix git-download)
   #:use-module (guix licenses)
+  #:use-module (guix utils)
   #:use-module (guix build-system gnu)
+  #:use-module (gnu packages autotools)
+  #:use-module (gnu packages bison)
   #:use-module (gnu packages pcre)
   #:use-module (gnu packages guile)
   #:use-module (gnu packages boost)
@@ -74,3 +78,33 @@ you tailor the wrapping process to suit your application.")
 
     ;; See http://www.swig.org/Release/LICENSE for details.
     (license gpl3+)))
+
+;; This package contains upstream fixes that haven't been released as part of a
+;; stable version of SWIG.  This is necessary for software that uses SWIG to
+;; compile the correct and up-to-date programming language interfaces.
+(define-public swig-git
+  (let ((commit "12c66f9b7d884020e896ce92b9783bc3bac95d2d")
+        (revision "1"))
+    (package/inherit swig
+      (name "swig-git")
+      (version (git-version "4.0.0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/swig/swig.git")
+               (commit commit)))
+         (sha256 (base32 "1367y47kdkly9cwyp4d60cm5d660am83g4p52k1hmzvimghwgvlp"))
+         (file-name (git-file-name name version))))
+      (arguments
+       (substitute-keyword-arguments (package-arguments swig)
+         ((#:phases phases)
+          `(modify-phases ,phases
+             (add-after 'unpack 'autogen
+               (lambda _
+                 (invoke "sh" "autogen.sh")))))))
+      (native-inputs
+       `(("autoconf" ,autoconf)
+         ("automake" ,automake)
+         ("bison" ,bison)
+         ,@(package-native-inputs swig))))))
-- 
2.17.1


[-- Attachment #1.3: shogun-build-failure.txt --]
[-- Type: text/plain, Size: 10244 bytes --]

make -f src/interfaces/python/CMakeFiles/_interface_python.dir/build.make src/interfaces/python/CMakeFiles/_interface_python.dir/build
make[2]: Entering directory '/tmp/guix-build-shogun-6.1.3.drv-0/build'
[ 79%] Building CXX object src/interfaces/python/CMakeFiles/_interface_python.dir/shogunPYTHON_wrap.cxx.o
cd /tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python && /gnu/store/cfdn69spjc44x4sd0acrwhxq6yay3rbc-gcc-5.5.0/bin/c++   -D_interface_python_EXPORTS -I/tmp/guix-build-shogun-6.1.3.drv-0/shogun-6.1.3/src -I/tmp/guix-build-shogun-6.1.3.drv-0/build/src -I/tmp/guix-build-shogun-6.1.3.drv-0/shogun-6.1.3/src/gpl -I/gnu/store/3lkypf5wnsnvkaidhw0pv7k3yjfh1r9g-python-3.6.3/include/python3.6m -I/gnu/store/3jmrg9f7l46q997wg46qkaqdjslb8ljb-python-numpy-1.14.3/lib/python3.6/site-packages/numpy/core/include -isystem /gnu/store/d2yy1vhcp0809wnsc91ah6rdvwyfs663-eigen-3.3.4/include/eigen3 -isystem /gnu/store/5s9am1dgn83wj5q5kwfcasqws8zd85zz-rxcpp-4.0.0 -I/gnu/store/mv9m6bxdhijhlfvxpja3km6v599b4pv5-libxml2-2.9.7/include/libxml2 -I/gnu/store/27jrvwbg5xa9la6jwnqz6ys4k7pfyykl-hdf5-1.8.19/include  -O0 -g  -Wno-c++11-narrowing -O2 -g -DNDEBUG -fPIC   -std=c++11 -o CMakeFiles/_interface_python.dir/shogunPYTHON_wrap.cxx.o -c /tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx
In file included from /gnu/store/3jmrg9f7l46q997wg46qkaqdjslb8ljb-python-numpy-1.14.3/lib/python3.6/site-packages/numpy/core/include/numpy/ndarraytypes.h:1816:0,
                 from /gnu/store/3jmrg9f7l46q997wg46qkaqdjslb8ljb-python-numpy-1.14.3/lib/python3.6/site-packages/numpy/core/include/numpy/ndarrayobject.h:18,
                 from /gnu/store/3jmrg9f7l46q997wg46qkaqdjslb8ljb-python-numpy-1.14.3/lib/python3.6/site-packages/numpy/core/include/numpy/arrayobject.h:4,
                 from /tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:6738:
/gnu/store/3jmrg9f7l46q997wg46qkaqdjslb8ljb-python-numpy-1.14.3/lib/python3.6/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:15:2: warning: #warning "Using deprecated NumPy API, disable it by " "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp]
 #warning "Using deprecated NumPy API, disable it by " \
  ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:638365:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, Py_ssize_t, bool) {aka _object* (*)(_object*, long int, bool)}’ to ‘ssizeargfunc {aka _object* (*)(_object*, long int)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:638599:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, Py_ssize_t, bool) {aka _object* (*)(_object*, long int, bool)}’ to ‘ssizeargfunc {aka _object* (*)(_object*, long int)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:638833:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, Py_ssize_t, bool) {aka _object* (*)(_object*, long int, bool)}’ to ‘ssizeargfunc {aka _object* (*)(_object*, long int)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:639067:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, Py_ssize_t, bool) {aka _object* (*)(_object*, long int, bool)}’ to ‘ssizeargfunc {aka _object* (*)(_object*, long int)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:639301:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, Py_ssize_t, bool) {aka _object* (*)(_object*, long int, bool)}’ to ‘ssizeargfunc {aka _object* (*)(_object*, long int)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:639535:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, Py_ssize_t, bool) {aka _object* (*)(_object*, long int, bool)}’ to ‘ssizeargfunc {aka _object* (*)(_object*, long int)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:640003:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, Py_ssize_t, bool) {aka _object* (*)(_object*, long int, bool)}’ to ‘ssizeargfunc {aka _object* (*)(_object*, long int)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:640237:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, Py_ssize_t, bool) {aka _object* (*)(_object*, long int, bool)}’ to ‘ssizeargfunc {aka _object* (*)(_object*, long int)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:640471:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, Py_ssize_t, bool) {aka _object* (*)(_object*, long int, bool)}’ to ‘ssizeargfunc {aka _object* (*)(_object*, long int)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:675972:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, PyObject*, bool) {aka _object* (*)(_object*, _object*, bool)}’ to ‘binaryfunc {aka _object* (*)(_object*, _object*)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:676216:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, PyObject*, bool) {aka _object* (*)(_object*, _object*, bool)}’ to ‘binaryfunc {aka _object* (*)(_object*, _object*)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:676460:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, PyObject*, bool) {aka _object* (*)(_object*, _object*, bool)}’ to ‘binaryfunc {aka _object* (*)(_object*, _object*)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:676704:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, PyObject*, bool) {aka _object* (*)(_object*, _object*, bool)}’ to ‘binaryfunc {aka _object* (*)(_object*, _object*)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:676948:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, PyObject*, bool) {aka _object* (*)(_object*, _object*, bool)}’ to ‘binaryfunc {aka _object* (*)(_object*, _object*)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:677192:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, PyObject*, bool) {aka _object* (*)(_object*, _object*, bool)}’ to ‘binaryfunc {aka _object* (*)(_object*, _object*)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:677436:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, PyObject*, bool) {aka _object* (*)(_object*, _object*, bool)}’ to ‘binaryfunc {aka _object* (*)(_object*, _object*)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:677680:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, PyObject*, bool) {aka _object* (*)(_object*, _object*, bool)}’ to ‘binaryfunc {aka _object* (*)(_object*, _object*)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:677924:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, PyObject*, bool) {aka _object* (*)(_object*, _object*, bool)}’ to ‘binaryfunc {aka _object* (*)(_object*, _object*)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:685107:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, Py_ssize_t, bool) {aka _object* (*)(_object*, long int, bool)}’ to ‘ssizeargfunc {aka _object* (*)(_object*, long int)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:685336:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, Py_ssize_t, bool) {aka _object* (*)(_object*, long int, bool)}’ to ‘ssizeargfunc {aka _object* (*)(_object*, long int)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:685797:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, Py_ssize_t, bool) {aka _object* (*)(_object*, long int, bool)}’ to ‘ssizeargfunc {aka _object* (*)(_object*, long int)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:686017:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, Py_ssize_t, bool) {aka _object* (*)(_object*, long int, bool)}’ to ‘ssizeargfunc {aka _object* (*)(_object*, long int)}’ [-fpermissive]
 };
 ^
/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/python/shogunPYTHON_wrap.cxx:727445:1: error: invalid conversion from ‘PyObject* (*)(PyObject*, PyObject*, bool) {aka _object* (*)(_object*, _object*, bool)}’ to ‘binaryfunc {aka _object* (*)(_object*, _object*)}’ [-fpermissive]
 };
 ^
cc1plus: warning: unrecognized command line option ‘-Wno-c++11-narrowing’
make[2]: *** [src/interfaces/python/CMakeFiles/_interface_python.dir/build.make:77: src/interfaces/python/CMakeFiles/_interface_python.dir/shogunPYTHON_wrap.cxx.o] Error 1
make[2]: Leaving directory '/tmp/guix-build-shogun-6.1.3.drv-0/build'
make[1]: *** [CMakeFiles/Makefile2:284: src/interfaces/python/CMakeFiles/_interface_python.dir/all] Error 2
make[1]: Leaving directory '/tmp/guix-build-shogun-6.1.3.drv-0/build'
make: *** [Makefile:153: all] Error 2
phase `build' failed after 3994.4 seconds
builder for `/gnu/store/qyc9xzcj7dsljw3gxb5rhm7bx2w7g50z-shogun-6.1.3.drv' failed with exit code 1
@ build-failed /gnu/store/qyc9xzcj7dsljw3gxb5rhm7bx2w7g50z-shogun-6.1.3.drv - 1 builder for `/gnu/store/qyc9xzcj7dsljw3gxb5rhm7bx2w7g50z-shogun-6.1.3.drv' failed with exit code 1
guix build: error: build failed: build of `/gnu/store/qyc9xzcj7dsljw3gxb5rhm7bx2w7g50z-shogun-6.1.3.drv' failed

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: 04/05: gnu: swig: Patch for Octave 4.4.
  2018-05-31 17:59         ` Kei Kebreau
@ 2018-06-07 15:30           ` Kei Kebreau
  2018-06-11 16:54             ` Kei Kebreau
  0 siblings, 1 reply; 7+ messages in thread
From: Kei Kebreau @ 2018-06-07 15:30 UTC (permalink / raw)
  To: Mark H Weaver; +Cc: guix-devel


[-- Attachment #1.1: Type: text/plain, Size: 414 bytes --]

Kei Kebreau <kkebreau@posteo.net> writes:

> Other than Shogun's Python/SWIG-related build failure (attached), this
> patch seems to work fairly well. There appears to be an upstream issue
> related to the invalid conversion mentioned in the build failure. I'm
> keeping an eye on it for any new developments.

FYI, this is an updated patch that bypasses the Python interface issue
and runs into an issue with R.


[-- Attachment #1.2: 0001-gnu-shogun-Use-a-patched-swig-for-Octave-4.4.patch --]
[-- Type: text/plain, Size: 3806 bytes --]

From f4fa63249bec73a385bba1b95bc53cac8f96420c Mon Sep 17 00:00:00 2001
From: Kei Kebreau <kkebreau@posteo.net>
Date: Wed, 30 May 2018 08:34:42 -0400
Subject: [PATCH] gnu: shogun: Use a patched swig for Octave 4.4.

* gnu/packages/swig.scm (swig-git): New variable
* gnu/packages/machine-learning.scm (shogun)[arguments]: Add
'fix-python-compiler-flags' phase.
[inputs]: Replace swig with swig-git.
---
 gnu/packages/machine-learning.scm |  9 +++++++-
 gnu/packages/swig.scm             | 34 +++++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/gnu/packages/machine-learning.scm b/gnu/packages/machine-learning.scm
index 15e4d4574..d992a2fe5 100644
--- a/gnu/packages/machine-learning.scm
+++ b/gnu/packages/machine-learning.scm
@@ -469,6 +469,13 @@ sample proximities between pairs of cases.")
                (mkdir-p rxcpp-dir)
                (install-file (assoc-ref inputs "rxcpp") rxcpp-dir)
                #t)))
+         (add-after 'unpack 'fix-python-compiler-flags
+           (lambda _
+             ;; This prevents a set of function conversions from stopping the
+             ;; build with an error.
+             (substitute* "src/interfaces/python/CMakeLists.txt"
+               (("Wno-c\\+\\+11-narrowing") "fpermissive"))
+             #t))
          (add-before 'build 'set-HOME
            ;; $HOME needs to be set at some point during the build phase
            (lambda _ (setenv "HOME" "/tmp") #t)))
@@ -488,7 +495,7 @@ sample proximities between pairs of cases.")
        ("numpy" ,python-numpy)
        ("r-minimal" ,r-minimal)
        ("octave" ,octave)
-       ("swig" ,swig)
+       ("swig" ,swig-git)
        ("eigen" ,eigen)
        ("hdf5" ,hdf5)
        ("atlas" ,atlas)
diff --git a/gnu/packages/swig.scm b/gnu/packages/swig.scm
index b931db412..3a1139dbb 100644
--- a/gnu/packages/swig.scm
+++ b/gnu/packages/swig.scm
@@ -20,8 +20,12 @@
 (define-module (gnu packages swig)
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (guix git-download)
   #:use-module (guix licenses)
+  #:use-module (guix utils)
   #:use-module (guix build-system gnu)
+  #:use-module (gnu packages autotools)
+  #:use-module (gnu packages bison)
   #:use-module (gnu packages pcre)
   #:use-module (gnu packages guile)
   #:use-module (gnu packages boost)
@@ -74,3 +78,33 @@ you tailor the wrapping process to suit your application.")
 
     ;; See http://www.swig.org/Release/LICENSE for details.
     (license gpl3+)))
+
+;; This package contains upstream fixes that haven't been released as part of a
+;; stable version of SWIG.  This is necessary for software that uses SWIG to
+;; compile the correct and up-to-date programming language interfaces.
+(define-public swig-git
+  (let ((commit "12c66f9b7d884020e896ce92b9783bc3bac95d2d")
+        (revision "1"))
+    (package/inherit swig
+      (name "swig-git")
+      (version (git-version "4.0.0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/swig/swig.git")
+               (commit commit)))
+         (sha256 (base32 "1367y47kdkly9cwyp4d60cm5d660am83g4p52k1hmzvimghwgvlp"))
+         (file-name (git-file-name name version))))
+      (arguments
+       (substitute-keyword-arguments (package-arguments swig)
+         ((#:phases phases)
+          `(modify-phases ,phases
+             (add-after 'unpack 'autogen
+               (lambda _
+                 (invoke "sh" "autogen.sh")))))))
+      (native-inputs
+       `(("autoconf" ,autoconf)
+         ("automake" ,automake)
+         ("bison" ,bison)
+         ,@(package-native-inputs swig))))))
-- 
2.17.1


[-- Attachment #1.3: shogun-build-failure.txt --]
[-- Type: text/plain, Size: 3151 bytes --]

[ 79%] Linking CXX shared module shogun.so
cd /tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/r && /gnu/store/8mycww9vx11vidzka3g5gghwq11alk4w-cmake-3.7.2/bin/cmake -E cmake_link_script CMakeFiles/interface_r.dir/link.txt --verbose=1
/gnu/store/cfdn69spjc44x4sd0acrwhxq6yay3rbc-gcc-5.5.0/bin/c++  -fPIC -O0 -g  -I/gnu/store/42j0p3x4v2gbwqyx6iv1j83qckndm799-r-minimal-3.5.0/lib/R/include -O2 -g -DNDEBUG  -shared  -o shogun.so CMakeFiles/interface_r.dir/shogunR_wrap.cxx.o CMakeFiles/interface_r.dir/sg_print_functions.cpp.o  -L/gnu/store/42j0p3x4v2gbwqyx6iv1j83qckndm799-r-minimal-3.5.0/lib/R/lib -Wl,-rpath,/gnu/store/km7w7j4f9qsmnrsag3g94nc6fb20vrxw-shogun-6.1.3/lib:/gnu/store/42j0p3x4v2gbwqyx6iv1j83qckndm799-r-minimal-3.5.0/lib/R/lib ../../shogun/libshogun.so.18.0 -lR -lxml2 -lhdf5 -lz -ldl -lm 
Generating shogun.RData
cd /tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/r && echo 'wd="/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/r" ; setwd ( wd ) ; f="shogun.R" ; fdata="shogun.RData" ; source ( f ) ; save ( list=ls ( all=TRUE ) , file=fdata , compress=TRUE ) ; q ( save="no" ) ;' | /gnu/store/42j0p3x4v2gbwqyx6iv1j83qckndm799-r-minimal-3.5.0/bin/R --silent --no-save
> wd="/tmp/guix-build-shogun-6.1.3.drv-0/build/src/interfaces/r" ; setwd ( wd ) ; f="shogun.R" ; fdata="shogun.RData" ; source ( f ) ; save ( list=ls ( all=TRUE ) , file=fdata , compress=TRUE ) ; q ( save="no" ) ;
in method for ‘copyToR’ with signature ‘"_p_shogun::BmrmStatistics"’: no definition for class “_p_shogun::BmrmStatistics”
in method for ‘copyToR’ with signature ‘"_p_shogun::CResultSet"’: no definition for class “_p_shogun::CResultSet”
in method for ‘copyToR’ with signature ‘"_p_shogun::CRealNumber"’: no definition for class “_p_shogun::CRealNumber”
in method for ‘copyToR’ with signature ‘"_p_shogun::GCEdge"’: no definition for class “_p_shogun::GCEdge”
in method for ‘copyToR’ with signature ‘"_p_shogun::GCNode"’: no definition for class “_p_shogun::GCNode”
in method for ‘copyToR’ with signature ‘"_p_shogun::GCNodePtr"’: no definition for class “_p_shogun::GCNodePtr”
in method for ‘copyToR’ with signature ‘"_p_shogun::RelaxedTreeNodeData"’: no definition for class “_p_shogun::RelaxedTreeNodeData”
in method for ‘copyToR’ with signature ‘"_p_shogun::ConditionalProbabilityTreeNodeData"’: no definition for class “_p_shogun::ConditionalProbabilityTreeNodeData”
Error in assign(defName, .values, envir = where) : 
  object 'KSM_MAXIMIZE_POWER' not found
  Calls: source ... withVisible -> eval -> eval -> defineEnumeration -> assign
  Execution halted
  make[2]: *** [src/interfaces/r/CMakeFiles/interface_r.dir/build.make:141: src/interfaces/r/shogun.so] Error 1
  make[2]: *** Deleting file 'src/interfaces/r/shogun.so'
  make[2]: Leaving directory '/tmp/guix-build-shogun-6.1.3.drv-0/build'
  make[1]: *** [CMakeFiles/Makefile2:462: src/interfaces/r/CMakeFiles/interface_r.dir/all] Error 2
  make[1]: Leaving directory '/tmp/guix-build-shogun-6.1.3.drv-0/build'
  make: *** [Makefile:153: all] Error 2

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: 04/05: gnu: swig: Patch for Octave 4.4.
  2018-06-07 15:30           ` Kei Kebreau
@ 2018-06-11 16:54             ` Kei Kebreau
  0 siblings, 0 replies; 7+ messages in thread
From: Kei Kebreau @ 2018-06-11 16:54 UTC (permalink / raw)
  To: Mark H Weaver; +Cc: guix-devel


[-- Attachment #1.1: Type: text/plain, Size: 655 bytes --]

Kei Kebreau <kkebreau@posteo.net> writes:

> Kei Kebreau <kkebreau@posteo.net> writes:
>
>> Other than Shogun's Python/SWIG-related build failure (attached), this
>> patch seems to work fairly well. There appears to be an upstream issue
>> related to the invalid conversion mentioned in the build failure. I'm
>> keeping an eye on it for any new developments.
>
> FYI, this is an updated patch that bypasses the Python interface issue
> and runs into an issue with R.

I haven't been able to crack the issue with Shogun and R.  The attached
patch explicitly disables the R interface which allows shogun to build
properly while the R problem is resolved.


[-- Attachment #1.2: 0001-gnu-shogun-Use-a-patched-swig-for-Octave-4.4.patch --]
[-- Type: text/plain, Size: 4259 bytes --]

From a364bc3122ac9d3903a0d84a579d477334a59ac8 Mon Sep 17 00:00:00 2001
From: Kei Kebreau <kkebreau@posteo.net>
Date: Wed, 30 May 2018 08:34:42 -0400
Subject: [PATCH] gnu: shogun: Use a patched swig for Octave 4.4.

* gnu/packages/swig.scm (swig-git): New variable
* gnu/packages/machine-learning.scm (shogun)[arguments]: Add
'fix-python-compiler-flags' phase.  Disable R interface.
[inputs]: Replace swig with swig-git.  Remove r-minimal.
---
 gnu/packages/machine-learning.scm | 13 +++++++++---
 gnu/packages/swig.scm             | 34 +++++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/gnu/packages/machine-learning.scm b/gnu/packages/machine-learning.scm
index 15e4d4574..65dd9d31b 100644
--- a/gnu/packages/machine-learning.scm
+++ b/gnu/packages/machine-learning.scm
@@ -469,6 +469,13 @@ sample proximities between pairs of cases.")
                (mkdir-p rxcpp-dir)
                (install-file (assoc-ref inputs "rxcpp") rxcpp-dir)
                #t)))
+         (add-after 'unpack 'fix-python-compiler-flags
+           (lambda _
+             ;; This prevents a set of function conversions from stopping the
+             ;; build with an error.
+             (substitute* "src/interfaces/python/CMakeLists.txt"
+               (("Wno-c\\+\\+11-narrowing") "fpermissive"))
+             #t))
          (add-before 'build 'set-HOME
            ;; $HOME needs to be set at some point during the build phase
            (lambda _ (setenv "HOME" "/tmp") #t)))
@@ -482,13 +489,13 @@ sample proximities between pairs of cases.")
              ;;"-DINTERFACE_LUA=ON"  ;fails because lua doesn't build pkgconfig file
              "-DINTERFACE_OCTAVE=ON"
              "-DINTERFACE_PYTHON=ON"
-             "-DINTERFACE_R=ON")))
+             "-DINTERFACE_R=OFF")))  ;temporarily off due to unknown issues.
     (inputs
      `(("python" ,python)
        ("numpy" ,python-numpy)
-       ("r-minimal" ,r-minimal)
+       ;;("r-minimal" ,r-minimal) ;re-enable when interface issues are resolved
        ("octave" ,octave)
-       ("swig" ,swig)
+       ("swig" ,swig-git)
        ("eigen" ,eigen)
        ("hdf5" ,hdf5)
        ("atlas" ,atlas)
diff --git a/gnu/packages/swig.scm b/gnu/packages/swig.scm
index b931db412..3a1139dbb 100644
--- a/gnu/packages/swig.scm
+++ b/gnu/packages/swig.scm
@@ -20,8 +20,12 @@
 (define-module (gnu packages swig)
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (guix git-download)
   #:use-module (guix licenses)
+  #:use-module (guix utils)
   #:use-module (guix build-system gnu)
+  #:use-module (gnu packages autotools)
+  #:use-module (gnu packages bison)
   #:use-module (gnu packages pcre)
   #:use-module (gnu packages guile)
   #:use-module (gnu packages boost)
@@ -74,3 +78,33 @@ you tailor the wrapping process to suit your application.")
 
     ;; See http://www.swig.org/Release/LICENSE for details.
     (license gpl3+)))
+
+;; This package contains upstream fixes that haven't been released as part of a
+;; stable version of SWIG.  This is necessary for software that uses SWIG to
+;; compile the correct and up-to-date programming language interfaces.
+(define-public swig-git
+  (let ((commit "12c66f9b7d884020e896ce92b9783bc3bac95d2d")
+        (revision "1"))
+    (package/inherit swig
+      (name "swig-git")
+      (version (git-version "4.0.0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/swig/swig.git")
+               (commit commit)))
+         (sha256 (base32 "1367y47kdkly9cwyp4d60cm5d660am83g4p52k1hmzvimghwgvlp"))
+         (file-name (git-file-name name version))))
+      (arguments
+       (substitute-keyword-arguments (package-arguments swig)
+         ((#:phases phases)
+          `(modify-phases ,phases
+             (add-after 'unpack 'autogen
+               (lambda _
+                 (invoke "sh" "autogen.sh")))))))
+      (native-inputs
+       `(("autoconf" ,autoconf)
+         ("automake" ,automake)
+         ("bison" ,bison)
+         ,@(package-native-inputs swig))))))
-- 
2.17.1


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2018-06-11 16:54 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20180529222049.16826.20591@vcs0.savannah.gnu.org>
     [not found] ` <20180529222052.5A8DA20537@vcs0.savannah.gnu.org>
2018-05-30  6:25   ` 04/05: gnu: swig: Patch for Octave 4.4 Mark H Weaver
2018-05-30 14:49     ` Kei Kebreau
2018-05-30 14:49     ` Kei Kebreau
2018-05-30 18:53       ` Mark H Weaver
2018-05-31 17:59         ` Kei Kebreau
2018-06-07 15:30           ` Kei Kebreau
2018-06-11 16:54             ` Kei Kebreau

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).