diff --git a/.gitignore b/.gitignore index a800178..5c65cab 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,9 @@ test *.c *.o *.o* +*.a *.so !src *.rkt README.txt +*.import.* diff --git a/Makefile b/Makefile index 2d10596..e7b128b 100644 --- a/Makefile +++ b/Makefile @@ -1,28 +1,24 @@ PREFIX=/usr/local build: - printf "#!/bin/sh\nsash --disable-cache -r7 -L ${PREFIX}/lib/compile-r7rs/snow ${PREFIX}/lib/compile-r7rs/main.scm \"\$$@\"\n" > compile-r7rs - -build-docker-images: - for implementation in $(shell sash -L ./snow -L . compile-r7rs.scm --list-schemes); \ - do \ - echo "Building $${implementation}"; \ - docker build . --build-arg COMPILE_R7RS=$${implementation} --tag=retropikzel1/compile-r7rs:$${implementation}; \ - done - -#for implementation in $(shell sash -L ./snow -L . compile-r7rs.scm --list-schemes); - -push-docker-images: - for implementation in $(shell sash -L ./snow -L . compile-r7rs.scm --list-schemes); \ - do \ - echo "Pushing $${implementation}"; \ - docker push retropikzel1/compile-r7rs:$${implementation}; \ - done - -snow: - mkdir -p snow - cp -r ../foreign-c/foreign snow/ - cp -r ../foreign-c-srfi-170/srfi snow/ + csc -R r7rs -X r7rs -static -c -J -unit foreign.c -o foreign.c.o snow/foreign/c.sld + ar rcs foreign.c.a foreign.c.o + csc -R r7rs -X r7rs -static -c -J -unit srfi-170 -o srfi-170.o snow/srfi/170.sld + ar rcs srfi-170.a srfi-170.o + csc -R r7rs -X r7rs -static -c -J -unit libs.util -o libs.util.o libs/util.sld + ar rcs libs.util.a libs.util.o + csc -R r7rs -X r7rs -static -c -J -unit libs.library-util -o libs.library-util.o libs/library-util.sld + ar rcs libs.library-util.a libs.library-util.o + csc -R r7rs -X r7rs -static -c -J -unit libs.data -o libs.data.o libs/data.sld + ar rcs libs.data.a libs.data.o + csc -R r7rs -X r7rs -static \ + -o compile-r7rs \ + -uses libs.util \ + -uses libs.library-util \ + -uses libs.data \ + -uses foreign.c \ + -uses srfi-170 \ + compile-r7rs.scm # Does uninstall because without that the changes do not seem to update install: uninstall @@ -32,6 +28,14 @@ install: uninstall cp compile-r7rs.scm ${PREFIX}/lib/compile-r7rs/main.scm install compile-r7rs ${PREFIX}/bin/compile-r7rs +snow: + mkdir -p snow + cp -r ../foreign-c/foreign snow/ + cp -r ../foreign-c-srfi-170/srfi snow/ + +clean-snow: + rm -rf snow + install-compile-r7rs-docker: install compile-r7rs-docker.sh ${PREFIX}/bin/compile-r7rs-docker @@ -87,6 +91,7 @@ clean-test: clean: find . -name "*.so" -delete find . -name "*.o*" -delete + find . -name "*.a*" -delete find . -name "*.rkt" -delete find . -name "*.link" -delete find . -name "*.meta" -delete diff --git a/snow/foreign/c.sld b/snow/foreign/c.sld index 7fba2be..f70fa19 100644 --- a/snow/foreign/c.sld +++ b/snow/foreign/c.sld @@ -10,7 +10,7 @@ (chibi ast) (scheme inexact) (chibi)) - (include-shared "c/lib/chibi")) + (include-shared "c/primitives/chibi/foreign-c")) (chicken (import (scheme base) (scheme write) @@ -193,6 +193,9 @@ bytevector->c-bytevector c-bytevector->bytevector + ;;;; Utilities + libc + ;; TODO endianness native-endianness make-c-bytevector @@ -317,12 +320,14 @@ (include "c/primitives/ypsilon.scm"))) (cond-expand (chicken-6 (include-relative "c/main.scm") + (include-relative "c/libc.scm") (include-relative "c/c-bytevectors.scm") (include-relative "c/pointer.scm") ;(include-relative "c/array.scm") ;(include-relative "c/struct.scm") ) (else (include "c/main.scm") + (include "c/libc.scm") ;(include "c/struct.scm") (include "c/c-bytevectors.scm") (include "c/pointer.scm") diff --git a/snow/foreign/c/Makefile b/snow/foreign/c/Makefile index 3837c23..3d4d0e2 100644 --- a/snow/foreign/c/Makefile +++ b/snow/foreign/c/Makefile @@ -1,9 +1,14 @@ CC=gcc -chibi: primitives/chibi/foreign-c.stub - chibi-ffi primitives/chibi/foreign-c.stub - mkdir -p lib - ${CC} -g3 -o lib/chibi.so primitives/chibi/foreign-c.c -fPIC -lffi -shared +chibi: foreign/c/primitives/chibi/foreign-c.stub + chibi-ffi foreign/c/primitives/chibi/foreign-c.stub + ${CC} \ + -g3 \ + -o foreign/c/primitives/chibi/foreign-c.so \ + foreign/c/primitives/chibi/foreign-c.c \ + -fPIC \ + -lffi \ + -shared chicken: @echo "Nothing to build for Chicken" diff --git a/snow/foreign/c/libc.scm b/snow/foreign/c/libc.scm new file mode 100644 index 0000000..661a5bf --- /dev/null +++ b/snow/foreign/c/libc.scm @@ -0,0 +1,13 @@ +(cond-expand + (windows (define-c-library libc + '("stdlib.h" "stdio.h" "string.h") + "ucrtbase" + '())) + (else + (define c-library "c") + (when (get-environment-variable "BE_HOST_CPU") + (set! c-library "root")) + (define-c-library libc + '("stdlib.h" "stdio.h" "string.h") + "c" + '((additional-versions ("0" "6")))))) diff --git a/snow/foreign/c/main.scm b/snow/foreign/c/main.scm index 30d0905..af2782c 100644 --- a/snow/foreign/c/main.scm +++ b/snow/foreign/c/main.scm @@ -103,7 +103,9 @@ "/usr/lib" "/usr/lib64" ; NetBSD - "/usr/pkg/lib"))))) + "/usr/pkg/lib" + ; Haiku + "/boot/system/lib"))))) (auto-load-versions (list "")) (paths (append auto-load-paths additional-paths)) (versions (append additional-versions auto-load-versions)) diff --git a/snow/foreign/c/pointer.scm b/snow/foreign/c/pointer.scm index 375a692..774860f 100644 --- a/snow/foreign/c/pointer.scm +++ b/snow/foreign/c/pointer.scm @@ -1,16 +1,15 @@ -(cond-expand - (windows (define-c-library libc - '("stdlib.h" "string.h") - "ucrtbase" - '((additional-versions ("0" "6"))))) - (else (define-c-library libc - '("stdlib.h" "string.h") - "c" - '((additional-versions ("0" "6")))))) - (define-c-procedure c-calloc libc 'calloc 'pointer '(int int)) -(define-c-procedure c-memset-address->pointer libc 'memset 'pointer '(uint64 uint8 int)) -(define-c-procedure c-memset-pointer->address libc 'memset 'uint64 '(pointer uint8 int)) +(cond-expand + (chicken (define c-memset-address->pointer + (lambda (address value offset) + (address->pointer address)))) + (else (define-c-procedure c-memset-address->pointer libc 'memset 'pointer '(uint64 uint8 int)))) + +(cond-expand + (chicken (define c-memset-pointer->address + (lambda (pointer value offset) + (pointer->address pointer)))) + (else (define-c-procedure c-memset-pointer->address libc 'memset 'uint64 '(pointer uint8 int)))) ;(define-c-procedure c-memset-address libc 'memset 'pointer '(uint64 uint8 int)) ;(define-c-procedure c-printf libc 'printf 'int '(pointer pointer)) (define-c-procedure c-malloc libc 'malloc 'pointer '(int)) diff --git a/snow/foreign/c/primitives/include/foreign-c-primitives-gauche.h b/snow/foreign/c/primitives/gauche/foreign-c-primitives-gauche.h similarity index 100% rename from snow/foreign/c/primitives/include/foreign-c-primitives-gauche.h rename to snow/foreign/c/primitives/gauche/foreign-c-primitives-gauche.h diff --git a/snow/srfi/170.scm b/snow/srfi/170.scm index 8ee3de2..ef10d96 100644 --- a/snow/srfi/170.scm +++ b/snow/srfi/170.scm @@ -1,16 +1,18 @@ (define slash (cond-expand (windows "\\") (else "/"))) (cond-expand - (windows - (define-c-library libc - '("stdlib.h" "stdio.h" "error.h") - "ucrtbase" - '())) + (windows (define-c-library srfi-170-libc + '("dirent.h" "stdlib.h" "stdio.h" "string.h") + "ucrtbase" + '())) (else - (define-c-library libc - '("stdlib.h" "stdio.h" "dirent.h" "error.h") - "c" - '((additional-versions ("6")))))) + (define c-library "c") + (when (get-environment-variable "BE_HOST_CPU") + (set! c-library "root")) + (define-c-library srfi-170-libc + '("dirent.h" "stdlib.h" "stdio.h" "string.h") + "c" + '((additional-versions ("0" "6")))))) (define-c-procedure c-perror libc 'perror 'void '(pointer)) (define-c-procedure c-mkdir libc 'mkdir 'int '(pointer int))