Various updates.

This commit is contained in:
Alex Shinn 2015-01-24 11:53:59 +09:00
parent cf1864d8d0
commit fd2f3c3534

View file

@ -159,6 +159,15 @@
file) file)
#\/))) #\/)))
;; remove import qualifiers
(define (import-name import)
(cond
((and (pair? import)
(memq (car import) '(only except prefix drop-prefix rename))
(pair? (cadr import)))
(import-name (cadr import)))
(else import)))
(define (extract-library cfg file) (define (extract-library cfg file)
(let ((lib (read-from-file file))) (let ((lib (read-from-file file)))
(match lib (match lib
@ -170,13 +179,6 @@
(define (resolve file) (define (resolve file)
(let ((dest-path (make-path lib-dir file))) (let ((dest-path (make-path lib-dir file)))
(list 'rename (make-path dir dest-path) dest-path))) (list 'rename (make-path dir dest-path) dest-path)))
(define (import-name import)
(cond
((and (pair? import)
(memq (car import) '(only except prefix drop-prefix rename))
(pair? (cadr import)))
(import-name (cadr import)))
(else import)))
(let lp ((ls declarations) (let lp ((ls declarations)
(info `(,@(cond (info `(,@(cond
((conf-get cfg '(command package author)) ((conf-get cfg '(command package author))
@ -184,49 +186,53 @@
(else '())) (else '()))
(path ,lib-file) (path ,lib-file)
(name ,name))) (name ,name)))
(files `((rename ,file ,lib-file))) (files `((rename ,file ,lib-file))))
(dirs '("")))
(cond (cond
((null? ls) ((null? ls)
(cons `(library ,@(reverse info)) (cons `(library ,@(reverse info))
(cons `(rename ,dir "") files))
(append (map resolve
(sort (delete-duplicates dirs equal?)))
files))))
(else (else
(match (car ls) (match (car ls)
(((or 'include 'include-ci) includes ...) (((or 'include 'include-ci) includes ...)
(lp (cdr ls) (lp (cdr ls)
info info
(append (map resolve includes) files) (append (map resolve includes) files)))
(append (map path-directory includes) dirs)))
(('include-library-declarations includes ...) (('include-library-declarations includes ...)
(lp (append (append-map file->sexp-list includes) (cdr ls)) (lp (append (append-map file->sexp-list includes) (cdr ls))
info info
(append (map resolve includes) files) (append (map resolve includes) files)))
dirs))
(('import libs ...) (('import libs ...)
(lp (cdr ls) (lp (cdr ls)
(cons (cons 'depends (map import-name libs)) info) (cons (cons 'depends (map import-name libs)) info)
files files))
dirs))
(('cond-expand clauses ...) (('cond-expand clauses ...)
(lp (append (append-map cdr clauses) (cdr ls)) info files dirs)) (lp (append (append-map cdr clauses) (cdr ls)) info files))
(else (else
(lp (cdr ls) info files dirs)))))))) (lp (cdr ls) info files))))))))
(else (else
(die 2 "not a valid library declaration " lib " in file " file))))) (die 2 "not a valid library declaration " lib " in file " file)))))
(define (extract-program-imports file)
(let lp ((ls (guard (exn (else '())) (file->sexp-list file)))
(deps '()))
(cond
((and (pair? ls) (pair? (car ls)) (eq? 'import (caar ls)))
(lp (cdr ls) (append (reverse (map import-name (cdar ls))) deps)))
(else
(reverse deps)))))
(define (make-package-name cfg libs . o) (define (make-package-name cfg libs . o)
(let ((name (assq 'name (car libs))) (let ((name (any (lambda (x) (or (library-name x) (program-name x))) libs))
(version (and (pair? o) (car o)))) (version (and (pair? o) (car o))))
(cond (cond
((not (and (pair? name) (pair? (cdr name)))) ((not (and (pair? name) (list? name)))
(die 2 "Unnamed library")) (die 2 "Invalid library name: " name))
((not (and (pair? (cadr name)) (list? (cadr name)))) ((not name)
(die 2 "Invalid library name" (cadr name))) (die 2 "Couldn't determine package name from libs: " libs))
(else (else
(let lp ((ls (if version (append (cadr name) (list version)) (cadr name))) (let lp ((ls (if version
(append name (list version))
name))
(res '())) (res '()))
(if (null? ls) (if (null? ls)
(string-join (reverse (cons ".tgz" res))) (string-join (reverse (cons ".tgz" res)))
@ -339,11 +345,13 @@
(or (conf-get cfg 'output) (or (conf-get cfg 'output)
(make-package-name (make-package-name
cfg cfg
(filter (lambda (x) (and (pair? x) (eq? 'library (car x)))) package-spec) (filter (lambda (x) (and (pair? x) (memq (car x) '(library program))))
package-spec)
(package-output-version cfg)))) (package-output-version cfg))))
(define (package-spec+files cfg spec libs) (define (package-spec+files cfg spec libs)
(let* ((recursive? (conf-get cfg '(command package recursive?))) (let* ((recursive? (conf-get cfg '(command package recursive?)))
(programs (conf-get-list cfg '(command package programs)))
(docs (package-docs cfg spec libs)) (docs (package-docs cfg spec libs))
(desc (package-description cfg spec libs docs)) (desc (package-description cfg spec libs docs))
(test (package-test cfg)) (test (package-test cfg))
@ -352,6 +360,7 @@
(version (package-output-version cfg)) (version (package-output-version cfg))
(license (package-license cfg))) (license (package-license cfg)))
(let lp ((ls (map (lambda (x) (cons x #f)) libs)) (let lp ((ls (map (lambda (x) (cons x #f)) libs))
(progs programs)
(res (res
`(,@(if license `((license ,license)) '()) `(,@(if license `((license ,license)) '())
,@(if (pair? docs) ,@(if (pair? docs)
@ -367,14 +376,10 @@
,@(if (pair? authors) `((authors ,@authors)) '()) ,@(if (pair? authors) `((authors ,@authors)) '())
,@(if (pair? maintainers) `((maintainers ,@maintainers)) '()))) ,@(if (pair? maintainers) `((maintainers ,@maintainers)) '())))
(files (files
`(,@docs `(,@(if test (list test) '())
,@(if test (list test) '())))) ,@docs)))
(cond (cond
((and (null? ls) (null? res)) ((pair? ls)
(die 2 "No packages generated"))
((null? ls)
(cons (cons 'package (reverse res)) files))
(else
(let* ((lib+files (extract-library cfg (caar ls))) (let* ((lib+files (extract-library cfg (caar ls)))
(lib (car lib+files)) (lib (car lib+files))
(name (library-name lib)) (name (library-name lib))
@ -387,8 +392,21 @@
(else '()))) (else '())))
'()))) '())))
(lp (append (map (lambda (x) (cons x base)) subdeps) (cdr ls)) (lp (append (map (lambda (x) (cons x base)) subdeps) (cdr ls))
progs
(cons lib res) (cons lib res)
(append (cdr lib+files) files)))))))) (append (reverse (cdr lib+files)) files))))
((pair? progs)
(lp ls
(cdr progs)
(cons `(program
(path ,(path-strip-leading-parents (car progs)))
(depends ,@(extract-program-imports (car progs))))
res)
(cons (car progs) files)))
((null? res)
(die 2 "No packages generated"))
(else
(cons (cons 'package (reverse res)) (reverse files)))))))
(define (create-package spec files path) (define (create-package spec files path)
(gzip (gzip
@ -670,12 +688,18 @@
(regexp-fold re (lambda (from md str acc) (+ acc 1)) 0 str)) (regexp-fold re (lambda (from md str acc) (+ acc 1)) 0 str))
(define (count-in-sexp x keywords) (define (count-in-sexp x keywords)
(regexp-count `(word (or ,@keywords)) (write-to-string x))) (regexp-count `(word (w/nocase (or ,@keywords)))
(write-to-string x)))
(define (extract-matching-libraries cfg repo keywords) (define (extract-matching-libraries cfg repo keywords)
(define (library-score lib) (define (library-score lib)
(+ (* 10 (count-in-sexp (library-name lib) keywords)) (+ (* 10 (count-in-sexp (library-name lib) keywords))
(count-in-sexp lib keywords))) (count-in-sexp lib keywords)
(let ((use-for (assoc-get lib 'use-for)))
(case (if (pair? use-for) (car use-for) use-for)
((test) 0)
((build) 10)
(else 100)))))
(append-map (append-map
(lambda (x) (lambda (x)
(cond (cond
@ -902,6 +926,13 @@
=> (lambda (prefix) (make-path prefix "share/snow" impl))) => (lambda (prefix) (make-path prefix "share/snow" impl)))
(else (car (get-install-dirs impl cfg))))) (else (car (get-install-dirs impl cfg)))))
(define (get-install-binary-dir impl cfg)
(cond
((conf-get cfg 'install-binary-dir))
((conf-get cfg 'install-prefix)
=> (lambda (prefix) (make-path prefix "bin")))
(else "/usr/local/bin")))
(define (install-with-sudo? cfg path) (define (install-with-sudo? cfg path)
(case (conf-get cfg '(command install use-sudo?)) (case (conf-get cfg '(command install use-sudo?))
((always) #t) ((always) #t)
@ -1000,6 +1031,14 @@
dest-file)) dest-file))
rewrite-include-files))))) rewrite-include-files)))))
(define (default-program-installer impl cfg prog dir)
(let* ((program-file (get-program-file cfg prog))
(dest-program-file (program-install-name prog))
(install-dir (get-install-binary-dir impl cfg)))
(let ((path (make-path install-dir dest-program-file)))
(install-directory cfg (path-directory path))
(install-file cfg (make-path dir program-file) path))))
;; installers should return the list of installed files ;; installers should return the list of installed files
(define (lookup-installer installer) (define (lookup-installer installer)
(case installer (case installer
@ -1013,6 +1052,18 @@
;; the currently supported implementations don't require building ;; the currently supported implementations don't require building
#t) #t)
(define (build-program impl cfg prog dir)
#t)
(define (lookup-program-installer installer)
(case installer
(else default-program-installer)))
(define (install-program impl cfg prog dir)
(let ((installer (lookup-program-installer
(conf-get cfg 'program-installer))))
(installer impl cfg prog dir)))
(define (fetch-package cfg url) (define (fetch-package cfg url)
(call-with-input-url url port->bytevector)) (call-with-input-url url port->bytevector))
@ -1072,12 +1123,18 @@
(lambda (dir) (lambda (dir)
(tar-extract snowball (lambda (f) (make-path dir (path-strip-top f)))) (tar-extract snowball (lambda (f) (make-path dir (path-strip-top f))))
(let ((installed-files (let ((installed-files
(append
(append-map (append-map
(lambda (lib) (lambda (lib)
(build-library impl cfg lib dir) (build-library impl cfg lib dir)
(test-library impl cfg lib dir) (test-library impl cfg lib dir)
(install-library impl cfg lib dir)) (install-library impl cfg lib dir))
(package-libraries pkg)))) (package-libraries pkg))
(append-map
(lambda (prog)
(build-program impl cfg prog dir)
(install-program impl cfg prog dir))
(package-programs pkg)))))
(install-package-meta-info (install-package-meta-info
impl cfg impl cfg
`(,@(remove (lambda (x) `(,@(remove (lambda (x)