Adding a --features command-line option to chibi-ffi and chibi-genstatic.

Needed for cross-compiling.
This commit is contained in:
Alex Shinn 2015-01-04 23:31:41 -05:00
parent 8dedc36609
commit 94002d2134
2 changed files with 98 additions and 59 deletions

View file

@ -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] <file.stub> [<output.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] <file.stub> [<output.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))))))))))

View file

@ -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"))))))