OK, I've done some more research on differences between various GLUT
libraries; please try the attached patch rather than the one from tentra
(mine includes his with a couple changes and several additions).


-'f

=== config/auto/opengl/opengl.in
==================================================================
--- config/auto/opengl/opengl.in	(revision 4810)
+++ config/auto/opengl/opengl.in	(local)
@@ -4,9 +4,11 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-/* XXXX: This location is platform dependent.  What's the preferred
-         way to find headers that move? */
+#ifdef __APPLE_CC__
+#include <GLUT/glut.h>
+#else
 #include <GL/glut.h>
+#endif
 
 
 int main(int argc, char *argv[])
@@ -15,6 +17,16 @@
         printf("glutInit is NULL\n");
         return EXIT_FAILURE;
     }
-    printf("%d\n", GLUT_API_VERSION);
+
+#ifdef OPENGLUT
+    printf("%d OpenGLUT\n",    GLUT_API_VERSION);
+#elif  FREEGLUT
+    printf("%d freeglut\n",    GLUT_API_VERSION);
+#elif  GLUT_MACOSX_IMPLEMENTATION
+    printf("%d MacOSX_GLUT\n", GLUT_API_VERSION);
+#else
+    printf("%d GLUT\n",        GLUT_API_VERSION);
+#endif
+
     return EXIT_SUCCESS;
 }
=== config/auto/opengl.pm
==================================================================
--- config/auto/opengl.pm	(revision 4810)
+++ config/auto/opengl.pm	(local)
@@ -66,8 +66,7 @@
     eval { $conf->cc_build() };
     if ( !$@ ) {
         my $test = $conf->cc_run();
-        $has_glut = $self->_evaluate_cc_run($test, $verbose);
-        _handle_glut($conf, $has_glut);
+        $has_glut = _handle_glut($conf, $self->_evaluate_cc_run($test, $verbose));
     }
     unless ($has_glut) {
         # The Parrot::Configure settings might have changed while class ran
@@ -88,6 +87,9 @@
             $conf->data->add( ' ', libs => 'glut.lib glu.lib gl.lib' );
         }
     }
+    elsif ( $osname =~ /darwin/i ) {
+        $conf->data->add( ' ', libs => '-framework OpenGL -framework GLUT' );
+    }
     else {
         $conf->data->add( ' ', libs => '-lglut -lGLU -lGL' );
     }
@@ -96,25 +98,29 @@
 
 sub _evaluate_cc_run {
     my ($self, $test, $verbose) = @_;
-    chomp $test;
-    my $has_glut = $test;
-    print " (yes, GLUT API $has_glut) " if $verbose;
-    $self->set_result("yes, GLUT $has_glut");
-    return $has_glut;
+    my ($glut_api_version, $glut_brand) = split ' ', $test;
+
+    print " (yes, $glut_brand API version $glut_api_version) " if $verbose;
+    $self->set_result("yes, $glut_brand $glut_api_version");
+
+    return ($glut_api_version, $glut_brand);
 }
 
 sub _handle_glut {
-    my ($conf, $has_glut) = @_;
+    my ($conf, $glut_api_version, $glut_brand) = @_;
+
     $conf->data->set(
         # Completely cargo culted
         opengl     => 'define',
-        has_opengl => $has_glut,
-        HAS_OPENGL => $has_glut,
+        has_opengl => 1,
+        HAS_OPENGL => 1,
 
         glut       => 'define',
-        has_glut   => $has_glut,
-        HAS_GLUT   => $has_glut,
+        glut_brand => $glut_brand,
+        has_glut   => $glut_api_version,
+        HAS_GLUT   => $glut_api_version,
     );
+
     return 1;
 }
 
=== config/gen/opengl.pm
==================================================================
--- config/gen/opengl.pm	(revision 4810)
+++ config/gen/opengl.pm	(local)
@@ -60,18 +60,25 @@
 );
 
 my @GLUT_4_CALLBACKS = (
-    [ 'Close',            'void' ],
-    [ 'Menu Destroy',     'void' ],
-    [ 'WM Close',         'void' ],
     [ 'Window Status',    'int state' ],
     [ 'Keyboard Up',      'unsigned char key, int x, int y' ],
     [ 'Special Up',       'int key, int x, int y' ],
-    [ 'Mouse Wheel',      'int wheel, int direction, int x, int y' ],
 
     # NOTE: Hardcoded because of special arguments
     # [ 'Joystick',         'int buttons, int xaxis, int yaxis, int zaxis' ],
 );
 
+my @MACOSXGLUT_CALLBACKS = (
+    # Also works in freeglut
+    [ 'WM Close',         'void' ],
+);
+
+my @FREEGLUT_CALLBACKS = (
+    [ 'Close',            'void' ],
+    [ 'Menu Destroy',     'void' ],
+    [ 'Mouse Wheel',      'int wheel, int direction, int x, int y' ],
+);
+
 my $MACRO_FILE = 'runtime/parrot/include/opengl_defines.pasm';
 my $C_FILE     = 'src/glut_callbacks.c';
 
@@ -93,23 +100,29 @@
         return 1;
     }
 
-    $self->gen_opengl_defines($conf);
+    my @header_globs = (
+        '/usr/include/GL/*.h',
+        '/System/Library/Frameworks/OpenGL.framework/Headers/*.h',
+        '/System/Library/Frameworks/GLUT.framework/Headers/*.h',
+    );
+                 
+    my @header_files = sort map {glob} @header_globs;
+
+    $self->gen_opengl_defines($conf, [EMAIL PROTECTED]);
     $self->gen_glut_callbacks($conf);
 
     return 1;
 }
 
 sub gen_opengl_defines {
-    my ( $self, $conf ) = @_;
+    my ( $self, $conf, $header_files ) = @_;
 
     my $verbose = $conf->options->get('verbose');
 
-    my @header_files = glob '/usr/include/GL/*.h';
-
     my (%defs, @macros);
     my $max_len = 0;
 
-    foreach my $file (@header_files) {
+    foreach my $file (@$header_files) {
         open my $header, '<', $file
         or die "Could not open header '$file': $!";
 
@@ -157,7 +170,7 @@
 #
 HEADER
 
-    print $macros "# $_\n" foreach sort @header_files;
+    print $macros "# $_\n" foreach @$header_files;
     print $macros "\n\n";
 
     foreach my $api (sort keys %defs) {
@@ -177,12 +190,22 @@
 sub gen_glut_callbacks {
     my ( $self, $conf ) = @_;
 
-    my   $glut_api       = $conf->data->get('has_glut');
+    my $glut_api   = $conf->data->get('has_glut');
+    my $glut_brand = $conf->data->get('glut_brand');
+
     my   @glut_callbacks = @GLUT_1_CALLBACKS;
-    push @glut_callbacks,  @GLUT_2_CALLBACKS if $glut_api >= 2;
-    push @glut_callbacks,  @GLUT_3_CALLBACKS if $glut_api >= 3;
-    push @glut_callbacks,  @GLUT_4_CALLBACKS if $glut_api >= 4;
+    push @glut_callbacks,  @GLUT_2_CALLBACKS     if $glut_api   >= 2;
+    push @glut_callbacks,  @GLUT_3_CALLBACKS     if $glut_api   >= 3;
+    push @glut_callbacks,  @GLUT_4_CALLBACKS     if $glut_api   >= 4;
+    push @glut_callbacks,  @FREEGLUT_CALLBACKS   if $glut_brand eq 'freeglut';
+    push @glut_callbacks,  @MACOSXGLUT_CALLBACKS if $glut_brand eq 'freeglut'
+                                                 or $glut_brand eq 'MacOSX_GLUT';
 
+    my $glut_header = $glut_brand eq 'MacOSX_GLUT' ? 'GLUT/glut.h'   :
+                      $glut_brand eq 'OpenGLUT'    ? 'GL/openglut.h' :
+                      $glut_brand eq 'freeglut'    ? 'GL/freeglut.h' :
+                                                     'GL/glut.h'     ;
+
     my @callbacks;
     foreach my $raw (@glut_callbacks) {
         my ($friendly, $params) = @$raw;
@@ -260,7 +283,7 @@
 
 */
 
-#include <GL/freeglut.h>
+#include <$glut_header>
 #include "parrot/parrot.h"
 
 
=== runtime/parrot/library/OpenGL.pir
==================================================================
--- runtime/parrot/library/OpenGL.pir	(revision 4810)
+++ runtime/parrot/library/OpenGL.pir	(local)
@@ -56,16 +56,19 @@
 
     libnames = new 'ResizableStringArray'
     push libnames, 'libGL'
+    push libnames, '/System/Library/Frameworks/OpenGL.framework/OpenGL'
     libgl = load_lib_with_fallbacks('GL', libnames)
     set_global 'libgl', libgl
 
     libnames = new 'ResizableStringArray'
     push libnames, 'libGLU'
+    push libnames, '/System/Library/Frameworks/OpenGL.framework/OpenGL'
     libglu = load_lib_with_fallbacks('GLU', libnames)
     set_global 'libglu', libglu
 
     libnames = new 'ResizableStringArray'
     push libnames, 'libglut'
+    push libnames, '/System/Library/Frameworks/GLUT.framework/GLUT'
     libglut = load_lib_with_fallbacks('GLUT', libnames)
     set_global 'libglut', libglut
 

Reply via email to