[Peter Gober] libDAI now compiles out-of-the-box under Cygwin
authorJoris Mooij <joris@jorismooij.nl>
Wed, 24 Dec 2008 12:42:20 +0000 (13:42 +0100)
committerJoris Mooij <joris@jorismooij.nl>
Wed, 24 Dec 2008 12:42:20 +0000 (13:42 +0100)
ChangeLog
Makefile
README
include/dai/prob.h
include/dai/util.h
src/util.cpp

index e347005..3d0272f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+* [Peter Gober] Made libDAI compile out-of-the-box on Cygwin.
+
+
 git 39a4865f4eb0b32109ca50e7980028fed835adb9
 --------------------------------------------
 * [Frederik Eaton] Added Gibbs sampler to algorithms
index 79addfd..49f51cb 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -34,8 +34,12 @@ DEBUG=true
 WITH_MATLAB=
 # New/old matlab version?
 NEW_MATLAB=true
-# Windows or linux (default)?
+
+# Default OS = GNU/Linux
+# Windows Visual C++?
 WINDOWS=
+# Cygwin?
+CYGWIN=
 
 # Directories
 INC=include/dai
@@ -52,7 +56,11 @@ ME=.mexglx
 LIBS=-ldai
 
 # We use the BOOST Program Options library
-BOOSTLIBS=-lboost_program_options
+ifdef CYGWIN
+  BOOSTLIBS=-lboost_program_options-gcc34-mt
+else
+  BOOSTLIBS=-lboost_program_options
+endif
 
 # Compile using GNU C++ Compiler
 CC=g++
@@ -61,6 +69,10 @@ CCO=-o
 
 # Flags for the C++ compiler
 CCFLAGS=-O3 -Wno-deprecated -Wall -W -Wextra -fpic -Iinclude -Llib
+ifdef CYGWIN
+  CCFLAGS:=$(CCFLAGS) -I/usr/local/include/boost-1_37 -DCYGWIN -static
+  # dynamic linking of Boost libraries seems not to work on Cygwin
+endif
 CCDEBUGFLAGS=-g -DDAI_DEBUG
 
 # Build targets
diff --git a/README b/README
index 94b2610..d711e7f 100644 (file)
--- a/README
+++ b/README
@@ -128,10 +128,10 @@ A description of the factor graph (.fg) file format can be found in the file FIL
 Compatibility
 -------------
 The code has been developed under Debian GNU/Linux with the GCC compiler suite.
-libDAI compiles successfully with g++ versions 4.1, 4.2 and 4.3.
+libDAI compiles successfully with g++ versions 3.4, 4.1, 4.2 and 4.3.
 
 libDAI has also been successfully compiled with MS Visual Studio 2008 under Windows
-(but not all build targets are supported yet).
+(but not all build targets are supported yet) and with Cygwin under Windows.
 
 
 Quick start (linux/cygwin)
@@ -147,6 +147,14 @@ On Debian/Ubuntu, you can easily install all these packages with a single comman
 "apt-get install g++ make doxygen libboost-dev libboost-graph-dev libboost-program-options-dev"
 (root permissions needed).
 
+On Cygwin, the prebuilt Cygwin package boost-1.33.1-x is known not to work.
+You can however obtain the latest boost version from http://www.boost.org/
+and compile/install it with:
+
+  ./configure
+  make
+  make install
+
 To build the source, edit the Makefile and adapt it to your local setup. Then, run
     
     make
index 70c8777..629f4d3 100644 (file)
@@ -436,7 +436,13 @@ template <typename T> class TProb {
     
         /// Returns true if one or more entries are NaN
         bool hasNaNs() const {
-            return (std::find_if( _p.begin(), _p.end(), isnan ) != _p.end());
+            bool foundnan = false;
+            for( typename std::vector<T>::const_iterator x = _p.begin(); x != _p.end(); x++ )
+                if( isnan( *x ) ) {
+                    foundnan = true;
+                    break;
+                }
+            return foundnan;
         }
 
         /// Returns true if one or more entries are negative
index 3053b91..5061e4d 100644 (file)
 #include <algorithm>
 
 
-#ifdef WINDOWS
+#if defined(WINDOWS)
     #include <map>
+#elif defined(CYGWIN)
+    #include <boost/tr1/unordered_map.hpp>
 #else
     #include <tr1/unordered_map>
 #endif
index e37cb2b..8a367d8 100644 (file)
 #endif
 
 
+#ifdef CYGWIN
+bool isnan( double x ) {
+    return __isnand( x );  // isnan() is a macro in Cygwin (as required by C99)
+}
+#endif
+
 #ifdef WINDOWS
 bool isnan( double x ) {
     return _isnan( x );