mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-05-19 05:39:18 +02:00
Adding a --features command-line option to chibi-ffi and chibi-genstatic.
Needed for cross-compiling.
This commit is contained in:
parent
8dedc36609
commit
94002d2134
2 changed files with 98 additions and 59 deletions
102
tools/chibi-ffi
102
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] <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))))))))))
|
||||
|
|
|
@ -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"))))))
|
||||
|
|
Loading…
Add table
Reference in a new issue