[Gauche-devel-jp] Gauche-gl on cygwin

Back to archive index

Takashi Ishizaki isiza****@da2*****
2007年 7月 8日 (日) 20:43:08 JST


石崎です

wilikiでsasagawaさんとshiroさんのやりとり[sasagawa:complex]を見て
examples/glbook/example8-6.scmを動かしたら次のエラーが出たので、
ちょっと調べてみました。

"GL extension glConvolutionFilter2D is not supported on this platform"

環境:
  Gauche 0.8.10 [sjis]
  Gauche-gl 0.4.3
  cygwin 昨日(2007/7/7)ネットからsetup.exeでインストールしたもの
         uname -a では次のように表示される
         1.5.21(0.156/4/2) 2006-07-30 14:21 i686 Cygwin
  GL_ARB_imaging はサポートされているNVIDIAのGraphic I/F

1. X が無い環境下でExtension Functionの呼び出しがエラーになる
  cygwin に X Window をインストールしていない、あるいはインストール
  していても ./configure --without-x でビルドする場合。

  gauche-gl.c の Scm_GLGetProcAddressのコメントに書いてありました。
  現在はGLXのケースのみ対応しているとのこと。Win32環境の場合は
  wglGetProcAddressを呼ぶようにする必要があるとのこと。
  下記パッチで動くようですが、どうでしょうか。

2. X環境下の問題
2-1. makeが失敗する
  普通に ./configure して make するとlibgauche-gl.dllのリンク時に
  undefined reference のエラーが大量に出て失敗します。

  これは configure がXを検知してコンパイル時のヘッダーファイルが
  /usr/X11R6/include を参照するようになったにもかかわらず、リンク時の
  ライブラリにX用のものが設定されないためです。
  上記1のXが無い場合は、次のようになってます。
     -lglut32 -lglu32 -lopengl32

  Xを使用する場合は、次のライブラリにしないといけない。
     -lglut -lXmu -lXi -lGLU -lGL -lX11 -lXext

  注)cygwinのfreeglutというパッケージが必要

2-2. 上記のライブラリの問題が解決しても、Extention Function呼び出し
     がエラーになる
  これは configure のAC_CHECK_HEADERSでGL/glx.hが検出されず、
  HAVE_GL_GLX_H が設定されないのが原因。
  Cygwin の X を普通にインストールすると、GL/glx.h が
  /usr/X11R6/include にインストールされるものの、/usr/include には
   インストールされないので、こうなります。
  configure 時の CPPFLAGS に -I/usr/X11R6/include を設定すれば
  解決します。

2-3. 上記で HAVE_GL_GLX_H が設定されたので、うまくいくと思った
    ら gauche-gl.c のコンパイルで次のエラーになってしまった。

    gauche-gl.c: In function `Scm_GLGetProcAddress':
    gauche-gl.c:143: error: `glXGetProcAddressARB' undeclared

  これの正しい解決方法がわからんのですが、WEBを検索すると
  直接 GLX_GLXEXT_PROTOTYPES を #define するような例があったので
  やってみたところ、問題なさげでした。

以上をまとめたパッチ・ファイルを以下に示します。
configure.in の修正があるので autoconf する必要があります。

8<------------------------------------------------------------------------->8
--- Gauche-gl-0.4.3-org/configure.in	2007-01-18 04:19:16.00 +0900
+++ Gauche-gl-0.4.3/configure.in	2007-07-08 09:48:44.25 +0900
@@ -11,7 +11,13 @@

 case "$target" in
   *-*-cygwin*)
-    LIBGLUT=glut32;;
+    if test "x-$have_x" = "x-disabled" -o "x-$have_x" = "x-no";
+    then
+      LIBGLUT=glut32;
+    else
+      LIBGLUT=glut
+      CPPFLAGS="$CPPFLAGS -I$x_includes";
+    fi;;
   *)
     LIBGLUT=glut;;
 esac
--- Gauche-gl-0.4.3-org/src/gauche-gl.h	2007-01-15 19:22:41.00 +0900
+++ Gauche-gl-0.4.3/src/gauche-gl.h	2007-07-07 19:11:50.53 +0900
@@ -28,9 +28,14 @@
 #endif

 #ifdef HAVE_GL_GLX_H
+#define GLX_GLXEXT_PROTOTYPES
 #include <GL/glx.h>
 #endif

+#if defined(__CYGWIN__) && defined(X_DISPLAY_MISSING)
+#include <windows.h>
+#endif
+
 #include <gauche/uvector.h>
 #include "gauche/math3d.h"

--- Gauche-gl-0.4.3-org/src/gauche-gl.c	2007-01-16 10:39:09.00 +0900
+++ Gauche-gl-0.4.3/src/gauche-gl.c	2007-07-07 17:31:22.42 +0900
@@ -149,6 +149,10 @@
     }
 #elif defined(MacOSX)
     return glutGetProcAddress(name);
+#elif defined(__CYGWIN__) && defined(X_DISPLAY_MISSING)
+    if (wglGetProcAddress != NULL) {
+      return wglGetProcAddress(name);
+    }
 #endif /* !defined(GLX_VERSION_1_4) &&
!defined(GLX_ARB_get_proc_address) */
     Scm_Error("GL extension %s is not supported on this platform", name);
 }
8<------------------------------------------------------------------------->8

以上




Gauche-devel-jp メーリングリストの案内
Back to archive index