Add dependencies without cond-expand to list
This commit is contained in:
		
						commit
						3238d793fd
					
				|  | @ -0,0 +1,3 @@ | |||
| *.swp | ||||
| *.swo | ||||
| git-to-snow-repo | ||||
|  | @ -0,0 +1,36 @@ | |||
| FROM debian:trixie | ||||
| RUN apt-get update && apt-get install -y \ | ||||
|     build-essential \ | ||||
|     make \ | ||||
|     git \ | ||||
|     ca-certificates \ | ||||
|     chicken-bin \ | ||||
|     pandoc \ | ||||
|     libffi-dev \ | ||||
|     tree \ | ||||
|     file | ||||
| RUN chicken-install r7rs | ||||
| RUN git clone https://github.com/ashinn/chibi-scheme.git --depth=1 | ||||
| WORKDIR /chibi-scheme | ||||
| RUN make | ||||
| RUN make install | ||||
| WORKDIR /build | ||||
| RUN mkdir -p /usr/local/bin | ||||
| RUN ls | ||||
| COPY --from=retropikzel1/compile-r7rs /opt/compile-r7rs /opt/compile-r7rs | ||||
| ENV PATH=/opt/compile-r7rs/bin:${PATH} | ||||
| ARG SCHEME=chibi | ||||
| ENV COMPILE_R7RS=${SCHEME} | ||||
| RUN mkdir -p ${HOME}/.snow && echo "()" > ${HOME}/.snow/config.scm | ||||
| RUN snow-chibi --impls=${SCHEME} --always-yes install "(foreign c)" | ||||
| RUN git clone https://git.sr.ht/~retropikzel/foreign-c-system --depth=1 | ||||
| RUN cd foreign-c-system && make SCHEME=${SCHEME} && make SCHEME=${SCHEME} force-install | ||||
| #RUN snow-chibi --impls=${SCHEME} --always-yes install "(retropikzel system)" | ||||
| RUN snow-chibi --impls=${SCHEME} --always-yes install "(srfi 170)" | ||||
| RUN git clone https://git.sr.ht/~retropikzel/foreign-c-srfi-170 --depth=2 | ||||
| RUN cd foreign-c-srfi-170 && make SCHEME=${SCHEME} && make SCHEME=${SCHEME} force-install | ||||
| COPY Makefile . | ||||
| COPY git-to-snow-repo.scm . | ||||
| RUN make SCHEME=${SCHEME} | ||||
| RUN make PREFIX=/opt/git-to-snow-repo install | ||||
| ENV PATH=/opt/git-to-snow-repo/bin:${PATH} | ||||
|  | @ -0,0 +1,23 @@ | |||
| PREFIX=/usr/local | ||||
| SCHEME=chibi | ||||
| COMPILE_R7RS=${SCHEME} | ||||
| 
 | ||||
| all: build | ||||
| 
 | ||||
| build: | ||||
| 	compile-r7rs -o git-to-snow-repo git-to-snow-repo.scm | ||||
| 
 | ||||
| install: | ||||
| 	mkdir -p ${PREFIX}/bin | ||||
| 	install git-to-snow-repo ${PREFIX}/bin/git-to-snow-repo | ||||
| 
 | ||||
| test-docker: | ||||
| 	docker build -f Dockerfile --tag=git-to-snow-repo-test . | ||||
| 	docker run -v "${PWD}":/workdir -w /workdir -t git-to-snow-repo-test sh -c "git-to-snow-repo example-list.scm" | ||||
| 
 | ||||
| clean: | ||||
| 	rm -rf git-to-snow-repo | ||||
| 
 | ||||
| clean-all: clean | ||||
| 	rm -rf deps | ||||
| 
 | ||||
|  | @ -0,0 +1,10 @@ | |||
| (((description "Small \"Hello world\" library to be used with testing of snow-fort") | ||||
|   (url "https://git.sr.ht/~retropikzel/scheme-hello-world") | ||||
|   (library (path "retropikzel/hello.sld")) | ||||
|   (library (path "retropikzel/hello/util.sld"))) | ||||
|  ((description "C Foreign Function Interface (FFI) library for R7RS Schemes") | ||||
|   (maintainers "Retropikzel") ; Optional, if left out will be looked from git url | ||||
|   (url "https://git.sr.ht/~retropikzel/foreign-c") | ||||
|   (library (path "foreign/c.sld") | ||||
|            (foreign-depends "ffi") ; Not optional if there is a dependency | ||||
|            ))) | ||||
|  | @ -0,0 +1,170 @@ | |||
| (import (scheme base) | ||||
|         (scheme read) | ||||
|         (scheme write) | ||||
|         (scheme file) | ||||
|         (scheme process-context) | ||||
|         (retropikzel system) | ||||
|         (srfi 1) | ||||
|         (srfi 170)) | ||||
| 
 | ||||
| (when (< (length (command-line)) 2) | ||||
|   (error "Pass the git repository list as first argument" (command-line))) | ||||
| 
 | ||||
| (define data | ||||
|   (with-input-from-file (list-ref (command-line) 1) (lambda () (read)))) | ||||
| 
 | ||||
| (define (get ls check key) | ||||
|   (when (not (assq key ls)) | ||||
|     (error (string-append "Could not find key: " | ||||
|                           (symbol->string key) | ||||
|                           " from data.") | ||||
|            ls)) | ||||
|   (let ((value (car (cdr (assq key ls))))) | ||||
|     (when (not (apply check (list value))) | ||||
|       (error "Check failed on field value." | ||||
|              `((lib ,ls) | ||||
|                (check ,check) | ||||
|                (value ,value)))) | ||||
|     value)) | ||||
| 
 | ||||
| (define (rmdir-r path) | ||||
|   (if (not (file-info-directory? (file-info path #f))) | ||||
|     (delete-file path) | ||||
|     (let ((files (map (lambda (p) | ||||
|                         (string-append path "/" p)) | ||||
|                       (directory-files path #t)))) | ||||
|       (cond ((null? files) (delete-directory path)) | ||||
|             (else (for-each rmdir-r (map real-path files)) | ||||
|                   (delete-directory path)))))) | ||||
| 
 | ||||
| (define (shell->list command) | ||||
|   (call-with-temporary-filename | ||||
|     (lambda (file) | ||||
|       (system (string-append command " > " file)) | ||||
|       (letrec* ((looper (lambda (result line) | ||||
|                           (if (eof-object? line) | ||||
|                             result | ||||
|                             (looper (append result (list line)) (read-line)))))) | ||||
|         (with-input-from-file | ||||
|           file | ||||
|           (lambda () | ||||
|             (looper (list) (read-line)))))))) | ||||
| 
 | ||||
| (define (get-created dir tag) | ||||
|   (let ((time (shell->list | ||||
|                 (apply string-append | ||||
|                        `("git -C " | ||||
|                          ,dir | ||||
|                          " log -1 --format=%ai " | ||||
|                          ,tag | ||||
|                          " | tr ' ' '\n'"))))) | ||||
|     (string-append (list-ref time 0) "T" (list-ref time 1) (list-ref time 2)))) | ||||
| 
 | ||||
| (define (collect ls key) | ||||
|   (let ((result (list))) | ||||
|     (for-each | ||||
|       (lambda (item) | ||||
|         (when (eq? (car item) key) | ||||
|           (set! result (append result (list item))))) | ||||
|       ls) | ||||
|     result)) | ||||
| 
 | ||||
| (define (get-libraries dir lib) | ||||
|   (let ((result (list))) | ||||
|     (for-each | ||||
|       (lambda (item) | ||||
|         (when (equal? (car item) 'library) | ||||
| 
 | ||||
|           (when (not (assq 'path (cdr item))) | ||||
|             (error "Library with no path" lib)) | ||||
| 
 | ||||
|           (when (not (string? (car (cdr (assq 'path (cdr item)))))) | ||||
|             (error "Library with non string path" lib)) | ||||
| 
 | ||||
|           (let* ((file (car (cdr (assq 'path (cdr item))))) | ||||
|                  (path (string-append dir "/" file))) | ||||
|             (if (not (file-exists? path)) | ||||
|               (begin | ||||
|                 (display "WARNING: Library with non existing path ignored") | ||||
|                 (newline) | ||||
|                 (display "  ") | ||||
|                 (write item) | ||||
|                 (newline)) | ||||
|               (let* ((data (with-input-from-file path (lambda () (read)))) | ||||
|                      (foreign-depends (if (assq 'foreign-depends (cdr item)) | ||||
|                                         `((foreign-depends | ||||
|                                             ,(car (cdr (assq 'foreign-depends | ||||
|                                                              (cdr item)))))) | ||||
|                                         '())) | ||||
|                      (debug | ||||
|                        (begin | ||||
|                          ;(display "HERE: ") | ||||
|                          ;(write (collect (cdr data) 'cond-expand)) | ||||
|                          ;(newline) | ||||
|                          1 | ||||
| 
 | ||||
|                          )) | ||||
|                      (depends (map cdr (collect (cdr data) 'import)))) | ||||
|                 (set! result | ||||
|                   (append result | ||||
|                           (list (append `((name ,(list-ref data 1)) | ||||
|                                           (path ,file)) | ||||
|                                         foreign-depends | ||||
|                                         (if (null? depends) | ||||
|                                           '() | ||||
|                                           `((depends ,@(car depends)))) | ||||
|                                         ))))))))) | ||||
|       lib) | ||||
|     result)) | ||||
| 
 | ||||
| (display "(repository") | ||||
| (newline) | ||||
| (for-each | ||||
|   (lambda (lib) | ||||
|     (let ((description (get lib string? 'description)) | ||||
|           (url (get lib string? 'url))) | ||||
|       (call-with-temporary-filename | ||||
|         (lambda (dir) | ||||
|           (let* ((git-command (apply string-append | ||||
|                                      `("git clone " | ||||
|                                        ,url | ||||
|                                        " " | ||||
|                                        ,dir | ||||
|                                        " 2> /tmp/null"))) | ||||
|                  (git-output (system git-command)) | ||||
|                  (files (map (lambda (i) | ||||
|                                (real-path (string-append dir "/" i))) | ||||
|                              (directory-files dir))) | ||||
|                  (tags (shell->list (apply string-append | ||||
|                                            `("git -C " | ||||
|                                              ,dir | ||||
|                                              " tag 2>&1 > " | ||||
|                                              ,(string-append dir "/tags")))))) | ||||
|             (for-each | ||||
|               (lambda (tag) | ||||
|                 (let* ((hash (car (shell->list | ||||
|                                     (apply string-append | ||||
|                                            `("git -C " | ||||
|                                              ,dir | ||||
|                                              " rev-parse " | ||||
|                                              ,tag | ||||
|                                              " > " | ||||
|                                              ,(string-append dir "/hash")))))) | ||||
|                        (created (get-created dir tag)) | ||||
|                        (updated (get-created dir tag)) | ||||
|                        (libraries (get-libraries dir lib)) | ||||
|                        (data `(package (git (url ,url) | ||||
|                                             (tag ,tag) | ||||
|                                             (hash ,hash)) | ||||
|                                        (version ,tag) | ||||
|                                        (created ,created) | ||||
|                                        ,@libraries))) | ||||
|                   (display "  ") | ||||
|                   (write data) | ||||
|                   (newline))) | ||||
|               tags) | ||||
|           (rmdir-r dir)))))) | ||||
|   data) | ||||
| (display ")") | ||||
| (newline) | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue