Hello everyone,

I have finally (actually about a week ago but I've been out of town)
gotten FlightGear to compile under Mac OS X 10.2.4.  The results were
surprising and I am probably going to rub a few feathers the wrong way in
the process of explanation.  I don't mean to offend but I need to be clear
about what I see happening and sometimes plain language offends people.

As you may recall, I was getting a linker error when linking fgfs.
As someone more wise in the ways of ld than I pointed out, the method
as compiled in tr.cxx was different from how the method call was being
compiled in gui_funcs.cxx.  The reason was that in tr.cxx, GLint was
being defined as an integer, but in gui_funcs.cxx it was being defined
as a long.  Further exploration with the precompiler showed that SimGear
was finding Apple's OpenGL gl.h, but FlightGear was finding XFree86's
gl.h, and the two define GLint differently.

Now I could just degenerate into name-calling about Apple's headers but
as I looked around more in all the code that FlightGear uses I discovered
that plib was not having any problems with the situation and that the
linker wasn't complaining about the plib libraries.  I found that plib's
configure script was handling Mac OS X differently and specifically
defining the location of glut.h to use Apple's OpenGL glut.h (which in
turn includes gl.h).

I am not a configure hacker but decided that I could emulate what plib
was doing with some judicious complier defines in SimGear and FlightGear,
just to see if it would work.  I did and it did.

It also took care of the error below that I had absolutely no idea how
to address:
ld: Undefined symbols:
ssgVtxTable::ssgVtxTable[in-charge](unsigned, ssgVertexArray*, ssgNormalArray*, 
ssgTexCoordArray*, ssgColourArray*)
Although, I still get this on my G4 tower where X, etc. are installed,
even after I make the code changes in the attached patches.

I was able to get FlightGear to compile from CVS by doing the following:
- fresh install of Mac OS 10.2 (Jaguar)
- install the 10.2.4 combined update
- install the December 2002 Developer Tools
- install the Apple update to GLUT, which just came out recently
  (just for kicks, probably isn't needed)
- pull down CVS versions of plib, metakit, SimGear, and FlightGear
- apply the attached patches
  - the patches to plib are per Jonathan Polley
  - the patches are against CVS from a few days ago
- run the attached build scripts

The compile does stop at one point, I haven't figured out why this is
happening, but here is the event and the workaround (change gcc to g++):

bash-2.05a$ cd SimGear/simgear/xgl/
bash-2.05a$ make clean
test -z "libsgxgl.a" || rm -f libsgxgl.a
rm -f *.o core *.core
bash-2.05a$ make
source='xgl.c' object='xgl.o' libtool=no \
depfile='.deps/xgl.Po' tmpdepfile='.deps/xgl.TPo' \
depmode=gcc /bin/sh ../../depcomp \
gcc -DHAVE_CONFIG_H -I. -I. -I../../simgear -I../..  
-I/Users/david/Desktop/FlightGear-CVS/include  -g -O1 -finline-limit=6 
-finline-functions -faltivec -D_REENTRANT -c `test -f 'xgl.c' || echo './'`xgl.c
xgl.c:10: header file 'GLUT/glut.h' not found
cpp-precomp: warning: errors during smart preprocessing, retrying in basic mode
make: *** [xgl.o] Error 1
bash-2.05a$ source='xgl.c' object='xgl.o' libtool=no \
> depfile='.deps/xgl.Po' tmpdepfile='.deps/xgl.TPo' \
> depmode=gcc /bin/sh ../../depcomp \
> g++ -DHAVE_CONFIG_H -I. -I. -I../../simgear -I../..  
> -I/Users/david/Desktop/FlightGear-CVS/include  -g -O1 -finline-limit=6 
> -finline-functions -faltivec -D_REENTRANT -c `test -f 'xgl.c' || echo './'`xgl.c
bash-2.05a$ make
source='xglUtils.c' object='xglUtils.o' libtool=no \
depfile='.deps/xglUtils.Po' tmpdepfile='.deps/xglUtils.TPo' \
depmode=gcc /bin/sh ../../depcomp \
gcc -DHAVE_CONFIG_H -I. -I. -I../../simgear -I../..  
-I/Users/david/Desktop/FlightGear-CVS/include  -g -O1 -finline-limit=6 
-finline-functions -faltivec -D_REENTRANT -c `test -f 'xglUtils.c' || echo 
'./'`xglUtils.c
rm -f libsgxgl.a
ar cru libsgxgl.a xgl.o xglUtils.o 
ranlib libsgxgl.a

No X, Apple or XFree86, no OpenGL, no freeglut, or glut, or fink.
Which may bother people.  Some Mac OS X users may not want to bother with
these, understandably, in which case the SimGear and FlightGear code
will have to be changed to compile this way.  Others, more inclined to
compile everything from source, will not want these changes in the code
(even though they are already in plib) or will insist on a configure-time
switch determining one behavior or the other.

But the code (i.e. configure scripts and #include statements) is going
to have to be changed/updated/complicated to accommodate the fact that
Mac OS X may not have X, may have Apple's X, or may have XFree86; that
it may have Apple's OpenGL and GLUT or not, or any combination of the
above, so long as these header discrepancies exist.

One issue that I am dealing with is that the frame rate is poor, even
though precompiled versions I have had in the past had good (~30 fps)
rates.  It could turn out that Apple's OpenGL and GLUT are the culprit,
which would give momentum to requiring those libraries to be built or
installed from fink.  I don't know yet.

Again, I apologize (and apologise) for a semi-rant.  I want the
information to be out there for the people who can do something with
it, and more for the person starting out with FlightGear on Mac OS X,
since I wrestled with this same problem for four or five months.

Regards,

David K. Drum
[EMAIL PROTECTED]
Index: src/GUI/net_dlg.cxx
===================================================================
RCS file: /var/cvs/FlightGear-0.9/FlightGear/src/GUI/net_dlg.cxx,v
retrieving revision 1.1.1.1
diff -u -u -r1.1.1.1 net_dlg.cxx
--- src/GUI/net_dlg.cxx 10 Sep 2002 01:14:04 -0000      1.1.1.1
+++ src/GUI/net_dlg.cxx 28 Feb 2003 21:55:15 -0000
@@ -36,7 +36,11 @@
 #include <simgear/misc/sg_path.hxx>
 
 #include <Include/general.hxx>
+#ifndef __APPLE__
 #include <GL/gl.h>
+#else
+#include <OpenGL/gl.h>
+#endif
 
 #include <Main/globals.hxx>
 #include <Main/fg_props.hxx>
Index: src/Model/panelnode.cxx
===================================================================
RCS file: /var/cvs/FlightGear-0.9/FlightGear/src/Model/panelnode.cxx,v
retrieving revision 1.4
diff -u -u -r1.4 panelnode.cxx
--- src/Model/panelnode.cxx     17 Nov 2002 12:56:01 -0000      1.4
+++ src/Model/panelnode.cxx     28 Feb 2003 21:55:17 -0000
@@ -5,7 +5,11 @@
 #include <simgear/compiler.h>
 #include <vector>
 
+#ifndef __APPLE__
 #include <GL/gl.h>
+#else
+#include <OpenGL/gl.h>
+#endif
 #include <plib/sg.h>
 
 #include <Main/fg_props.hxx>
Index: src/js/js.h
===================================================================
RCS file: /cvsroot/plib/plib/src/js/js.h,v
retrieving revision 1.29
diff -u -r1.29 js.h
--- src/js/js.h 4 Jan 2003 02:55:53 -0000       1.29
+++ src/js/js.h 28 Feb 2003 21:51:04 -0000
@@ -95,9 +95,8 @@
 #elif defined(UL_MAC_OSX)
 
   IOHIDDeviceInterface ** hidDev;
-  static const int kNumDevices;
   static int numDevices;
-  static io_object_t ioDevices[kNumDevices];
+  static io_object_t *ioDevices;
 
   static void findDevices(mach_port_t);
   static CFDictionaryRef getCFProperties(io_object_t);
Index: src/js/jsMacOSX.cxx
===================================================================
RCS file: /cvsroot/plib/plib/src/js/jsMacOSX.cxx,v
retrieving revision 1.1
diff -u -r1.1 jsMacOSX.cxx
--- src/js/jsMacOSX.cxx 4 Jan 2003 02:55:54 -0000       1.1
+++ src/js/jsMacOSX.cxx 28 Feb 2003 21:51:06 -0000
@@ -14,9 +14,9 @@
 #      include <Kernel/IOKit/hidsystem/IOHIDUsageTables.h>
 #endif
 
-int jsJoystick::kNumDevices = 32 ;
+
 int jsJoystick::numDevices = -1;
-io_object_t jsJoystick::ioDevices[kNumDevices];
+io_object_t* jsJoystick::ioDevices = NULL;
 
 jsJoystick::jsJoystick(int ident) :
        id(ident), 
@@ -44,6 +44,12 @@
        
        // get the name now too
        CFDictionaryRef properties = getCFProperties(ioDevices[id]);
+            if (!properties) {
+                ulSetError(UL_WARNING, "failed to get properties for JS device");
+                setError();
+                return;
+            }
+            
        CFTypeRef ref = CFDictionaryGetValue (properties, CFSTR(kIOHIDProductKey));
        if (!ref)
                ref = CFDictionaryGetValue (properties, CFSTR("USB Product Name"));
@@ -75,8 +81,14 @@
                return;
        }
        
+       // count them and allocate storage
+       while (IOIteratorNext(hidIterator)) ++numDevices;
+       ioDevices = new io_object_t[numDevices];
+       IOIteratorReset(hidIterator);
+       
        // iterate
        io_object_t ioDev;
+       int index = 0;
        
        while ((ioDev = IOIteratorNext(hidIterator))) {
        // filter out keyboard and mouse devices
@@ -90,12 +102,14 @@
                
                // exclude keyboard / mouse devices
                if ((page == kHIDPage_GenericDesktop) && 
-                       ((usage == kHIDUsage_GD_Keyboard) || (usage == 
kHIDUsage_GD_Mouse))
-                       )
+                       ((usage == kHIDUsage_GD_Keyboard) || (usage == 
kHIDUsage_GD_Mouse))) {
+                    // we need to drop the numDevices count back down, since we 
included
+                    // these when allocating storage above.
+                    --numDevices;
                        continue;
-       
+                }
                // add it to the array
-               ioDevices[numDevices++] = ioDev;
+               ioDevices[index++] = ioDev;
        }
        
        IOObjectRelease(hidIterator);
Index: simgear/screen/tr.cxx
===================================================================
RCS file: /var/cvs/SimGear-0.3/SimGear/simgear/screen/tr.cxx,v
retrieving revision 1.1.1.1
diff -u -u -r1.1.1.1 tr.cxx
--- simgear/screen/tr.cxx       7 Sep 2002 02:58:19 -0000       1.1.1.1
+++ simgear/screen/tr.cxx       28 Feb 2003 21:53:28 -0000
@@ -62,8 +62,13 @@
 #ifdef WIN32
 #include <windows.h>
 #endif
+#ifndef __APPLE__
 #include <GL/gl.h>
 #include <GL/glu.h>
+#else
+#include <OpenGL/gl.h>
+#include <OpenGL/glu.h>
+#endif
 #include <plib/ssg.h>
 #include "tr.h"
 
Index: simgear/screen/tr.h
===================================================================
RCS file: /var/cvs/SimGear-0.3/SimGear/simgear/screen/tr.h,v
retrieving revision 1.1.1.1
diff -u -u -r1.1.1.1 tr.h
--- simgear/screen/tr.h 7 Sep 2002 02:58:19 -0000       1.1.1.1
+++ simgear/screen/tr.h 28 Feb 2003 21:53:29 -0000
@@ -76,7 +76,11 @@
 #define TR_H
 
 
+#ifndef __APPLE__
 #include <GL/gl.h>
+#else
+#include <OpenGL/gl.h>
+#endif
 
 
 //#ifdef __cplusplus
Index: simgear/sky/clouds3d/SkyContext.cpp
===================================================================
RCS file: /var/cvs/SimGear-0.3/SimGear/simgear/sky/clouds3d/SkyContext.cpp,v
retrieving revision 1.3
diff -u -u -r1.3 SkyContext.cpp
--- simgear/sky/clouds3d/SkyContext.cpp 10 Dec 2002 19:12:36 -0000      1.3
+++ simgear/sky/clouds3d/SkyContext.cpp 28 Feb 2003 21:53:31 -0000
@@ -30,7 +30,9 @@
 
 #include GLUT_H
 
-#ifndef WIN32
+#if defined (__APPLE__)
+#include <OpenGL/CGLCurrent.h>
+#else if !defined (WIN32)
 #include <GL/glx.h>
 #endif
 
@@ -134,8 +136,10 @@
 */ 
 SkyMaterial* SkyContext::GetCurrentMaterial()
 {
-#ifdef WIN32
+#if defined (WIN32)
     ContextMaterialIterator cmi = _currentMaterials.find(wglGetCurrentContext());
+#elif defined (__APPLE__)
+    ContextMaterialIterator cmi = _currentMaterials.find(CGLGetCurrentContext());
 #else
     ContextMaterialIterator cmi = _currentMaterials.find(glXGetCurrentContext());
 #endif
@@ -162,8 +166,10 @@
  */ 
 SkyTextureState* SkyContext::GetCurrentTextureState()
 {
-#ifdef WIN32
+#if defined (WIN32)
     ContextTextureStateIterator ctsi = 
_currentTextureState.find(wglGetCurrentContext());
+#elif defined (__APPLE__)
+    ContextTextureStateIterator ctsi = 
_currentTextureState.find(CGLGetCurrentContext());
 #else
     ContextTextureStateIterator ctsi = 
_currentTextureState.find(glXGetCurrentContext());
 #endif
@@ -190,15 +196,19 @@
 SKYRESULT SkyContext::AddCurrentGLContext()
 {
     SkyMaterial *pCurrentMaterial = new SkyMaterial;
-#ifdef WIN32
+#if defined (WIN32)
     _currentMaterials.insert(std::make_pair(wglGetCurrentContext(), 
pCurrentMaterial));
+#elif defined (__APPLE__)
+   _currentMaterials.insert(std::make_pair(CGLGetCurrentContext(), pCurrentMaterial));
 #else
     _currentMaterials.insert(std::make_pair(glXGetCurrentContext(), 
pCurrentMaterial));
 #endif
 
     SkyTextureState *pCurrentTS = new SkyTextureState;
-#ifdef WIN32
+#if defined (WIN32)
     _currentTextureState.insert(std::make_pair(wglGetCurrentContext() , pCurrentTS));
+#elif defined (__APPLE__)
+   _currentTextureState.insert(std::make_pair(CGLGetCurrentContext() , pCurrentTS));
 #else
     _currentTextureState.insert(std::make_pair(glXGetCurrentContext() , pCurrentTS));
 #endif
Index: simgear/sky/clouds3d/extgl.h
===================================================================
RCS file: /var/cvs/SimGear-0.3/SimGear/simgear/sky/clouds3d/extgl.h,v
retrieving revision 1.3
diff -u -u -r1.3 extgl.h
--- simgear/sky/clouds3d/extgl.h        17 Nov 2002 00:42:17 -0000      1.3
+++ simgear/sky/clouds3d/extgl.h        28 Feb 2003 21:53:53 -0000
@@ -30,7 +30,11 @@
 #define __glext_h_
 #define __GLEXT_H_
 
+#ifndef __APPLE__
 #include <GL/gl.h>
+#else
+#include <OpenGL/gl.h>
+#endif
 
 #ifndef APIENTRY
 #define APIENTRY
Index: simgear/xgl/xgl.h
===================================================================
RCS file: /var/cvs/SimGear-0.3/SimGear/simgear/xgl/xgl.h,v
retrieving revision 1.1.1.1
diff -u -u -r1.1.1.1 xgl.h
--- simgear/xgl/xgl.h   7 Sep 2002 02:58:19 -0000       1.1.1.1
+++ simgear/xgl/xgl.h   28 Feb 2003 21:53:58 -0000
@@ -10,8 +10,13 @@
 #  include <windows.h>
 #endif
 
+#ifndef __APPLE__
 #include <GL/gl.h>
 #include <GL/glu.h>
+#else
+#include <OpenGL/gl.h>
+#include <OpenGL/glu.h>
+#endif
 #include <stdio.h>
 
 

Attachment: envars.sh
Description: Bourne shell script

Attachment: plib.sh
Description: Bourne shell script

Attachment: metakit.sh
Description: Bourne shell script

Attachment: sg.sh
Description: Bourne shell script

Attachment: fg.sh
Description: Bourne shell script

Reply via email to