Changeset 14475 in project


Ignore:
Timestamp:
04/27/09 15:04:17 (10 years ago)
Author:
Ivan Raikov
Message:

pyffi ported to Chicken 4

Location:
release/4/pyffi
Files:
1 deleted
4 edited
1 copied

Legend:

Unmodified
Added
Removed
  • release/4/pyffi/trunk/pyffi-eggdoc.scm

    r11623 r14475  
    88     (description "An interface to the Python programming language.")
    99
    10      (author (url "http://chicken.wiki.br/ivan raikov" "Ivan Raikov"))
     10     (author (url "http://chicken.wiki.br/users/ivan-raikov" "Ivan Raikov"))
    1111
    1212     (history
     13      (version "2.11" "Ported to Chicken 4")
    1314      (version "2.10" "Fixes in utf8 support")
    1415      (version "2.9"  "Added support for automatic conversion of Python class instances to Scheme alists")
     
    172173))
    173174     (license
    174       "Copyright 2007 Ivan Raikov. Based on pyffi.lisp by Dmitri Hrapof.
     175      "Copyright 2007-2009 Ivan Raikov. Based on pyffi.lisp by Dmitri Hrapof.
    175176
    176177This program is free software: you can redistribute it and/or modify
  • release/4/pyffi/trunk/pyffi.meta

    r11623 r14475  
    55 ; List here all the files that should be bundled as part of your egg. 
    66
    7  (files "pyffi.scm" "pyffi-eggdoc.scm" "pyffi-support.scm" "pyffi.setup" "example.scm" "swriter.scm")
     7 (files "pyffi.scm" "pyffi-eggdoc.scm" "pyffi.setup" "example.scm" "swriter.scm")
    88
    99 ; Your egg's license:
     
    1818 ; A list of eggs pyffi depends on.
    1919
    20  (needs easyffi eggdoc utf8)
     20 (needs eggdoc easyffi matchable utf8)
    2121
    2222 (eggdoc "pyffi-eggdoc.scm")
  • release/4/pyffi/trunk/pyffi.scm

    r11252 r14475  
    1818;;
    1919
     20(module pyffi
     21
     22   (py-start py-stop py-import py-eval py-apply
     23             raise-python-exception
     24             *py-functions*
     25             (define-pyfun PyCallable_Check Py_DecRef )
     26             (define-pyslot PyObject_GetAttrString PyObject_SetAttrString )
     27             (define-pymethod PyObject_GetAttrString PyObject_CallObject ))
     28
     29
     30   (import scheme chicken lolevel srfi-1 srfi-4 data-structures)
     31
     32   (require-extension easyffi matchable utf8 utf8-lolevel utf8-srfi-13)
     33
     34(define (pyffi:error x . rest)
     35  (let ((port (open-output-string)))
     36    (if (port? x)
     37        (begin
     38          (display "[" port)
     39          (display (port-name x) port)
     40          (display "] " port)))
     41    (let loop ((objs (if (port? x) rest (cons x rest))))
     42      (if (null? objs)
     43          (begin
     44            (newline port)
     45            (error 'pyffi (get-output-string port)))
     46          (begin (display (car objs) port)
     47                 (display " " port)
     48                 (loop (cdr objs)))))))
     49
     50(define (alist? x)  (and (list? x) (every pair? x)))
     51
     52(define-record pytype name to from)
     53
     54(define-syntax define-pytype
     55  (lambda (x r c)
     56    (let ((%define (r 'define))
     57          (%make-pytype (r 'make-pytype))
     58          (name (cadr x))
     59          (to   (caddr x))
     60          (from (cadddr x)))
     61      `(,%define ,name (,%make-pytype ',name ,to ,from)))))
     62
     63(define-syntax translate-to-foreign
     64  (lambda (x r c)
     65    (let ((%pytype-to (r 'pytype-to))
     66          (x (cadr x))
     67          (typ (caddr x)))
     68      `((,%pytype-to ,typ) ,x))))
     69
     70(define-syntax translate-from-foreign
     71  (lambda (x r c)
     72    (let ((%pytype-to (r 'pytype-to))
     73          (x (cadr x))
     74          (typ (caddr x)))
     75      `((,%pytype-to ,typ) ,x))))
     76
     77;; Scheme -> Python
     78(define (py-object-to value)
     79  (cond
     80   ((integer? value)  (translate-to-foreign value py-int))
     81   ((real? value)     (translate-to-foreign value py-float))
     82   ((alist? value)    (translate-to-foreign value py-dict))
     83   ((list? value)     (if (eq? 'ascii (car value))
     84                          (translate-to-foreign (cadr value) py-ascii)
     85                          (translate-to-foreign value py-list)))
     86   ((string? value)   (translate-to-foreign value py-unicode))
     87   ((vector? value)   (translate-to-foreign value py-tuple))
     88   ((pointer? value)  value)
     89   ((boolean? value)  (translate-to-foreign value py-bool))
     90   (else (pyffi:error 'py-object-to "invalid value " value))))
     91
     92;; Python -> Scheme
     93(define (py-object-from value)
     94  (if (not value) (raise-python-exception))
     95  (let ((typ-name   (PyObject_Type_asString value)))
     96    (let ((typ-key (alist-ref typ-name *python-types* string=?)))
     97      (if typ-key
     98          (translate-from-foreign value typ-key)
     99          (begin
     100            (Py_IncRef value)
     101            value)))))
     102
     103;; Embed, but do not parse
     104#>
     105
     106#include <Python.h>
     107
     108
     109#if ((PY_MAJOR_VERSION == 2) && (PY_MINOR_VERSION <= 3))
     110void Py_IncRef (PyObject *x)
     111{
     112  Py_INCREF(x);
     113}
     114
     115void Py_DecRef (PyObject *x)
     116{
     117  Py_DECREF(x);
     118}
     119#endif
     120PyObject *pyffi_PyImport_ImportModuleEx (char *, PyObject *, PyObject *, PyObject *);
     121
     122
     123PyObject *pyffi_PyRun_String (const char *str, int s, PyObject *g, PyObject *l)
     124{
     125   return PyRun_String (str, s, g, l);
     126}
     127
     128
     129PyObject *pyffi_PyImport_ImportModuleEx (char *name, PyObject *g, PyObject *l, PyObject *fl)
     130{
     131   return PyImport_ImportModuleEx (name,g,l,fl);
     132}
     133
     134
     135#ifndef Py_UNICODE_WIDE
     136 int *pyffi_PyUnicode_AsUnicode (PyObject *x)
     137 {
     138    return PyUnicodeUCS2_AsUnicode (x);
     139 }
     140 PyObject *pyffi_PyUnicode_FromUnicode (const int *s, int n)
     141 {
     142    return PyUnicodeUCS2_FromUnicode (s, n);
     143 }
     144 int pyffi_PyUnicode_GetSize (PyObject *x)
     145 {
     146    return PyUnicodeUCS2_GetSize (x);
     147 }
     148#else
     149 int *pyffi_PyUnicode_AsUnicode (PyObject *x)
     150 {
     151    int * result;
     152    result = PyUnicodeUCS4_AsUnicode (x);
     153   
     154    return result;
     155 }
     156 PyObject *pyffi_PyUnicode_FromUnicode (const int *s, int n)
     157 {
     158    return PyUnicodeUCS4_FromUnicode (s, n);
     159 }
     160 int pyffi_PyUnicode_GetSize (PyObject *x)
     161 {
     162    return PyUnicodeUCS4_GetSize (x);
     163 }
     164#endif
     165
     166C_word PyBool_asBool(PyObject *x)
     167{
     168   if (x == (Py_True)) return C_SCHEME_TRUE;
     169   return C_SCHEME_FALSE;
     170}
     171
     172int pyffi_PyUnicode_ref (int *x, int i)
     173{
     174   int result;
     175
     176   if (i >= 0)
     177     result = x[i];
     178   else
     179     result = 0;
     180   
     181   return result;
     182}
     183
     184<#
     185
     186
     187(define PyBool-AsBool (foreign-lambda scheme-object "PyBool_asBool" nonnull-c-pointer))
     188(define pyffi_PyUnicode_ref (foreign-lambda integer "pyffi_PyUnicode_ref" nonnull-c-pointer integer))
     189
     190;; Parse & embed
     191#>!
     192
     193___declare(type, "pyobject;(c-pointer \"PyObject\");py-object-to;py-object-from")
     194
     195<#
     196
     197;; Parse but do not embed
     198#>?
     199void Py_Initialize (void);
     200void Py_Finalize (void);
     201
     202void Py_IncRef (PyObject *);
     203void Py_DecRef (PyObject *);
     204
     205int PyCallable_Check (PyObject *);
     206PyObject *PyErr_Occurred (void);
     207void PyErr_Clear (void);
     208
     209PyObject *PyDict_New (void);
     210pyobject PyDict_Keys (PyObject *);
     211int PyDict_Size  (PyObject *);
     212pyobject PyDict_GetItem (PyObject *, pyobject);
     213pyobject PyDict_GetItemString (PyObject *, const char *);
     214pyobject PyDict_Items (PyObject *);
     215int PyDict_SetItem (PyObject *, pyobject, pyobject);
     216
     217double PyFloat_AsDouble (PyObject *);
     218PyObject *PyFloat_FromDouble (double);
     219
     220pyobject PyImport_GetModuleDict (void);
     221PyObject *PyImport_Import (pyobject );
     222
     223PyObject *PyImport_ImportModule (const char *name);
     224PyObject *PyImport_AddModule (const char *name);
     225
     226
     227long PyInt_AsLong (PyObject *);
     228PyObject *PyInt_FromLong (long);
     229
     230PyObject *PyList_New (int);
     231int PyList_Size (PyObject *);
     232pyobject PyList_GetItem (PyObject *, int);
     233int PyList_SetItem (PyObject *, int, pyobject);
     234
     235pyobject PyModule_GetDict (PyObject *);
     236pyobject PyObject_CallObject (PyObject *, pyobject);
     237
     238pyobject PyObject_GetAttrString (PyObject *, const char *);
     239int PyObject_SetAttrString (PyObject *, const char *, pyobject);
     240pyobject PyObject_Str (PyObject *);
     241
     242
     243char *PyString_AsString (PyObject *);
     244PyObject *PyString_FromString (const char *);
     245
     246PyObject *PyTuple_New (int);
     247int PyTuple_Size (PyObject *);
     248pyobject PyTuple_GetItem (PyObject *, int);
     249int PyTuple_SetItem (PyObject *, int, pyobject);
     250
     251
     252PyObject *PyBool_FromLong(long);
     253
     254<#
     255
     256
     257;; Parse & embed
     258#>!
     259
     260PyObject *pyffi_PyImport_ImportModuleEx (char *, PyObject *, PyObject *, PyObject *);
     261
     262pyobject pyffi_PyRun_String (const char *str, int s, PyObject *g, PyObject *l);
     263
     264int *pyffi_PyUnicode_AsUnicode (PyObject *);
     265PyObject *pyffi_PyUnicode_FromUnicode (const int *, int);
     266int pyffi_PyUnicode_GetSize (PyObject *);
     267
     268
     269PyObject *PyModule_GetDict_asPtr (PyObject *x)
     270{
     271 return PyModule_GetDict (x);
     272}
     273
     274char *PyString_asString(pyobject op)
     275{
     276 printf ("PyString_AsString\n");
     277  return (((PyStringObject *)(op))->ob_sval);
     278}
     279
     280char *PyObject_Type_asString (pyobject x)
     281{
     282  PyObject *typ, *str;
     283
     284  typ = PyObject_Type (x);
     285  str = PyObject_Str (typ);
     286
     287  Py_DecRef (typ);
     288
     289  return (((PyStringObject *)(str))->ob_sval);
     290}
     291
     292char *PyErr_Occurred_asString (void)
     293{
     294  PyObject *exc, *str;
     295
     296  exc = PyErr_Occurred ();
     297  str = PyObject_Str (exc);
     298
     299  Py_DecRef (exc);
     300
     301  return (((PyStringObject *)(str))->ob_sval);
     302}
     303<#
     304
     305
     306(define (pyerror-exn x) (make-property-condition 'pyerror 'message x))
     307
     308(define (raise-python-exception)
     309  (let* ((desc   (PyErr_Occurred_asString)))
     310    (PyErr_Clear)
     311    (print-error-message desc)
     312    (signal (pyerror-exn desc))))
     313
     314(define-pytype py-int PyInt_FromLong PyInt_AsLong)
     315
     316(define-pytype py-tuple
     317  (lambda (value)
     318    (let* ((len (vector-length value))
     319           (tup (PyTuple_New len)))
     320       (if (not tup) (raise-python-exception))
     321       (let loop ((i 0))
     322         (if (< i len)
     323             (begin
     324               (if (not (zero? (PyTuple_SetItem tup i (vector-ref value i))))
     325                   (raise-python-exception))
     326               (loop (+ 1 i)))
     327             tup))))
     328  (lambda (value)
     329    (let* ((len (PyTuple_Size value))
     330           (tup (make-vector len)))
     331      (let loop ((i 0))
     332        (if (< i len)
     333            (begin
     334              (vector-set! tup i (PyTuple_GetItem value i))
     335              (loop (+ 1 i)))
     336            tup)))))
     337
     338
     339(define-pytype py-list
     340  (lambda (value)
     341    (let* ((len (length value))
     342           (lst (PyList_New len)))
     343       (if (not lst) (raise-python-exception))
     344       (let loop ((i 0))
     345         (if (< i len)
     346             (begin
     347               (if (not (zero? (PyList_SetItem lst i (list-ref value i))))
     348                   (raise-python-exception))
     349               (loop (+ i 1)))
     350             lst))))
     351  (lambda (value)
     352    (let ((len (PyList_Size value)))
     353      (let loop ((i 0) (lst (list)))
     354        (if (< i len)
     355            (let ((item (PyList_GetItem value i)))
     356              (loop (+ 1 i) (cons item lst)))
     357            (begin
     358              (reverse lst)))))))
     359
     360
     361(define-pytype py-bool
     362  (lambda (x) (PyBool_FromLong (if x 1 0)))
     363  PyBool-AsBool)
     364
     365(define-pytype py-float PyFloat_FromDouble PyFloat_AsDouble)
     366
     367(define (utf8-string->py-unicode value)
     368  ;; Given a Scheme UTF8 string, converts it into Python Unicode string
     369  (let ((str (list->s32vector (map char->integer (utf8-string->list value)))))
     370    (pyffi_PyUnicode_FromUnicode str (s32vector-length str))))
     371
     372(define (py-unicode->utf8-string value)
     373  ;; Given a Python Unicode string, converts it into Scheme UTF8 string
     374  (let ((buf (pyffi_PyUnicode_AsUnicode value))
     375        (len (pyffi_PyUnicode_GetSize value)))
     376    (let loop ((i 0) (lst (list)))
     377      (if (< i len)
     378          (loop (fx+ 1 i) (cons (pyffi_PyUnicode_ref buf i) lst))
     379          (list->string (map integer->char (reverse lst)))))))
     380
     381(define-pytype py-ascii PyString_FromString PyString_AsString)
     382(define-pytype py-unicode utf8-string->py-unicode py-unicode->utf8-string)
     383
     384(define-pytype py-dict
     385  ;; Given a Scheme alist, converts it into a Python dictionary
     386  (lambda (value)
     387    (let ((dct (PyDict_New)))
     388      (if (not dct) (raise-python-exception))
     389      (for-each (lambda (kv)
     390                  (match kv
     391                         (( k v ) (if (not (zero? (PyDict_SetItem dct k v)))
     392                                      (raise-python-exception)))
     393                         (else (pyffi:error 'py-dict "invalid alist pair " kv))))
     394                value)))
     395  ;; Given a Python dictionary, converts it into a Scheme alist
     396  (lambda (value)
     397    (let ((its (PyDict_Items value)))
     398      (let loop ((its its) (alst (list)))
     399          (if (null? its) alst
     400              (let ((item (car its)))
     401                (let ((k (vector-ref item 0))
     402                      (v (vector-ref item 1)))
     403                  (loop (cdr its) (cons (cons k v) alst)))))))))
     404
     405(define-pytype py-instance
     406  identity
     407  ;; Given a Python class instance, converts it into a Scheme alist
     408  (lambda (value) (PyObject_GetAttrString value "__dict__")))
     409
     410
     411(define  *python-types*
     412  `(("<type 'bool'>"      . ,py-bool)
     413    ("<type 'int'>"       . ,py-int)
     414    ("<type 'float'>"     . ,py-float)
     415    ("<type 'list'>"      . ,py-list)
     416    ("<type 'str'>"       . ,py-ascii)
     417    ("<type 'unicode'>"   . ,py-unicode)
     418    ("<type 'dict'>"      . ,py-dict)
     419    ("<type 'instance'>"  . ,py-instance)
     420    ("<type 'tuple'>"     . ,py-tuple)))
     421
     422
     423(define-constant +py-file-input+    257)
     424(define-constant +py-single-input+  256)
     425(define-constant +py-eval-input+    258)
     426
     427(define  *py-main-module* #f)
     428(define  *py-main-module-dict* #f)
     429(define  *py-functions* (list))
     430
     431(define (py-start)
     432  (Py_Initialize)
     433  (set! *py-main-module* (PyImport_AddModule "__main__"))
     434  (set! *py-main-module-dict* (PyModule_GetDict_asPtr *py-main-module*))
     435  (let ((tmp (pyffi_PyRun_String "from __builtin__ import *" +py-single-input+
     436                           *py-main-module-dict* (null-pointer))))
     437    (Py_DecRef tmp)))
     438
     439(define (py-stop)
     440  (set! *py-main-module* #f)
     441  (set! *py-main-module-dict* #f)
     442  (set! *py-functions* (list))
     443  (Py_Finalize))
     444
     445(define (py-import name)
     446  (let ((p (string-index name #\.)))
     447    (let ((m (pyffi_PyImport_ImportModuleEx
     448              name *py-main-module-dict* *py-main-module-dict* (null-pointer))))
     449      (if m
     450          (if (= -1 (PyObject_SetAttrString
     451                     *py-main-module* (if p (string-drop name p) name) m))
     452              (begin
     453                (Py_DecRef m)
     454                (raise-python-exception))
     455              (Py_DecRef m))
     456          (raise-python-exception)))))
     457
     458
     459(define (py-eval expr)
     460  (pyffi_PyRun_String expr +py-eval-input+ *py-main-module-dict* *py-main-module-dict*))
     461
     462(define (py-apply func . rest)
     463  (PyObject_CallObject func (list->vector rest)))
     464
     465
    20466;; TODO: add keyword arguments
    21 (define-macro (define-pyfun expr . args)
    22  (let ((func (gensym))
    23        (name (if (list? expr)
    24                  (second expr)
    25                  (string->symbol expr)))
    26        (form (if (list? expr) (first expr) expr)))
    27    `(define ,(cons name args)
    28       (let ((,func (alist-ref ',name *py-functions*)))
    29         (if (not ,func)
    30             (begin
    31               (set! ,func (py-eval ,form))
    32               (if (not ,func)
    33                   (raise-python-exception))
    34               (if (not (PyCallable_Check ,func))
    35                   (begin
    36                     (Py_DecRef ,func)
    37                     (raise-python-exception)))
    38               (alist-update! ',name ,func *py-functions*)))
    39         (py-apply ,func ,@args)))))
    40 
    41 
    42 (define-macro (define-pyslot name . rest)
    43   (let-optionals rest ((scheme-name #f))
    44    `(define (,(string->symbol (or scheme-name name)) obj . rest)
    45       (if (null? rest)
    46           (PyObject_GetAttrString obj ,name)
    47           (PyObject_SetAttrString obj ,name (car rest))))))
     467(define-syntax define-pyfun
     468  (lambda (x r c)
     469    (let* ((%define (r 'define))
     470           (%let    (r 'let))
     471           (%if     (r 'if))
     472           (%begin  (r 'begin))
     473           (%set!   (r 'set!))
     474           (not     (r 'not))
     475           (alist-ref       (r 'alist-ref))
     476           (alist-update!   (r 'alist-update!))
     477           (py-eval   (r 'py-eval))
     478           (py-apply  (r 'py-apply))
     479           (raise-python-exception  (r 'raise-python-exception))
     480           (PyCallable_Check  (r 'PyCallable_Check))
     481           (Py_DecRef         (r 'Py_DecRef))
     482           (expr (cadr x))
     483           (args (cddr x))
     484           (func (r 'func))
     485           (name (if (list? expr)
     486                     (second expr)
     487                     (string->symbol expr)))
     488           (form          (if (list? expr) (first expr) expr)))
     489      `(,%define ,(cons name args)
     490         (,%let ((,func (,alist-ref ',name *py-functions*)))
     491                (,%if (,not ,func)
     492                      (,%begin
     493                       (,%set! ,func (,py-eval ,form))
     494                       (,%if (,not ,func)
     495                             (,raise-python-exception))
     496                       (,%if (,not (,PyCallable_Check ,func))
     497                             (,%begin
     498                              (,Py_DecRef ,func)
     499                              (,raise-python-exception)))
     500                       (,alist-update! ',name ,func *py-functions*)))
     501                (,py-apply ,func ,@args))))))
     502
     503
     504(define-syntax define-pyslot
     505  (lambda (x r c)
     506    (let ((name (cadr x))
     507          (rest (cddr x)))
     508     (let-optionals rest ((scheme-name #f))
     509       (let ((%define (r 'define))
     510             (%if     (r 'if))
     511             (null?   (r 'null?))
     512             (car     (r 'car))
     513             (PyObject_GetAttrString     (r 'PyObject_GetAttrString))
     514             (PyObject_SetAttrString     (r 'PyObject_SetAttrString))
     515             (name   (string->symbol (or scheme-name name)))
     516             (obj    (r 'obj))
     517             (rest   (r 'rest)))
     518      `(,%define (,name ,obj . ,rest)
     519         (,%if (,null? ,rest)
     520             (,PyObject_GetAttrString ,obj ,(->string name))
     521             (,PyObject_SetAttrString ,obj ,(->string name) (,car ,rest)))))))))
    48522         
    49523
    50 (define-macro (define-pymethod name . rest)
    51   (let-optionals rest ((scheme-name #f))
    52   `(define (,(string->symbol (or scheme-name name)) obj . rest)
    53      (PyObject_CallObject
    54       (PyObject_GetAttrString obj ,name)
    55       (list->vector rest)))))
    56 
    57 
     524(define-syntax define-pymethod
     525  (lambda (x r c)
     526    (let ((name (cadr x))
     527          (rest (cddr x)))
     528     (let-optionals rest ((scheme-name #f))
     529       (let ((%define          (r 'define))
     530             (or               (r 'or))
     531             (list->vector     (r 'list->vector))
     532             (PyObject_GetAttrString     (r 'PyObject_GetAttrString))
     533             (PyObject_CallObject        (r 'PyObject_CallObject))
     534             (name   (string->symbol (or scheme-name name)))
     535             (obj    (r 'obj))
     536             (rest   (r 'rest)))
     537         `(,%define (,name ,obj . ,rest)
     538            (,PyObject_CallObject
     539             (,PyObject_GetAttrString ,obj ,(->string name) )
     540             (,list->vector ,rest))))))))
     541
     542
     543)
  • release/4/pyffi/trunk/pyffi.setup

    r11623 r14475  
    11;; -*- Hen -*-
    2 
    3 (define pyflags
    4   (case (software-version)
    5     ((macosx)   (map cons (list "-I/System/Library/Frameworks/Python.framework/Headers") (list "-framework Python")))
    6     ((linux)    (map cons
    7                      (list "-I/usr/include/python2.5" "-I/usr/include/python2.4" "-I/usr/include/python2.3")
    8                      (list "-lpython2.5" "-lpython2.4" "-lpython2.3")))
    9     ((windows)  (map cons
    10                      (list "" "" "")
    11                      (list "-lpython25" "-lpython24" "-lpython23")))
    12     (else       (list (cons "-I/usr/include/python" "-lpython")))))
    132
    143(define (python-try-compile header cppflags ldflags)
    154  (and (try-compile
    16         (string-append "#include " header "\n"
     5        (string-append header "\n"
    176                       "int main() { Py_Initialize(); return 0; }\n")
    187        ldflags: ldflags
     
    209       (cons cppflags ldflags) ))
    2110
    22 (define-macro (python-test rest)
    23   `(define cpp+ld-options
    24      (or (any identity (map (lambda (p) (python-try-compile "<Python.h>" (car p) (cdr p))) ,rest))
    25          (error "unable to find Python library"))))
     11(define-syntax python-test
     12  (syntax-rules ()
     13    ((_ (flags ...))
     14     (condition-case (python-try-compile flags ...)
     15                     (t ()    #f)))))
    2616
    27 (python-test pyflags)
     17(define cpp+ld-options
     18  (or (python-test ("#include <Python.h>" "-I/System/Library/Frameworks/Python.framework/Headers" "-framework Python"))
     19      (python-test ("#include <Python.h>" "-I/usr/include/python2.5" "-lpython2.5"))
     20      (python-test ("#include <Python.h>" "-I/usr/include/python2.4" "-lpython2.4"))
     21      (python-test ("#include <Python.h>" "-I/usr/include/python2.3" "-lpython2.3"))
     22      (python-test ("#include <Python.h>" "" "-lpython25"))
     23      (python-test ("#include <Python.h>" "" "-lpython24"))
     24      (python-test ("#include <Python.h>" "" "-lpython23"))
     25      (python-test ("#include <Python.h>" "-I/usr/include/python" "-lpython"))
     26      (error "unable to figure out location of Python")))
    2827
    2928(define c-options  (car cpp+ld-options))
    3029(define ld-options (cdr cpp+ld-options))
    3130
    32 (define has-exports? (string>=? (chicken-version) "2.310"))
    33 
    3431(define (dynld-name fn)         
    3532  (make-pathname #f fn ##sys#load-dynamic-extension))   
    3633
    37 (compile -d2 -s -o ,(dynld-name "pyffi-support")
    38          ,@(if has-exports? '(-check-imports -emit-exports pyffi-support.exports) '())
    39          pyffi-support.scm -L "\"" ,ld-options "\"" -C "\"" ,c-options "\"" -X easyffi)
     34(compile -O2 -d0 -I. -s pyffi.scm  -j pyffi -X easyffi
     35         -L "\"" ,ld-options "\"" -C "\"" ,c-options "\"" )
     36(compile -O2 -d0 -s pyffi.import.scm)
    4037
    4138(run (csi -qbs pyffi-eggdoc.scm > pyffi.html))
     
    4340(install-extension
    4441 'pyffi
    45  `(,(dynld-name "pyffi-support") "pyffi.scm" 
    46    ,@(if has-exports? '("pyffi-support.exports") (list)) )
    47  `((version 2.10)
    48    (syntax)
    49    (require-at-runtime pyffi-support)
     42 `(,(dynld-name "pyffi") ,(dynld-name "pyffi.import")  )
     43 `((version 2.11)
    5044   (documentation "pyffi.html")))
Note: See TracChangeset for help on using the changeset viewer.