From 3d439d89465ecaa229c6beef37c0f597f0ed6b8d Mon Sep 17 00:00:00 2001 From: Joseph Ciurej Date: Tue, 29 Nov 2016 14:18:03 -0800 Subject: [PATCH] Added the '+debug' and '+except' variants to the 'tetgen' package. (#2370) Fixed a bug that was causing memory errors after asserts in 'tetgen@1.5.0'. --- .../repos/builtin/packages/tetgen/package.py | 34 +++++++++++-- .../packages/tetgen/tetgen-1.5.0-free.patch | 49 +++++++++++++++++++ 2 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 var/spack/repos/builtin/packages/tetgen/tetgen-1.5.0-free.patch diff --git a/var/spack/repos/builtin/packages/tetgen/package.py b/var/spack/repos/builtin/packages/tetgen/package.py index 7ac55a6785..6e5ed79c36 100644 --- a/var/spack/repos/builtin/packages/tetgen/package.py +++ b/var/spack/repos/builtin/packages/tetgen/package.py @@ -22,7 +22,9 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## + from spack import * +import glob class Tetgen(Package): @@ -33,13 +35,35 @@ class Tetgen(Package): """ homepage = "http://www.tetgen.org" - url = "http://www.tetgen.org/files/tetgen1.4.3.tar.gz" - version('1.4.3', 'd6a4bcdde2ac804f7ec66c29dcb63c18') - version('1.5.0', '3b9fd9cdec121e52527b0308f7aad5c1', - url='http://www.tetgen.org/1.5/src/tetgen1.5.0.tar.gz') + version('1.5.0', '3b9fd9cdec121e52527b0308f7aad5c1', url='http://www.tetgen.org/1.5/src/tetgen1.5.0.tar.gz') + version('1.4.3', 'd6a4bcdde2ac804f7ec66c29dcb63c18', url='http://www.tetgen.org/files/tetgen1.4.3.tar.gz') - depends_on('cmake@2.8.7:', when='@1.5.0:', type='build') + variant('debug', default=False, description='Builds the library in debug mode.') + variant('except', default=False, description='Replaces asserts with exceptions for better C++ compatibility.') + + patch('tetgen-1.5.0-free.patch', when='@1.5.0') + + def patch(self): + cflags = '-g -O0' if '+debug' in self.spec else '-g0 -O3' + + mff = FileFilter('makefile') + mff.filter(r'^(C(XX)?FLAGS\s*=)(.*)$', r'\1 {0}'.format(cflags)) + + if '+except' in self.spec: + hff = FileFilter('tetgen.h') + hff.filter(r'(\b)(throw)(\b)(.*);', r'\1assert_throw(false);') + hff.filter(r'^(#define\s*tetgenH\s*)$', r'\1{0}'.format("""\n +#include + +inline void assert_throw(bool assertion) +{ + if(!assertion) + throw std::runtime_error("Tetgen encountered a problem (assert failed)!"); +}\n""")) + + sff = FileFilter(*(glob.glob('*.cxx'))) + sff.filter(r'(\b)(assert)(\b)', r'\1assert_throw\3') def install(self, spec, prefix): make('tetgen', 'tetlib') diff --git a/var/spack/repos/builtin/packages/tetgen/tetgen-1.5.0-free.patch b/var/spack/repos/builtin/packages/tetgen/tetgen-1.5.0-free.patch new file mode 100644 index 0000000000..009ccd834f --- /dev/null +++ b/var/spack/repos/builtin/packages/tetgen/tetgen-1.5.0-free.patch @@ -0,0 +1,49 @@ +diff --git a/tetgen.h b/tetgen.h +index 3196e03..2ff3138 100644 +--- a/tetgen.h ++++ b/tetgen.h +@@ -2206,6 +2206,44 @@ public: + if (highordertable != NULL) { + delete [] highordertable; + } ++ ++ bgm = NULL; ++ ++ points = NULL; ++ dummypoint = NULL; ++ ++ tetrahedrons = NULL; ++ ++ subfaces = NULL; ++ subsegs = NULL; ++ ++ tet2segpool = NULL; ++ tet2subpool = NULL; ++ ++ flippool = NULL; ++ unflipqueue = NULL; ++ ++ cavetetlist = NULL; ++ cavebdrylist = NULL; ++ caveoldtetlist = NULL; ++ cavetetvertlist = NULL; ++ ++ caveshlist = NULL; ++ caveshbdlist = NULL; ++ cavesegshlist = NULL; ++ cavetetshlist = NULL; ++ cavetetseglist = NULL; ++ caveencshlist = NULL; ++ caveencseglist = NULL; ++ ++ subsegstack = NULL; ++ subfacstack = NULL; ++ subvertstack = NULL; ++ ++ idx2facetlist = NULL; ++ facetverticeslist = NULL; ++ segmentendpointslist = NULL; ++ highordertable = NULL; + } + + ~tetgenmesh()