diff --git a/tools/chibi-ffi b/tools/chibi-ffi index bb146df1..1733c3dd 100755 --- a/tools/chibi-ffi +++ b/tools/chibi-ffi @@ -1955,42 +1955,66 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; main -(let* ((args (command-line)) - (args (if (pair? args) (cdr args) args)) - (compile? (and (pair? args) (member (car args) '("-c" "--compile")))) - (args (if compile? (cdr args) args)) - (cflags (if (and (pair? args) (member (car args) '("-f" "--flags"))) - (string-split (cadr args) #\space) - #f)) - (args (if cflags (cddr args) args)) - (src (if (or (not (pair? args)) (equal? "-" (car args))) - "/dev/stdin" - (car args))) - (dest - (case (length args) - ((0) "-") - ((1) (string-append (strip-extension src) ".c")) - ((2) (cadr args)) - (else (error "usage: chibi-ffi [-c] []"))))) - (if (not (equal? "/dev/stdin" src)) - (let ((slash (string-scan-right src #\/))) - (if (> slash 0) - (set! wdir (substring-cursor src 0 slash))))) - (if (equal? "-" dest) - (generate src) - (with-output-to-file dest (lambda () (generate src)))) - (cond - ((and compile? (not (equal? "-" dest))) - ;; This has to use `eval' for bootstrapping, since we need - ;; chibi-ffi to compile to (chibi process) module. - (let* ((so (string-append (strip-extension src) - *shared-object-extension*)) - (execute (begin (eval '(import (chibi process))) - (eval 'execute))) - (base-args (append (or cflags '()) - `("-o" ,so ,dest "-lchibi-scheme"))) - (args (cond-expand - (macosx (append '("-dynamiclib" "-Oz") base-args)) - (else (append '("-fPIC" "-shared" "-Os") base-args)))) - (cc (if *c++?* "c++" "cc"))) - (execute cc (cons cc args)))))) +(let ((args (command-line))) + (let lp ((args (if (pair? args) (cdr args) args)) + (compile? #f) + (cflags '()) + (features '())) + (cond + ((and (pair? args) (not (equal? "" (car args))) + (eqv? #\- (string-ref (car args) 0))) + (case (string->symbol (car args)) + ((-c --compile) + (lp (cdr args) #t cflags features)) + ((-f --flags) + (if (null? (cdr args)) + (error "--flags requires an argument")) + (lp (cddr args) + compile? + (append cflag (string-split (cadr args) #\space)) + features)) + ((--features) + (if (null? (cdr args)) + (error "--features requires an argument")) + (lp (cddr args) + compile? + cflags + (append features (string-split (cadr args) #\,)))) + (else + (error "unknown option" (car args))))) + (else + (if (pair? features) + (set! *features* features)) + (let* ((src (if (or (not (pair? args)) (equal? "-" (car args))) + "/dev/stdin" + (car args))) + (dest + (case (length args) + ((0) "-") + ((1) (string-append (strip-extension src) ".c")) + ((2) (cadr args)) + (else + (error "usage: chibi-ffi [-c] []"))))) + (if (not (equal? "/dev/stdin" src)) + (let ((slash (string-scan-right src #\/))) + (if (> slash 0) + (set! wdir (substring-cursor src 0 slash))))) + (if (equal? "-" dest) + (generate src) + (with-output-to-file dest (lambda () (generate src)))) + (cond + ((and compile? (not (equal? "-" dest))) + ;; This has to use `eval' for bootstrapping, since we need + ;; chibi-ffi to compile to (chibi process) module. + (let* ((so (string-append (strip-extension src) + *shared-object-extension*)) + (execute (begin (eval '(import (chibi process))) + (eval 'execute))) + (base-args (append cflags `("-o" ,so ,dest "-lchibi-scheme"))) + (args + (eval + '(cond-expand + (macosx (append '("-dynamiclib" "-Oz") base-args)) + (else (append '("-fPIC" "-shared" "-Os") base-args))))) + (cc (if *c++?* "c++" "cc"))) + (execute cc (cons cc args)))))))))) diff --git a/tools/chibi-genstatic b/tools/chibi-genstatic index ae9a89ea..310e0444 100755 --- a/tools/chibi-genstatic +++ b/tools/chibi-genstatic @@ -358,23 +358,38 @@ (display (init-name (cdr lib))) (display " },\n")) -(let* ((args (command-line)) - (_ (if (pair? args) - (set! wdir (path-directory (path-directory (car args)))))) - (c-libs+c-files (find-c-libs (if (pair? args) (cdr args) args))) - (c-libs (car c-libs+c-files)) - (c-files (cdr c-libs+c-files)) - (inline? #t)) - (newline) - (for-each (lambda (x) (include-c-lib x c-files inline?)) c-libs) - (newline) - ;; (display "typedef struct {\n") - ;; (display " const char *name;\n") - ;; (display " sexp_init_proc init;\n") - ;; (display "} sexp_library_entry_t;\n") - ;; (newline) - (display "struct sexp_library_entry_t sexp_static_libraries_array[] = {\n") - (for-each init-c-lib c-libs) - (display " { NULL, NULL }\n") - (display "};\n\n") - (display "struct sexp_library_entry_t* sexp_static_libraries = sexp_static_libraries_array;\n")) +(let ((args (command-line))) + (if (pair? args) + (set! wdir (path-directory (path-directory (car args))))) + (let lp ((args (if (pair? args) (cdr args) args)) + (features '())) + (cond + ((and (pair? args) (not (equal? "" (car args))) + (eqv? #\- (string-ref (car args) 0))) + (case (string->symbol (car args)) + ((--features) + (if (null? (cdr args)) + (error "--features requires an argument")) + (lp (cddr args) (append features (string-split (cadr args) #\,)))) + (else + (error "unknown option" (car args))))) + (else + (if (pair? features) + (set! *features* features)) + (let* ((c-libs+c-files (find-c-libs (if (pair? args) (cdr args) args))) + (c-libs (car c-libs+c-files)) + (c-files (cdr c-libs+c-files)) + (inline? #t)) + (newline) + (for-each (lambda (x) (include-c-lib x c-files inline?)) c-libs) + (newline) + ;; (display "typedef struct {\n") + ;; (display " const char *name;\n") + ;; (display " sexp_init_proc init;\n") + ;; (display "} sexp_library_entry_t;\n") + ;; (newline) + (display "struct sexp_library_entry_t sexp_static_libraries_array[] = {\n") + (for-each init-c-lib c-libs) + (display " { NULL, NULL }\n") + (display "};\n\n") + (display "struct sexp_library_entry_t* sexp_static_libraries = sexp_static_libraries_array;\n"))))))