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++ の関数が呼べた!
次はテストを作ろう。