Detect sinf/cosf/sqrtf presence with CMake (instead of relying on __cpluscplus)
authorSylvain Beucler <beuc@beuc.net>
Tue, 1 May 2012 14:14:54 +0000 (14:14 +0000)
committerSylvain Beucler <beuc@beuc.net>
Tue, 1 May 2012 14:14:54 +0000 (14:14 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1276 7f0cb862-5218-0410-a997-914c9d46530a

CMakeLists.txt
config.h.in
src/fg_geometry.c

index f1c406f..83e5d31 100644 (file)
@@ -261,6 +261,27 @@ IF (NOT (HAVE_STDINT_H OR HAVE_INTTYPES_H))
     ENDIF()
 ENDIF()
 
+# Check for sinf/cosf/sqrtf
+# CHECK_FUNCTION_EXISTS doesn't work because check requires <math.h>
+#CHECK_FUNCTION_EXISTS(sinf      HAVE_SINF)
+#CHECK_FUNCTION_EXISTS(cosf      HAVE_COSF)
+#CHECK_FUNCTION_EXISTS(sqrtf     HAVE_SQRTF)
+INCLUDE(CheckCSourceCompiles)
+CHECK_C_SOURCE_COMPILES("
+    #include <math.h>
+    int main(){sinf(0); return 0;}
+    " HAVE_SINF
+)
+CHECK_C_SOURCE_COMPILES("
+    #include <math.h>
+    int main(){cosf(0); return 0;}
+    " HAVE_COSF
+)
+CHECK_C_SOURCE_COMPILES("
+    #include <math.h>
+    int main(){sqrtf(0); return 0;}
+    " HAVE_SQRTF
+)
 
 # The generated config.h is placed in the project's build directory, just to
 # ensure that all CMake-generated files are kept away from the main source tree.
index a7528b7..462d327 100644 (file)
@@ -12,6 +12,9 @@
 #cmakedefine HAVE_GETTIMEOFDAY
 #cmakedefine HAVE_VFPRINTF
 #cmakedefine HAVE_DOPRNT
+#cmakedefine HAVE_SINF
+#cmakedefine HAVE_COSF
+#cmakedefine HAVE_SQRTF
 #cmakedefine NEED_XPARSEGEOMETRY_IMPL
 #cmakedefine HAVE_STDINT_H
 #cmakedefine HAVE_INTTYPES_H
index f9c5f62..3c1ecb9 100644 (file)
  * Need more types of polyhedra? See CPolyhedron in MRPT
  */
 
+/* VC++6 in C mode doesn't have C99's sinf/cos/sqrtf */
+#ifndef HAVE_SINF
+#define sinf(x) (float)sin((double)(x))
+#endif
+#ifndef HAVE_COSF
+#define cosf(x) (float)cos((double)(x))
+#endif
+#ifndef HAVE_SQRTF
+#define sqrtf(x) (float)sqrt((double)(x))
+#endif
 
 /* General functions for drawing geometry
  * Solids are drawn by glDrawArrays if composed of triangles, or by
@@ -829,13 +839,8 @@ static void fghCircleTable(GLfloat **sint, GLfloat **cost, const int n, const GL
 
     for (i=1; i<size; i++)
     {
-#ifdef __cplusplus
         (*sint)[i] = sinf(angle*i);
         (*cost)[i] = cosf(angle*i);
-#else
-        (*sint)[i] = (float)sin((double)(angle*i));
-        (*cost)[i] = (float)cos((double)(angle*i));
-#endif  /* __cplusplus */
     }
 
     
@@ -948,13 +953,8 @@ void fghGenerateCone(
     const GLfloat rStep = (GLfloat)base / ( ( stacks > 0 ) ? stacks : 1 );
 
     /* Scaling factors for vertex normals */
-#ifdef __cplusplus
     const GLfloat cosn = ( (GLfloat)height / sqrtf( height * height + base * base ));
     const GLfloat sinn = ( (GLfloat)base   / sqrtf( height * height + base * base ));
-#else
-    const GLfloat cosn = ( (GLfloat)height / (GLfloat)sqrt( (double)(height * height + base * base) ));
-    const GLfloat sinn = ( (GLfloat)base   / (GLfloat)sqrt( (double)(height * height + base * base) ));
-#endif  /* __cplusplus */