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