id3lib のバインディングを作る話

なんかいろいろ間違ってたので修正しました。とりあえず、

(use media.id3lib)

が成功した。おめー!でも何も出来ない。何故だろう……

=== Makefile.in
==================================================================
--- Makefile.in	(revision 1214)
+++ Makefile.in	(revision 1215)
@@ -38,16 +38,18 @@
 CONFIG_GENERATED = Makefile config.cache config.log config.status \
 		   configure.lineno autom4te*.cache $(PACKAGE).gpd
 
-GAUCHE_PKGINCDIR  = $(DESTDIR)@GAUCHE_PKGINCDIR@
-GAUCHE_PKGLIBDIR  = $(DESTDIR)@GAUCHE_PKGLIBDIR@
-GAUCHE_PKGARCHDIR = $(DESTDIR)@GAUCHE_PKGARCHDIR@
+GAUCHE_PKGINCDIR  = $(DESTDIR)`$(GAUCHE_CONFIG) --siteincdir`
+GAUCHE_PKGLIBDIR  = $(DESTDIR)`$(GAUCHE_CONFIG) --sitelibdir`
+GAUCHE_PKGARCHDIR = $(DESTDIR)`$(GAUCHE_CONFIG) --sitearchdir`
 
-id3lib_SRCS = id3lib.c id3liblib.stub
+id3lib_SRCS = id3lib_glue.cpp id3liblib.stub
 
 all : $(TARGET)
 
 id3lib.$(SOEXT): $(id3lib_SRCS)
-	$(GAUCHE_PACKAGE) compile cc=$(CXX) --verbose id3lib $(id3lib_SRCS)
+	$(GAUCHE_PACKAGE) compile --verbose \
+	-cc=$(CXX) --libs="-lid3 -lz" \
+	id3lib $(id3lib_SRCS)
 
 check : all
 	@rm -f test.log
=== configure.ac
==================================================================
--- configure.ac	(revision 1214)
+++ configure.ac	(revision 1215)
@@ -19,6 +19,12 @@
 AC_PATH_PROG([GAUCHE_INSTALL], gauche-install)
 AC_PATH_PROG([GAUCHE_CESCONV], gauche-cesconv)
 
+dnl We need the name of C++ compiler.  Actually the C++ compile must
+dnl be compatible with the C compiler used to build Gauche, but I
+dnl don't know how to guarantee that; here we just assume system's
+dnl C++ compiler is compatible with the cc used for Gauche.
+AC_PROG_CXX
+
 dnl Usually these parameters are set by AC_PROG_CC, but we'd rather use
 dnl the same one as Gauche has been compiled with.
 SOEXT=`$GAUCHE_CONFIG --so-suffix`
@@ -28,15 +34,6 @@
 AC_SUBST(OBJEXT)
 AC_SUBST(EXEEXT)
 
-ac_default_prefix=`$GAUCHE_CONFIG --prefix`
-
-GAUCHE_PKGINCDIR=`$GAUCHE_CONFIG --pkgincdir`
-GAUCHE_PKGLIBDIR=`$GAUCHE_CONFIG --pkglibdir`
-GAUCHE_PKGARCHDIR=`$GAUCHE_CONFIG --pkgarchdir`
-AC_SUBST(GAUCHE_PKGINCDIR)
-AC_SUBST(GAUCHE_PKGLIBDIR)
-AC_SUBST(GAUCHE_PKGARCHDIR)
-
 dnl Check for headers.
 dnl Add your macro calls to check required headers, if you have any.
 
=== id3lib_glue.cpp
==================================================================
--- id3lib_glue.cpp	(revision 1214)
+++ id3lib_glue.cpp	(revision 1215)
@@ -16,9 +16,9 @@
   delete q;
 }
 
-extern void Scm_Init_id3lib_lib(ScmModule*);
+extern void Scm_Init_id3liblib(ScmModule*);
 
-void Scm_Init_ID3Tag()
+void Scm_Init_id3lib()
 {
   ScmModule *mod;
 
@@ -35,5 +35,5 @@
                                 SCM_FOREIGN_POINTER_KEEP_IDENTITY|SCM_FOREIGN_POINTER_MAP_NULL);
 
   /* Initialize stub functions */
-  Scm_Init_id3lib_lib(mod);
+  Scm_Init_id3liblib(mod);
 }
=== id3lib_glue.h
==================================================================
--- id3lib_glue.h	(revision 1214)
+++ id3lib_glue.h	(revision 1215)
@@ -11,7 +11,7 @@
 #define ID3LIB_UNBOX(obj)  SCM_FOREIGN_POINTER_REF(ID3_Tag*, obj)
 #define ID3LIB_BOX(ptr)    Scm_MakeForeignPointer(ID3TagClass, ptr)
 
-extern void Scm_Init_ID3Tag();
+extern void Scm_Init_id3lib();
 
 SCM_DECL_END
 
=== id3liblib.stub
==================================================================
--- id3liblib.stub	(revision 1214)
+++ id3liblib.stub	(revision 1215)
@@ -13,7 +13,7 @@
   (expr <id3tag> "new ID3_Tag(name)"))
 
 (define-cproc id3tag-filename (tag::<id3tag>)
-  (expr <const-cstring> "tag->GetFlieName()"))
+  (expr <const-cstring> "tag->GetFileName()"))
 
 ;; Local variables:
 ;; mode: scheme

おおーーー。 stub で作った関数は export してやらないとだめらしい。

;;;
;;; id3lib
;;;

(define-module media.id3lib
  (export test-id3lib ;; dummy
          )
  (export make-id3tag)
  (export id3tag-filename)
  )
(select-module media.id3lib)

;; Loads extension
(dynamic-load "id3lib")

;;
;; Put your Scheme definitions here
;;

;; Epilogue
(provide "media/id3lib")

C++ の関数が呼べた!

次はテストを作ろう。