ypsilon の新しいバージョン 0.9.6-update3 がリリースされました。
試しに手元の Linux 環境(AMD Duron(tm) Processor)でビルドしてみたところ、「不正な命令です」というエラーで動作しませんでした。
しかし幸運にも http://d.hatena.ne.jp/fujita-y/20081223#c1230217752 に原因と対策が述べられていたので、以下のようにして無事 make check を全てパスしました:
tabe@biblo:~/src/ypsilon-0.9.6.update3$ sed -e 's/sse2/sse/' Makefile > Makefile.new
tabe@biblo:~/src/ypsilon-0.9.6.update3$ diff -u Makefile{,.new}
--- Makefile 2008-12-23 17:56:02.000000000 +0900
+++ Makefile.new 2008-12-26 22:29:41.000000000 +0900
@@ -42,7 +42,7 @@
else
CXXFLAGS += -march=native
endif
- CXXFLAGS += -msse2 -mfpmath=sse
+ CXXFLAGS += -msse -mfpmath=sse
ifeq ($(DATAMODEL), ILP32)
CPPFLAGS += -DDEFAULT_HEAP_LIMIT=32
CXXFLAGS += -m32
@@ -68,7 +68,7 @@
CXXFLAGS += -march=native
endif
CPPFLAGS += -D__LITTLE_ENDIAN__
- CXXFLAGS += -msse2 -mfpmath=sse
+ CXXFLAGS += -msse -mfpmath=sse
ifeq ($(DATAMODEL), ILP32)
CPPFLAGS += -DDEFAULT_HEAP_LIMIT=32
CXXFLAGS += -m32
@@ -94,7 +94,7 @@
CXXFLAGS += -march=native
endif
CPPFLAGS += -D__LITTLE_ENDIAN__ -DNO_TLS
- CXXFLAGS += -msse2 -mfpmath=sse
+ CXXFLAGS += -msse -mfpmath=sse
ifeq ($(DATAMODEL), ILP32)
CPPFLAGS += -DDEFAULT_HEAP_LIMIT=32
CXXFLAGS += -m32
@@ -112,7 +112,7 @@
endif
ifneq (, $(findstring Darwin, $(UNAME)))
- CXXFLAGS += -arch i386 -msse2 -mfpmath=sse
+ CXXFLAGS += -arch i386 -msse -mfpmath=sse
CPPFLAGS += -DNO_TLS
SRCS += ffi_stub_darwin.s
endif
tabe@biblo:~/src/ypsilon-0.9.6.update3$ mv Makefile{,.orig}
tabe@biblo:~/src/ypsilon-0.9.6.update3$ mv Makefile{.new,}
さらに今回は GD を題材にして FFI を試してみました。
(library (linux libgd)
(export gd-image-create
gd-image-destroy
gd-image-color-allocate
gd-image-line
gd-image-rectangle
gd-image-png-ptr
gd-free)
(import (rnrs) (ffi))
(define libgd-name "libgd.so.2")
(define libgd (load-shared-object libgd-name))
(define gd-image-create (c-function libgd libgd-name void* gdImageCreate (int int)))
(define gd-image-destroy (c-function libgd libgd-name void gdImageDestroy (void*)))
(define gd-image-color-allocate (c-function libgd libgd-name int gdImageColorAllocate (void* int int int)))
(define gd-image-rectangle (c-function libgd libgd-name void gdImageRectangle (void* int int int int int)))
(define gd-image-line (c-function libgd libgd-name void gdImageLine (void* int int int int int)))
(define gd-image-png-ptr (c-function libgd libgd-name void* gdImagePngPtr (void* byte*)))
(define gd-free (c-function libgd libgd-name void gdFree (void*)))
)
(import (ffi) (linux libgd))
(let ((im (gd-image-create 100 100)))
(gd-image-color-allocate im #xff #xff #xff) ; background color
(let ((c (gd-image-color-allocate im #xff #x00 #x00)))
(gd-image-rectangle im 20 20 80 80 c)
(gd-image-line im 20 80 80 20 c))
(let* ((bsize (make-bytevector sizeof:int))
(ptr (gd-image-png-ptr im bsize))
(size (bytevector-c-int-ref bsize 0))
(bvector (make-bytevector-mapping ptr size)))
(let ((oport (open-file-output-port "square.png")))
(put-bytevector oport bvector)
(close-port oport))
(gd-free ptr)
)
(gd-image-destroy im)
)
このスクリプトを Linux 環境で実行すると、うまく png が出力できました:
square.pngbytevector も使いやすくてすごく簡単ですね!
気づいた点:
call-with-output-file
では引数の手続きに渡る出力ポートが textual port になる