fixedpoint.jp


Ypsilon 0.9.6-update3 (2008-12-26)

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 を試してみました。

little-libgd.scm
(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.png

bytevector も使いやすくてすごく簡単ですね!

気づいた点:


© 2006-2023 fixedpoint.jp