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