diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index dfc6867d89838170ce7491c50341a9a2fa41e48a..2fce55f11f8240b6c3ffd8f63f05cbd15f055eaf 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,8 +1,9 @@
-// $Id: Callbacks.cpp,v 1.14 2001-01-11 12:25:23 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.15 2001-01-11 14:11:56 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "GmshUI.h"
 #include "Geo.h"
+#include "Verif.h"
 #include "Mesh.h"
 #include "Draw.h"
 #include "Views.h"
@@ -20,7 +21,9 @@ extern GUI       *WID;
 extern Mesh       M;
 extern Context_T  CTX;
 
-// Compatibility routines
+///////////////////////////////////////////////////////////////////////////////
+
+// Compatibility/local routines
 
 int AddViewInUI(int i, char *Name, int Num){
   if(i > NB_BUTT_MAX -1) return 1;
@@ -106,6 +109,44 @@ int SetGlobalShortcut(int event){
   return WID->global_shortcuts(event);
 }
 
+int SelectContour (int type, int num, List_T *Liste1){
+  int      k,ip,i;
+  List_T  *Liste2;
+
+  Liste2 = List_Create(1,1,sizeof(int));
+
+  if(!List_Nbr(Liste1)){
+    switch(type){
+    case ENT_LINE    : k = alledgeslinked (num, Liste1, (List_T*)NULL); break;
+    case ENT_SURFACE : k = allfaceslinked (num, Liste1, (List_T*)NULL); break;
+    }
+  }
+  else{
+    List_Reset(Liste2);
+    for(i=0;i<List_Nbr(Liste1);i++)
+      List_Add(Liste2,List_Pointer(Liste1,i));
+    List_Reset(Liste1);
+    switch(type){
+    case ENT_LINE    : k = alledgeslinked (num, Liste1, Liste2); break;
+    case ENT_SURFACE : k = allfaceslinked (num, Liste1, Liste2); break;
+    }
+  }
+
+  for(i=0;i<List_Nbr(Liste1);i++){
+    List_Read(Liste1,i,&ip);
+    switch(type){
+    case ENT_LINE    : HighlightEntityNum(0,abs(ip),0,1); break ;
+    case ENT_SURFACE : HighlightEntityNum(0,0,abs(ip),1); break ;
+    }
+  }
+
+  List_Delete(Liste2);
+  return k;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+
 // Common callbacks 
 
 void cancel_cb(CALLBACK_ARGS){
@@ -532,42 +573,277 @@ void geometry_elementary_add_new_parameter_cb(CALLBACK_ARGS){
 void geometry_elementary_add_new_point_cb(CALLBACK_ARGS){
   WID->create_geometry_context_window(1);
 }
+
+static void _new_line_spline(int mode){
+  Vertex   *v;
+  Curve    *c;
+  Surface  *s;
+  int      ib;
+  static int n, p[100];
+
+  n = 0;
+  while(1){
+    Msg(STATUS,"Select Point ('e'=end, 'q'=quit)");
+    ib = SelectEntity(ENT_POINT, &v,&c,&s);
+    if(ib == 1){ /* left mouse butt */
+      p[n++] = v->Num; 
+    }
+    if (ib == -1){ /* 'e' */
+      if(n >= 2) {
+	switch(mode){
+	case 0 : add_multline(n,p,CTX.filename); break;
+	case 1 : add_spline(n,p,CTX.filename); break;
+	}
+      }
+      n=0;
+      ZeroHighlight(&M);
+      DrawUpdate();
+    }
+    if(ib == 0){ /* 'q' */
+      n=0 ;
+      ZeroHighlight(&M);
+      DrawUpdate();
+      break;
+    }
+  }
+  Msg(STATUS,"Ready");
+}
+
 void geometry_elementary_add_new_line_cb(CALLBACK_ARGS){
-  printf("new line\n");
+  _new_line_spline(0);
 }
 void geometry_elementary_add_new_spline_cb(CALLBACK_ARGS){
-  printf("new spline\n");
+  _new_line_spline(1);
 }
 void geometry_elementary_add_new_circle_cb(CALLBACK_ARGS){
-  printf("new circle\n");
+  Vertex   *v;
+  Curve    *c;
+  Surface  *s;
+  int      ib;
+  static int n, p[100];
+
+  n=0;
+  while(1){
+    if(n == 0) Msg(STATUS,"Select Center ('q'=quit)");
+    if(n == 1) Msg(STATUS,"Select Starting Point ('q'=quit)");
+    if(n == 2) Msg(STATUS,"Select Ending Point ('q'=quit)");
+    ib = SelectEntity(ENT_POINT, &v,&c,&s);
+    if(ib == 1) { /* left mouse butt */
+      p[n++] = v->Num; 
+    }
+    if(ib == 0) { /* 'q' */
+      n=0 ;
+      ZeroHighlight(&M);
+      DrawUpdate();
+      break;
+    }
+    if(n == 3){
+      add_circ(p[1],p[0],p[2],CTX.filename); /* begin, center, end */
+      ZeroHighlight(&M);
+      DrawUpdate();
+      n=0;
+    }
+  }
+  Msg(STATUS,"Ready");
 }
 void geometry_elementary_add_new_ellipsis_cb(CALLBACK_ARGS){
-  printf("new ellipsis\n");
+  Vertex   *v;
+  Curve    *c;
+  Surface  *s;
+  int      ib;
+  static int n, p[100];
+
+  n=0;
+  while(1){
+    if(n == 0) Msg(STATUS,"Select Center ('q'=quit)");
+    if(n == 1) Msg(STATUS,"Select an Axis Point ('q'=quit)");
+    if(n == 2) Msg(STATUS,"Select Starting Point ('q'=quit)");
+    if(n == 3) Msg(STATUS,"Select Ending Point ('q'=quit)");
+    ib = SelectEntity(ENT_POINT, &v,&c,&s);
+    if(ib == 1) { /* left mouse butt */
+      p[n++] = v->Num; 
+    }
+    if(ib == 0){ /* 'q' */
+      n=0 ;
+      ZeroHighlight(&M);
+      DrawUpdate();
+      break;
+    }
+    if(n == 4){
+      add_ell(p[3],p[2],p[0],p[1],CTX.filename);
+      ZeroHighlight(&M);
+      DrawUpdate();
+      n=0;
+    }
+  }
+  Msg(STATUS,"Ready");
 }
+
+static void _new_surface_volume(int mode){
+  Vertex   *v;
+  Curve    *c;
+  Surface  *s;
+  int      ib, type, zone;
+  List_T  *Liste1, *Liste2;
+
+  Liste1 = List_Create(10,10,sizeof(int));
+  Liste2 = List_Create(10,10,sizeof(int));
+  
+  if(mode == 2)
+    type = ENT_SURFACE;
+  else
+    type = ENT_LINE;      
+  
+  while(1){      
+    List_Reset(Liste1);
+    List_Reset(Liste2);
+    
+    while(1) {        
+      Msg(STATUS,"Select Boundary ('q'=quit)");
+      ib = SelectEntity(type, &v,&c,&s);
+      if(ib <= 0){
+	ZeroHighlight(&M);
+	DrawUpdate();
+	goto stopall;
+      }       
+      if(SelectContour (type, (type==ENT_LINE)?c->Num:s->Num, Liste1)){
+	if(type==ENT_LINE) 
+	  add_loop(Liste1,CTX.filename,&zone);
+	else
+	  add_vol(Liste1,CTX.filename,&zone);
+	List_Reset(Liste1);
+	List_Add(Liste2,&zone);
+	while(1){
+	  Msg(STATUS,"Select Holes ('q'=quit)");
+	  ib = SelectEntity(type, &v,&c,&s); 
+	  if(ib <= 0){
+	    ZeroHighlight(&M);
+	    DrawUpdate();
+	    break;
+	  }
+	  if(SelectContour (type, (type==ENT_LINE)?c->Num:s->Num, Liste1)){
+	    if(type==ENT_LINE) 
+	      add_loop(Liste1,CTX.filename,&zone);
+	    else
+	      add_vol(Liste1,CTX.filename,&zone);
+	    List_Reset(Liste1);
+	    List_Add(Liste2,&zone);
+	  }
+	}
+	if(List_Nbr(Liste2)){
+	  switch(mode){
+	  case 0 : add_surf(Liste2,CTX.filename,0,1); break;
+	  case 1 : add_surf(Liste2,CTX.filename,0,2); break;
+	  case 2 : add_multvol(Liste2,CTX.filename); break;
+	  }
+	  ZeroHighlight(&M);
+	  DrawUpdate();
+	  break;
+	}
+      }
+    }
+  }
+  stopall : ;
+  List_Delete(Liste1);
+  List_Delete(Liste2);
+  Msg(STATUS,"Ready");
+}
+
 void geometry_elementary_add_new_planesurface_cb(CALLBACK_ARGS){
-  printf("new plane surf\n");
+  _new_surface_volume(0);
 }
 void geometry_elementary_add_new_ruledsurface_cb(CALLBACK_ARGS){
-  printf("new rules surf\n");
+  _new_surface_volume(1);
 }
 void geometry_elementary_add_new_volume_cb(CALLBACK_ARGS){
-  printf("new vol\n");
+  _new_surface_volume(2);
+}
+
+
+static void _translate_point(int mode){
+  Vertex   *v;
+  Curve    *c;
+  Surface  *s;
+  while(1){
+    Msg(STATUS,"Select Point ('q'=quit)");
+    if(!SelectEntity(ENT_POINT, &v,&c,&s)){
+      ZeroHighlight(&M);
+      DrawUpdate();
+      break;
+    }
+    translate_pt(mode,v->Num,CTX.filename);
+    ZeroHighlight(&M);
+    DrawUpdate();
+  }
 }
+
+static void _translate_curve(int mode){
+  Vertex   *v;
+  Curve    *c;
+  Surface  *s;
+  while(1){
+    Msg(STATUS,"Select Line ('q'=quit)");
+    if(!SelectEntity(ENT_LINE, &v,&c,&s)){
+      ZeroHighlight(&M);
+      DrawUpdate();
+      break;
+    }
+    translate_seg(mode,c->Num,CTX.filename);
+    ZeroHighlight(&M);
+    DrawUpdate();
+  }
+}
+static void _translate_surface(int mode){
+  Vertex   *v;
+  Curve    *c;
+  Surface  *s;
+  while(1){
+    Msg(STATUS,"Select Surface ('q'=quit)");
+    if(!SelectEntity(ENT_SURFACE, &v,&c,&s)){
+      ZeroHighlight(&M);
+      DrawUpdate();
+      break;
+    }
+    translate_surf(mode,s->Num,CTX.filename);
+    ZeroHighlight(&M);
+    DrawUpdate();
+  }
+}
+
 void geometry_elementary_add_translate_cb(CALLBACK_ARGS){
   WID->set_context(menu_geometry_elementary_add_translate, 0);
 }
 void geometry_elementary_add_translate_point_cb(CALLBACK_ARGS){
   WID->create_geometry_context_window(2);
-  printf("translate point\n");
+  _translate_point(1);
 }
 void geometry_elementary_add_translate_curve_cb(CALLBACK_ARGS){
   WID->create_geometry_context_window(2);
-  printf("translate curve\n");
+  _translate_curve(1);
 }
 void geometry_elementary_add_translate_surface_cb(CALLBACK_ARGS){
   WID->create_geometry_context_window(2);
-  printf("translate surface\n");
+  _translate_surface(1);
 }
+void geometry_elementary_translate_cb(CALLBACK_ARGS){
+  WID->set_context(menu_geometry_elementary_translate, 0);
+}
+void geometry_elementary_translate_point_cb(CALLBACK_ARGS){
+  WID->create_geometry_context_window(2);
+  _translate_point(0);
+}
+void geometry_elementary_translate_curve_cb(CALLBACK_ARGS){
+  WID->create_geometry_context_window(2);
+  _translate_curve(0);
+}
+void geometry_elementary_translate_surface_cb(CALLBACK_ARGS){
+  WID->create_geometry_context_window(2);
+  _translate_surface(0);
+}
+
+
+
+
 void geometry_elementary_add_rotate_cb(CALLBACK_ARGS){
   WID->set_context(menu_geometry_elementary_add_rotate, 0);
 }
@@ -583,51 +859,6 @@ void geometry_elementary_add_rotate_surface_cb(CALLBACK_ARGS){
   WID->create_geometry_context_window(3);
   printf("rotate surf\n");
 }
-void geometry_elementary_add_scale_cb(CALLBACK_ARGS){
-  WID->set_context(menu_geometry_elementary_add_scale, 0);
-}
-void geometry_elementary_add_scale_point_cb(CALLBACK_ARGS){
-  WID->create_geometry_context_window(4);
-  printf("scale point\n");
-}
-void geometry_elementary_add_scale_curve_cb(CALLBACK_ARGS){
-  WID->create_geometry_context_window(4);
-  printf("scale curve\n");
-}
-void geometry_elementary_add_scale_surface_cb(CALLBACK_ARGS){
-  WID->create_geometry_context_window(4);
-  printf("scale surface\n");
-}
-void geometry_elementary_add_symmetry_cb(CALLBACK_ARGS){
-  WID->set_context(menu_geometry_elementary_add_symmetry, 0);
-}
-void geometry_elementary_add_symmetry_point_cb(CALLBACK_ARGS){
-  WID->create_geometry_context_window(5);
-  printf("symm point\n");
-}
-void geometry_elementary_add_symmetry_curve_cb(CALLBACK_ARGS){
-  WID->create_geometry_context_window(5);
-  printf("symm curve\n");
-}
-void geometry_elementary_add_symmetry_surface_cb(CALLBACK_ARGS){
-  WID->create_geometry_context_window(5);
-  printf("symm surf\n");
-}
-void geometry_elementary_translate_cb(CALLBACK_ARGS){
-  WID->set_context(menu_geometry_elementary_translate, 0);
-}
-void geometry_elementary_translate_point_cb(CALLBACK_ARGS){
-  WID->create_geometry_context_window(2);
-  printf("translate point\n");
-}
-void geometry_elementary_translate_curve_cb(CALLBACK_ARGS){
-  WID->create_geometry_context_window(2);
-  printf("translate curve\n");
-}
-void geometry_elementary_translate_surface_cb(CALLBACK_ARGS){
-  WID->create_geometry_context_window(2);
-  printf("translate surf\n");
-}
 void geometry_elementary_rotate_cb(CALLBACK_ARGS){
   WID->set_context(menu_geometry_elementary_rotate, 0);
 }
@@ -643,6 +874,24 @@ void geometry_elementary_rotate_surface_cb(CALLBACK_ARGS){
   WID->create_geometry_context_window(3);
   printf("rot surf\n");
 }
+
+
+
+void geometry_elementary_add_scale_cb(CALLBACK_ARGS){
+  WID->set_context(menu_geometry_elementary_add_scale, 0);
+}
+void geometry_elementary_add_scale_point_cb(CALLBACK_ARGS){
+  WID->create_geometry_context_window(4);
+  printf("scale point\n");
+}
+void geometry_elementary_add_scale_curve_cb(CALLBACK_ARGS){
+  WID->create_geometry_context_window(4);
+  printf("scale curve\n");
+}
+void geometry_elementary_add_scale_surface_cb(CALLBACK_ARGS){
+  WID->create_geometry_context_window(4);
+  printf("scale surface\n");
+}
 void geometry_elementary_scale_cb(CALLBACK_ARGS){
   WID->set_context(menu_geometry_elementary_scale, 0);
 }
@@ -658,6 +907,25 @@ void geometry_elementary_scale_surface_cb(CALLBACK_ARGS){
   WID->create_geometry_context_window(4);
   printf("scale surf\n");
 }
+
+
+
+
+void geometry_elementary_add_symmetry_cb(CALLBACK_ARGS){
+  WID->set_context(menu_geometry_elementary_add_symmetry, 0);
+}
+void geometry_elementary_add_symmetry_point_cb(CALLBACK_ARGS){
+  WID->create_geometry_context_window(5);
+  printf("symm point\n");
+}
+void geometry_elementary_add_symmetry_curve_cb(CALLBACK_ARGS){
+  WID->create_geometry_context_window(5);
+  printf("symm curve\n");
+}
+void geometry_elementary_add_symmetry_surface_cb(CALLBACK_ARGS){
+  WID->create_geometry_context_window(5);
+  printf("symm surf\n");
+}
 void geometry_elementary_symmetry_cb(CALLBACK_ARGS){
   WID->set_context(menu_geometry_elementary_symmetry, 0);
 }
@@ -673,6 +941,9 @@ void geometry_elementary_symmetry_surface_cb(CALLBACK_ARGS){
   WID->create_geometry_context_window(5);
   printf("symm surf\n");
 }
+
+
+
 void geometry_elementary_extrude_cb(CALLBACK_ARGS){
   WID->set_context(menu_geometry_elementary_extrude, 0);
 }
diff --git a/Graphics/CreateFile.cpp b/Graphics/CreateFile.cpp
index 0625a706ffe8cfa43f384c009c62ab290de2027c..1cd92be5dc809fc29ec5061436ffdb7f97bfb56b 100644
--- a/Graphics/CreateFile.cpp
+++ b/Graphics/CreateFile.cpp
@@ -1,4 +1,4 @@
-// $Id: CreateFile.cpp,v 1.7 2001-01-10 20:23:37 geuzaine Exp $
+// $Id: CreateFile.cpp,v 1.8 2001-01-11 14:18:07 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -21,7 +21,11 @@ extern XContext_T  XCTX;
 
 #include "gl2ps.h"
 #include "gl2gif.h"
+
+#if !defined(WIN32) && !defined(__CYGWIN__)
 #include "gl2jpeg.h"
+#endif
+
 #include "gl2ppm.h"
 #include "gl2yuv.h"
 
@@ -100,7 +104,7 @@ void CreateFile (char *name, int format) {
     break;
 #endif
 
-#ifndef WIN32
+#if !defined(WIN32) && !defined(__CYGWIN__)
   case FORMAT_JPEG :
     if(!(fp = fopen(name,"wb"))) {
       Msg(WARNING, "Unable to Open File '%s'", name); 
diff --git a/Graphics/Geom.cpp b/Graphics/Geom.cpp
index 8ead7781d8186eb928ecc516896d627b90558217..a952f0ff436cf669696cd53417ff35f8cfdf4f15 100644
--- a/Graphics/Geom.cpp
+++ b/Graphics/Geom.cpp
@@ -1,4 +1,4 @@
-// $Id: Geom.cpp,v 1.10 2001-01-10 08:50:30 geuzaine Exp $
+// $Id: Geom.cpp,v 1.11 2001-01-11 14:11:57 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -20,7 +20,7 @@ extern Mesh      *THEM;
 
 static int   Highlighted = 0; 
 
-void Draw_Point (void *a, void *b){
+void Draw_GeoPoint (void *a, void *b){
   Vertex **v;
   char Num[100];
 
@@ -743,7 +743,7 @@ void Draw_Geom (Mesh *m) {
   if(m->status == -1) return;
 
   if(CTX.geom.points || CTX.geom.points_num)
-    Tree_Action(m->Points, Draw_Point);
+    Tree_Action(m->Points, Draw_GeoPoint);
   if(CTX.geom.lines || CTX.geom.lines_num)
     Tree_Action(m->Curves,  Draw_Curve  );
   if(CTX.geom.surfaces || CTX.geom.surfaces_num)
@@ -813,7 +813,7 @@ void HighlightEntity(Vertex *v,Curve *c, Surface *s, int permanent){
 
   if(v){
     if(permanent) v->Frozen = 1;
-    if(CTX.geom.highlight) Draw_Point(&v,NULL);
+    if(CTX.geom.highlight) Draw_GeoPoint(&v,NULL);
     Msg(SELECT,"Point %d {%.5g,%.5g,%.5g} (%.5g)", v->Num,v->Pos.X,v->Pos.Y,v->Pos.Z,v->lc);
   }
   else if(c){
diff --git a/Graphics/XDump.cpp b/Graphics/XDump.cpp
index 5adbb10c22954bf69fa5c2d17d8a8e8bdbc005dc..6a7e1c9795d6ed877fba7429439751f660a416c6 100644
--- a/Graphics/XDump.cpp
+++ b/Graphics/XDump.cpp
@@ -1,4 +1,4 @@
-// $Id: XDump.cpp,v 1.4 2001-01-11 07:34:25 geuzaine Exp $
+// $Id: XDump.cpp,v 1.5 2001-01-11 14:15:09 geuzaine Exp $
 
 /* This is a modified version for Gmsh (mainly for c++ compliance) */
 
@@ -56,7 +56,7 @@
  * 12 so a correct file is written.  BEP July-21-95
  */
 
-#ifndef WIN32
+#ifdef _XMOTIF
 
 typedef struct {
         unsigned int /*long*/ pixel;
@@ -452,5 +452,7 @@ void Window_Dump(Display *display, int scr, Window window, FILE *out){
      */
     XDestroyImage(image);
 }
-#endif
+
+#endif //_XMOTIF
+
 
diff --git a/Graphics/gl2jpeg.cpp b/Graphics/gl2jpeg.cpp
index 05df858de754c5e1ddda88e8268854aa8b8cb410..081323d8102dd0a63b9864387549b05850541055 100644
--- a/Graphics/gl2jpeg.cpp
+++ b/Graphics/gl2jpeg.cpp
@@ -1,4 +1,6 @@
-// $Id: gl2jpeg.cpp,v 1.4 2001-01-08 08:05:44 geuzaine Exp $
+// $Id: gl2jpeg.cpp,v 1.5 2001-01-11 14:18:07 geuzaine Exp $
+
+#if !defined(WIN32) && !defined(__CYGWIN__)
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -57,3 +59,7 @@ void create_jpeg(FILE *outfile, int width, int height, int quality){
 
   Free(pixels);
 }
+
+
+#endif //if !defined(__CYGWIN__)
+
diff --git a/Graphics/gl2ps.cpp b/Graphics/gl2ps.cpp
index 6ba759058435be0a96d7305397090aac17d25573..d07b59b9b789cb520ca685033bb98ec5a0d8959f 100644
--- a/Graphics/gl2ps.cpp
+++ b/Graphics/gl2ps.cpp
@@ -1,4 +1,4 @@
-// $Id: gl2ps.cpp,v 1.6 2001-01-09 19:40:56 remacle Exp $
+// $Id: gl2ps.cpp,v 1.7 2001-01-11 14:11:57 geuzaine Exp $
 
 /*
  * GL2PS, an OpenGL to Postscript Printing Library, version 0.31
@@ -24,13 +24,11 @@
  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
-#ifdef WIN32
-#include <windows.h>
-#endif
-#include <string.h>
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+
 #include <sys/types.h>
-#include <malloc.h>
-#include <math.h>
 #include <stdarg.h>
 #include <time.h>
 
diff --git a/Graphics/gl2ps.h b/Graphics/gl2ps.h
index 4499f24645f44a6d9c5646d9893dba54ab918872..9266b1474a2fc9a5ea9ceead3b995402b1fb9b63 100644
--- a/Graphics/gl2ps.h
+++ b/Graphics/gl2ps.h
@@ -28,7 +28,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <GL/gl.h>
+//#include <GL/gl.h>
 
 #define GL2PS_NONE                       0
 
diff --git a/Makefile b/Makefile
index 6a14f0d89ea68fa3be66120dc7a148a6543091aa..8c1ff4817f8b05a3c0a7a985e6e785504ac4b85b 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.34 2001-01-09 16:09:50 geuzaine Exp $
+# $Id: Makefile,v 1.35 2001-01-11 14:19:48 geuzaine Exp $
 # ----------------------------------------------------------------------
 #  Makefile for Gmsh  
 # ----------------------------------------------------------------------
@@ -110,7 +110,7 @@ gmsh2:
 
 gmsh3:
 	$(CC) -o $(GMSH_BIN_DIR)/gmsh $(GMSH_FLTK_LIB) $(MESA_LIB) \
-                 $(FLTK_LIB) $(THREAD_LIB) -lm
+                 $(FLTK_LIB) -lm
 
 gmsh4:
 	$(CC) -o $(GMSH_BIN_DIR)/gmsh $(GMSH_FLTK_LIB) $(MESA_LIB) \