build: compile crt1.c, libc-mesc.c and <input>.c separately.

* mlibc/crt1.c: New file.
* mlibc/libc-mes.c (_start): Remove.
* mlibc/libc-gcc.c (_start): Remove.
* make.scm (LINK.hex2, bin.mescc): Move from guile/guix/make.scm.
* guile/guix/make.scm (LINK.hex2, bin.mescc): Remove.
This commit is contained in:
Jan Nieuwenhuizen 2017-09-10 16:59:43 +02:00
parent 29acdfa2a7
commit 7619190d5c
8 changed files with 265 additions and 212 deletions

View file

@ -39,7 +39,8 @@
#:use-module (guix records)
#:use-module (guix shell-utils)
#:export (build
#:export (base-name
build
check
clean
group
@ -50,15 +51,18 @@
cpp.mescc
compile.mescc
compile.gcc
ld
bin.mescc
bin.gcc
snarf
m1.as
crt1.mlibc-o
libc-gcc.mlibc-o
libc-gcc+tcc.mlibc-o
libc-mes.E
libc-mes+tcc.E
mini-libc-mes.E
add-target
get-target
@ -66,7 +70,19 @@
system**
target-file-name
method
target
store
target-inputs
method-name
assert-gulp-pipe*
PATH-search-path
%MESCC
%HEX2
%M1
%targets
%status
@ -324,19 +340,19 @@
"-D"
"POSIX=1"
"-I" "src"
"-I" "mlibc"
"-I" "mlibc/include"
"--include=mlibc/libc-gcc.c"
))
"--include=mlibc/libc-gcc.c"))
(define %C32-FLAGS
'("--std=gnu99"
"-O0"
"-g"
"-I" "src"
"-I" "mlibc/include"
"--include=mlibc/libc-gcc.c"
))
"-I" "mlibc"
"-I" "mlibc/include"))
(define* (CC.gcc #:key (libc #t) (cc (if libc %CC %CC32)) (c-flags (if libc %C-FLAGS %C32-FLAGS)) (defines '()) (includes '()))
(define* (CC.gcc #:key (libc #t) (cc (if (eq? libc #t) %CC %CC32)) (c-flags (if (eq? libc #t) %C-FLAGS %C32-FLAGS)) (defines '()) (includes '()))
(method (name "CC.gcc")
(build (lambda (o t)
(let* ((input-files (map target-file-name (target-inputs t)))
@ -344,13 +360,12 @@
"-c"
,@(append-map (cut list "-D" <>) defines)
,@(append-map (cut list "-I" <>) includes)
,@(if libc '() '("-nostdinc" "-fno-builtin"))
,@(if (eq? libc #t) '() '("-nostdinc" "-fno-builtin"))
,@c-flags
"-o" ,(target-file-name t)
,@(filter (cut string-suffix? ".c" <>) input-files))))
(format (current-error-port) " ~a\t ~a -> ~a\n" (method-name o) (string-join input-files) (target-file-name t))
(apply system** command))))
(inputs (list (store #:add-file "mlibc/libc-gcc.c"))))) ;; FIXME: FLAGS
(apply system** command))))))
(define* (CPP.mescc #:key (cc %MESCC) (defines '()) (includes '()))
(method (name "CPP.mescc")
@ -375,12 +390,14 @@
`("guile/mescc.scm" "-c"
"-o" ,(target-file-name t)
,@input-files)))))
(inputs (list (store #:add-file "guile/language/c99/compiler.go")
(store #:add-file "guile/language/c99/info.go")
(store #:add-file "guile/mes/as.go")
(inputs (list (store #:add-file "guile/language/c99/info.go")
(store #:add-file "guile/language/c99/compiler.go")
(store #:add-file "guile/mes/as-i386.go")
(store #:add-file "guile/mes/as.go")
(store #:add-file "guile/mes/elf.go")
(store #:add-file "guile/mes/bytevectors.go")
(store #:add-file "guile/mes/M1.go")))))
(store #:add-file "guile/mes/M1.go")
(store #:add-file "guile/mes/guile.go")))))
(define %M1 (or (PATH-search-path "M1" #:default #f)
(PATH-search-path "M0" #:default #f) ; M1 is in unreleased mescc-tools 0.2
@ -394,7 +411,7 @@
(if (equal? (basename %M1) "M0")
(set! %M1-FLAGS %M0-FLAGS))
(define* (M1.asm #:key (m1 %M1) (m1-flags %M1-FLAGS))
(define* (M1.as #:key (m1 %M1) (m1-flags %M1-FLAGS))
(method (name "M1")
(build (lambda (o t)
(let* ((input-files (map target-file-name (target-inputs t)))
@ -413,48 +430,20 @@
(newline))))))
(inputs (list (store #:add-file "stage0/x86.M1")))))
(define %HEX2-FLAGS
'("--LittleEndian"
"--Architecture=1"
"--BaseAddress=0x1000000"))
(define %HEX2 (PATH-search-path "hex2"))
(define* (LINK.hex2 #:key (hex2 %HEX2) (hex2-flags %HEX2-FLAGS) debug?)
(method (name "LINK.hex2")
(build (lambda (o t)
(let* ((input-files (map target-file-name (target-inputs t)))
;; FIXME: snarf inputs
(input-files (filter (lambda (f) (string-suffix? "hex2" f))
input-files)))
(format #t " ~a\t ~a -> ~a\n" (method-name o) (string-join input-files) (target-file-name t))
(with-output-to-file (target-file-name t)
(lambda _
(set-port-encoding! (current-output-port) "ISO-8859-1")
(display
(apply assert-gulp-pipe*
`(,hex2
,@hex2-flags
"-f"
,(if (not debug?) "stage0/elf32-0header.hex2"
"stage0/elf32-header.hex2")
,@(append-map (cut list "-f" <>) input-files)
"-f"
,(if (not debug?) "stage0/elf-0footer.hex2"
"stage0/elf32-footer-single-main.hex2"))))))
(chmod (target-file-name t) #o755))))
(inputs (list (store #:add-file "stage0/elf32-0header.hex2")
(store #:add-file "stage0/elf-0footer.hex2")))))
(define* (LINK.gcc #:key (cc %CC) (c-flags %C-FLAGS) (libc #t))
(define* (LINK.gcc #:key (cc %CC) (c-flags %C-FLAGS) (libc #t) (crt1 #f))
(method (name "LINK.gcc")
(build (lambda (o t)
(let* ((input-files (map target-file-name (target-inputs t)))
(command `(,cc
,@c-flags
,@(if libc '() '("-nostdlib"))
,@(if (eq? libc #t) '() '("-nostdlib"))
"-o"
,(target-file-name t)
,@input-files)))
,@(if crt1 (list (target-file-name crt1))'())
,@input-files
,@(cond ((eq? libc #t) '())
(libc (list (target-file-name libc)))
(else '())))))
(format #t " ~a\t ~a -> ~a\n" (method-name o) (string-join input-files) (target-file-name t))
(apply system** command))))))
@ -478,13 +467,9 @@
(inputs (cons c-target dependencies))
(method (CPP.mescc #:cc cc #:defines defines #:includes includes)))))
(define mini-libc-mes.E (cpp.mescc "mlibc/mini-libc-mes.c"))
(define libc-mes.E (cpp.mescc "mlibc/libc-mes.c"))
(define libc-mes+tcc.E (cpp.mescc "mlibc/libc-mes+tcc.c"))
(define* (compile.gcc input-file-name #:key (libc #t) (cc (if libc %CC %CC32)) (defines '()) (includes '()) (dependencies '()))
(define* (compile.gcc input-file-name #:key (libc #t) (cc (if (eq? libc #t) %CC %CC32)) (defines '()) (includes '()) (dependencies '()))
(let* ((base-name (base-name input-file-name ".c"))
(cross (if libc "" "mlibc-"))
(cross (if (eq? libc #t) "" "mlibc-"))
(suffix (string-append "." cross "o"))
(target-file-name (string-append base-name suffix))
(c-target (target (file-name input-file-name))))
@ -492,62 +477,34 @@
(inputs (cons c-target dependencies))
(method (CC.gcc #:cc cc #:libc libc #:defines defines #:includes includes)))))
(define* (compile.mescc input-file-name #:key (cc %MESCC) (libc libc-mes.E) (defines '()) (includes '()) (dependencies '()))
(define* (compile.mescc input-file-name #:key (cc %MESCC) (defines '()) (includes '()) (dependencies '()))
(let* ((base-name (base-name input-file-name ".c"))
;;(foo (format (current-error-port) "COMPILE[~s .c] base=~s\n" input-file-name base-name))
(suffix (cond ((not libc) ".0-M1")
((eq? libc libc-mes.E) ".M1")
((eq? libc libc-mes+tcc.E) ".tcc-M1")
(else ".mini-M1")))
(suffix ".M1")
(target-file-name (string-append base-name suffix))
(E-target (cpp.mescc input-file-name #:cc cc #:defines defines #:includes includes #:dependencies dependencies)))
(target (file-name target-file-name)
(inputs `(,@(if libc (list libc) '()) ,E-target))
(inputs `(,E-target))
(method (CC.mescc #:cc cc)))))
(define* (m1-asm input-file-name #:key (cc %MESCC) (m1 %M1) (libc libc-mes.E) (defines '()) (includes '()) (dependencies '()))
(define* (m1.as input-file-name #:key (cc %MESCC) (m1 %M1) (defines '()) (includes '()) (dependencies '()))
(let* ((base-name (base-name input-file-name ".c"))
;;(foo (format (current-error-port) "m1-asm[~s .m1] base=~s\n" input-file-name base-name))
(suffix (cond ((not libc) ".0-hex2")
((eq? libc libc-mes.E) ".hex2")
((eq? libc libc-mes+tcc.E) ".tcc-hex2")
(else ".mini-hex2")))
;;(foo (format (current-error-port) "m1.as[~s .m1] base=~s\n" input-file-name base-name))
(suffix ".hex2")
(target-file-name (string-append base-name suffix))
(m1-target (compile.mescc input-file-name #:cc cc #:libc libc #:defines defines #:includes includes #:dependencies dependencies))
(libc.m1 (cond ((eq? libc libc-mes.E)
(compile.mescc "mlibc/libc-mes.c" #:libc #f #:defines defines #:includes includes))
((eq? libc mini-libc-mes.E)
(compile.mescc "mlibc/mini-libc-mes.c" #:libc #f #:defines defines #:includes includes))
((eq? libc libc-mes+tcc.E)
(compile.mescc "mlibc/libc-mes+tcc.c" #:libc #f #:defines defines #:includes includes))
(else #f))))
(m1-target (compile.mescc input-file-name #:cc cc #:defines defines #:includes includes #:dependencies dependencies)))
(target (file-name target-file-name)
;;(inputs `(,@(if libc (list libc.m1) '()) ,m1-target))
(inputs `(,m1-target))
(method (M1.asm #:m1 m1)))))
(method (M1.as #:m1 m1)))))
(define* (bin.mescc input-file-name #:key (cc %MESCC) (hex2 %HEX2) (m1 %M1) (libc libc-mes.E) (dependencies '()) (defines '()) (includes '()))
(let* ((base-name (base-name input-file-name ".c"))
;;(foo (format (current-error-port) "bin[~s .c] base=~s\n" input-file-name base-name))
(suffix (cond ((not libc) ".0-guile")
((eq? libc libc-mes.E) ".guile")
((eq? libc libc-mes+tcc.E) ".tcc-guile")
(else ".mini-guile")))
(target-file-name (string-append base-name suffix))
(hex2-target (m1-asm input-file-name #:m1 m1 #:cc cc #:libc libc #:defines defines #:includes includes #:dependencies dependencies)))
(target (file-name target-file-name)
(inputs (list hex2-target))
(method (LINK.hex2 #:hex2 hex2 #:debug? (eq? libc libc-mes.E))))))
(define* (bin.gcc input-file-name #:key (libc #t) (cc (if libc %CC %CC32)) (dependencies '()) (defines '()) (includes '()))
(define* (bin.gcc input-file-name #:key (libc #t) (crt1 (if (eq? libc #t) #f crt1.mlibc-o)) (cc (if (eq? libc #t) %CC %CC32)) (dependencies '()) (defines '()) (includes '()))
(and cc
(let* ((base-name (base-name input-file-name ".c"))
(suffix (if libc ".gcc" ".mlibc-gcc"))
(suffix (if (eq? libc #t) ".gcc" ".mlibc-gcc"))
(target-file-name (string-append base-name suffix))
(o-target (compile.gcc input-file-name #:cc cc #:libc libc #:defines defines #:includes includes #:dependencies dependencies)))
(target (file-name target-file-name)
(inputs (list o-target))
(method (LINK.gcc #:cc cc #:libc libc))))))
(method (LINK.gcc #:cc cc #:libc libc #:crt1 crt1))))))
(define* (snarf input-file-name #:key (dependencies '()) (mes? #t))
(let* ((base-name (base-name input-file-name ".c"))
@ -576,3 +533,7 @@
(define (get-target o)
(if (target? o) o
(find (lambda (t) (equal? (target-file-name t) o)) %targets)))
(define crt1.mlibc-o (compile.gcc "mlibc/crt1.c" #:libc #f))
(define libc-gcc.mlibc-o (compile.gcc "mlibc/libc-gcc.c" #:libc #f))
(define libc-gcc+tcc.mlibc-o (compile.gcc "mlibc/libc-gcc+tcc.c" #:libc #f))

121
make.scm
View file

@ -38,13 +38,81 @@ exec ${GUILE-guile} --no-auto-compile -L . -L guile -C . -C guile -s "$0" ${1+"$
(ice-9 match)
(guix make))
(define crt1.hex2 (m1.as "mlibc/crt1.c"))
(add-target crt1.hex2)
(add-target crt1.mlibc-o)
(define %HEX2-FLAGS
'("--LittleEndian"
"--Architecture=1"
"--BaseAddress=0x1000000"))
(define %HEX2 (PATH-search-path "hex2"))
(define* (LINK.hex2 #:key (hex2 %HEX2) (hex2-flags %HEX2-FLAGS) (crt1 crt1.hex2) (libc libc-mes.hex2) debug?)
(method (name "LINK.hex2")
(build (lambda (o t)
(let* ((input-files (map target-file-name (target-inputs t)))
;; FIXME: snarf inputs
(input-files (filter (lambda (f) (and (string-suffix? "hex2" f)
(not (member f (cdr input-files)))))
input-files)))
(format #t " ~a\t ~a -> ~a\n" (method-name o) (string-join input-files) (target-file-name t))
(with-output-to-file (target-file-name t)
(lambda _
(set-port-encoding! (current-output-port) "ISO-8859-1")
(display
(apply assert-gulp-pipe*
`(,hex2
,@hex2-flags
"-f"
,(if (not debug?) "stage0/elf32-0header.hex2"
"stage0/elf32-header.hex2")
,@(if crt1 `("-f" ,(target-file-name crt1)) '())
,@(if libc `("-f" ,(target-file-name libc)) '())
,@(append-map (cut list "-f" <>) input-files)
"-f"
,(if (not debug?) "stage0/elf-0footer.hex2"
"stage0/elf32-footer-single-main.hex2"))))))
(chmod (target-file-name t) #o755))))
(inputs `(,(store #:add-file "stage0/elf32-0header.hex2")
,@(if crt1 (target-inputs crt1) '())
,@(if libc (target-inputs libc) '())
,(store #:add-file "stage0/elf-0footer.hex2")))))
(define* (bin.mescc input-file-name #:key (cc %MESCC) (hex2 %HEX2) (m1 %M1) (crt1 crt1.hex2) (libc libc-mes.hex2) (dependencies '()) (defines '()) (includes '()))
(let* ((base-name (base-name input-file-name ".c"))
;;(foo (format (current-error-port) "bin[~s .c] base=~s\n" input-file-name base-name))
(suffix (cond ((not libc) ".0-guile")
((eq? libc libc-mes.hex2) ".guile")
((eq? libc libc-mes+tcc.hex2) ".tcc-guile")
(else ".mini-guile")))
(target-file-name (string-append base-name suffix))
(hex2-target (m1.as input-file-name #:m1 m1 #:cc cc #:defines defines #:includes includes #:dependencies dependencies)))
(target (file-name target-file-name)
(inputs `(,hex2-target
,@(if crt1 (list crt1) '())
,@(if libc (list libc) '())))
(method (LINK.hex2 #:hex2 hex2 #:crt1 crt1 #:libc libc #:debug? (eq? libc libc-mes.hex2))))))
;;(define mini-libc-mes.E (m1.as "mlibc/mini-libc-mes.c"))
(define libc-mes.hex2 (m1.as "mlibc/libc-mes.c"))
(add-target libc-mes.hex2)
(define mini-libc-mes.hex2 (m1.as "mlibc/mini-libc-mes.c"))
(add-target mini-libc-mes.hex2)
(define libc-mes+tcc.hex2 (m1.as "mlibc/libc-mes+tcc.c"))
(add-target libc-mes+tcc.hex2)
(add-target (bin.mescc "stage0/exit-42.c" #:libc #f))
(add-target (check "stage0/exit-42.0-guile" #:signal 11)) ; FIXME: segfault
(add-target (check "stage0/exit-42.0-guile" #:exit 42))
(add-target (cpp.mescc "mlibc/mini-libc-mes.c"))
(add-target (compile.mescc "mlibc/mini-libc-mes.c"))
(add-target (bin.mescc "stage0/exit-42.c" #:libc mini-libc-mes.E))
(add-target (bin.mescc "stage0/exit-42.c" #:libc mini-libc-mes.hex2))
(add-target (check "stage0/exit-42.mini-guile" #:exit 42))
(add-target (cpp.mescc "mlibc/libc-mes.c"))
@ -53,17 +121,21 @@ exec ${GUILE-guile} --no-auto-compile -L . -L guile -C . -C guile -s "$0" ${1+"$
(add-target (bin.mescc "stage0/exit-42.c"))
(add-target (check "stage0/exit-42.guile" #:exit 42))
(define* (add-scaffold-test name #:key (exit 0) (libc libc-mes.E))
(add-target (bin.gcc (string-append "scaffold/tests/" name ".c") #:libc #f))
(define* (add-scaffold-test name #:key (exit 0) (libc libc-mes.hex2) (libc-gcc libc-gcc.mlibc-o))
(add-target (bin.gcc (string-append "scaffold/tests/" name ".c") #:libc libc-gcc))
(add-target (check (string-append "scaffold/tests/" name ".mlibc-gcc") #:exit exit))
(add-target (bin.mescc (string-append "scaffold/tests/" name ".c") #:libc libc))
(add-target (check (string-append "scaffold/tests/" name "." (cond ((not libc) "0-")
((eq? libc mini-libc-mes.E) "mini-")
((eq? libc mini-libc-mes.hex2) "mini-")
(else "")) "guile") #:exit exit)))
(add-scaffold-test "t" #:libc mini-libc-mes.E)
;;(add-scaffold-test "t" #:libc libc-mes+tcc.E)
(add-target (compile.gcc "mlibc/crt1.c" #:libc #f))
(add-target (compile.gcc "mlibc/libc-gcc.c" #:libc #f))
(add-target (compile.gcc "mlibc/libc-gcc+tcc.c" #:libc #f))
;;(add-scaffold-test "t" #:libc mini-libc-mes.hex2)
;;(add-scaffold-test "t" #:libc libc-mes+tcc.hex2)
;; tests/00: exit, functions without libc
(add-scaffold-test "00-exit-0" #:libc #f)
@ -101,7 +173,7 @@ exec ${GUILE-guile} --no-auto-compile -L . -L guile -C . -C guile -s "$0" ${1+"$
;; tests/30: call, compare: mini-libc-mes.c
(for-each
(cut add-scaffold-test <> #:libc mini-libc-mes.E)
(cut add-scaffold-test <> #:libc mini-libc-mes.hex2)
'("30-strlen"
"31-eputs"
"32-compare"
@ -116,7 +188,7 @@ exec ${GUILE-guile} --no-auto-compile -L . -L guile -C . -C guile -s "$0" ${1+"$
;; tests/40: control: mini-libc-mes.c
(for-each
(cut add-scaffold-test <> #:libc mini-libc-mes.E)
(cut add-scaffold-test <> #:libc mini-libc-mes.hex2)
'("40-if-else"
"41-?"
"42-goto-label"
@ -181,7 +253,7 @@ exec ${GUILE-guile} --no-auto-compile -L . -L guile -C . -C guile -s "$0" ${1+"$
(add-target (compile.mescc "mlibc/libc-mes+tcc.c"))
(define* (add-tcc-test name)
(add-target (bin.gcc (string-append "scaffold/tinycc/" name ".c") #:libc #f #:includes '("scaffold/tinycc")))
(add-target (bin.gcc (string-append "scaffold/tinycc/" name ".c") #:libc libc-gcc.mlibc-o #:includes '("scaffold/tinycc")))
(add-target (check (string-append "scaffold/tinycc/" name ".mlibc-gcc") #:baseline (string-append "scaffold/tinycc/" name ".expect")))
(add-target (bin.mescc (string-append "scaffold/tinycc/" name ".c") #:includes '("scaffold/tinycc")))
@ -259,7 +331,7 @@ exec ${GUILE-guile} --no-auto-compile -L . -L guile -C . -C guile -s "$0" ${1+"$
;; (add-target (bin.gcc "scaffold/main.c" #:libc #f))
;; (add-target (check "scaffold/main.mlibc-gcc" #:exit 42))
;; (add-target (bin.mescc "scaffold/main.c" #:libc mini-libc-mes.E))
;; (add-target (bin.mescc "scaffold/main.c" #:libc mini-libc-mes.hex2))
;; (add-target (check "scaffold/main.mini-guile" #:exit 42))
;; (add-target (bin.mescc "scaffold/main.c"))
@ -269,10 +341,10 @@ exec ${GUILE-guile} --no-auto-compile -L . -L guile -C . -C guile -s "$0" ${1+"$
(add-target (bin.gcc "scaffold/hello.c"))
(add-target (check "scaffold/hello.gcc" #:exit 42))
(add-target (bin.gcc "scaffold/hello.c" #:libc #f))
(add-target (bin.gcc "scaffold/hello.c" #:libc libc-gcc.mlibc-o))
(add-target (check "scaffold/hello.mlibc-gcc" #:exit 42))
(add-target (bin.mescc "scaffold/hello.c" #:libc mini-libc-mes.E))
(add-target (bin.mescc "scaffold/hello.c" #:libc mini-libc-mes.hex2))
(add-target (check "scaffold/hello.mini-guile" #:exit 42))
(add-target (bin.mescc "scaffold/hello.c"))
@ -282,13 +354,13 @@ exec ${GUILE-guile} --no-auto-compile -L . -L guile -C . -C guile -s "$0" ${1+"$
(add-target (bin.gcc "scaffold/m.c"))
(add-target (check "scaffold/m.gcc" #:exit 255))
(add-target (bin.gcc "scaffold/m.c" #:libc #f))
(add-target (bin.gcc "scaffold/m.c" #:libc libc-gcc.mlibc-o))
(add-target (check "scaffold/m.mlibc-gcc" #:exit 255))
(add-target (bin.mescc "scaffold/m.c"))
(add-target (check "scaffold/m.guile" #:exit 255))
(add-target (bin.gcc "scaffold/micro-mes.c" #:libc #f))
(add-target (bin.gcc "scaffold/micro-mes.c" #:libc libc-gcc.mlibc-o))
(add-target (check "scaffold/micro-mes.mlibc-gcc" #:exit 6)) ; arg1 arg2 arg3 arg4 arg5
(add-target (bin.mescc "scaffold/micro-mes.c"))
@ -334,7 +406,7 @@ exec ${GUILE-guile} --no-auto-compile -L . -L guile -C . -C guile -s "$0" ${1+"$
,(string-append "PREFIX=\"" %prefix "\""))
#:includes '("src")))
(add-target (bin.gcc "src/mes.c" #:libc #f
(add-target (bin.gcc "src/mes.c" #:libc libc-gcc.mlibc-o
#:dependencies mes-snarf-targets
#:defines `("FIXED_PRIMITIVES=1"
"MES_FULL=1"
@ -510,12 +582,17 @@ exec ${GUILE-guile} --no-auto-compile -L . -L guile -C . -C guile -s "$0" ${1+"$
((install-guile-dir #:dir (string-append %godir)) f))
%go-files)
(add-target (install "mlibc/libc-mes.E" #:dir "lib"))
(add-target (install "mlibc/crt1.hex2" #:dir "lib"))
(add-target (install "mlibc/libc-mes.M1" #:dir "lib"))
(add-target (install "mlibc/libc-mes+tcc.E" #:dir "lib"))
(add-target (install "mlibc/libc-mes.hex2" #:dir "lib"))
(add-target (install "mlibc/libc-mes+tcc.M1" #:dir "lib"))
(add-target (install "mlibc/mini-libc-mes.E" #:dir "lib"))
(add-target (install "mlibc/libc-mes+tcc.hex2" #:dir "lib"))
(add-target (install "mlibc/mini-libc-mes.M1" #:dir "lib"))
(add-target (install "mlibc/mini-libc-mes.hex2" #:dir "lib"))
(add-target (install "mlibc/crt1.mlibc-o" #:dir "lib"))
(add-target (install "mlibc/libc-gcc.mlibc-o" #:dir "lib"))
(add-target (install "mlibc/libc-gcc+tcc.mlibc-o" #:dir "lib"))
(for-each
(lambda (f)
@ -587,15 +664,17 @@ Targets:
(string-join (filter (negate (cut string-index <> #\/)) (map target-file-name %targets)) "\n " 'prefix)))
(else
(let ((targets (match args
(() (filter (negate check-target?) %targets))
(() (filter (conjoin (negate install-target?)
(negate check-target?))
%targets))
((? (cut member "all" <>)) (filter (conjoin (negate install-target?)
(negate check-target?))
%targets))
((? (cut member "check" <>)) (filter check-target? %targets))
((? (cut member "install" <>)) (filter install-target? %targets))
(_ (filter-map (cut get-target <>) args)))))
;;((@@ (guix make) store) #:print 0)
(for-each build targets)
;;((@@ (mes make) store) #:print 0)
(exit %status)))))
(main (cdr (command-line)))

92
mlibc/crt1.c Normal file
View file

@ -0,0 +1,92 @@
/* -*-comment-start: "//";comment-end:""-*-
* Mes --- Maxwell Equations of Software
* Copyright © 2017 Jan Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of Mes.
*
* Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
*/
char **g_environment = 0;
int main (int,char*[]);
#if __GNUC__ && !POSIX
void
_start ()
{
asm (
"mov %%ebp,%%eax\n\t"
"addl $4,%%eax\n\t"
"movzbl (%%eax),%%eax\n\t"
"addl $3,%%eax\n\t"
"shl $2,%%eax\n\t"
"add %%ebp,%%eax\n\t"
"movl %%eax,%0\n\t"
: "=g_environment" (g_environment)
: //no inputs ""
);
asm (
"mov %%ebp,%%eax\n\t"
"addl $8,%%eax\n\t"
"push %%eax\n\t"
"mov %%ebp,%%eax\n\t"
"addl $4,%%eax\n\t"
"movzbl (%%eax),%%eax\n\t"
"push %%eax\n\t"
"call main\n\t"
"mov %%eax,%%ebx\n\t"
"mov $1,%%eax\n\t"
"int $0x80\n\t"
"hlt \n\t"
:
);
}
#elif __MESC__
int
_start ()
{
asm ("mov____%ebp,%eax");
asm ("add____$i8,%eax !4");
asm ("movzbl_(%eax),%eax");
asm ("add____$i8,%eax !3");
asm ("shl____$i8,%eax !0x02");
asm ("add____%ebp,%eax");
asm ("mov____%eax,0x32 &g_environment");
asm ("mov____%ebp,%eax");
asm ("add____$i8,%eax !8");
asm ("push___%eax");
asm ("mov____%ebp,%eax");
asm ("add____$i8,%eax !4");
asm ("movzbl_(%eax),%eax");
asm ("push___%eax");
main ();
asm ("mov____%eax,%ebx");
asm ("mov____$i32,%eax %1");
asm ("int____$0x80");
asm ("hlt");
}
#endif

View file

@ -18,7 +18,6 @@
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
*/
char **g_environment = 0;
int g_stdin = 0;
#include <stdio.h>
@ -558,41 +557,3 @@ fdungetc (int c, int fd)
}
#endif // POSIX
#if __GNUC__ && !POSIX
void
_start ()
{
// char **;
asm (
"mov %%ebp,%%eax\n\t"
"addl $4,%%eax\n\t"
"movzbl (%%eax),%%eax\n\t"
"addl $3,%%eax\n\t"
"shl $2,%%eax\n\t"
"add %%ebp,%%eax\n\t"
"movl %%eax,%0\n\t"
: "=g_environment" (g_environment)
: //no inputs ""
);
int r;
asm (
"mov %%ebp,%%eax\n\t"
"addl $8,%%eax\n\t"
"push %%eax\n\t"
"mov %%ebp,%%eax\n\t"
"addl $4,%%eax\n\t"
"movzbl (%%eax),%%eax\n\t"
"push %%eax\n\t"
"call main\n\t"
"movl %%eax,%0\n\t"
: "=r" (r)
: //no inputs ""
);
exit (r);
}
#endif // __GNUC__ && !POSIX

View file

@ -21,39 +21,10 @@
#include <stdarg.h>
#include <stdlib.h>
char **g_environment = 0; // FIXME: todo extern
int g_stdin = 0;
char **g_environment;
int main (int,char*[]);
int
_start ()
{
asm ("mov____%ebp,%eax");
asm ("add____$i8,%eax !4");
asm ("movzbl_(%eax),%eax");
asm ("add____$i8,%eax !3");
asm ("shl____$i8,%eax !0x02");
asm ("add____%ebp,%eax");
asm ("mov____%eax,0x32 &g_environment");
asm ("mov____%ebp,%eax");
asm ("add____$i8,%eax !8");
asm ("push___%eax");
asm ("mov____%ebp,%eax");
asm ("add____$i8,%eax !4");
asm ("movzbl_(%eax),%eax");
asm ("push___%eax");
main ();
asm ("mov____%eax,%ebx");
asm ("mov____$i32,%eax %1");
asm ("int____$0x80");
asm ("hlt");
}
void _env ();
void
exit ()

View file

@ -18,34 +18,24 @@
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
*/
int exit ();
int main(int,char*[]);
int
_start ()
{
int r = main ();
exit (r);
}
void
exit ()
{
asm ("mov____0x8(%ebp),%ebx !8"); // mov 0x8(%ebp),%ebx
asm ("mov____0x8(%ebp),%ebx !8");
asm ("mov____$i32,%eax SYS_exit"); // mov $0x1,%eax
asm ("int____$0x80"); // int $0x80
asm ("mov____$i32,%eax SYS_exit");
asm ("int____$0x80");
}
void
write ()
{
asm ("mov____0x8(%ebp),%ebx !8"); // mov 0x8(%ebp),%ebx
asm ("mov____0x8(%ebp),%ecx !12"); // mov 0x8(%ebp),%ecx
asm ("mov____0x8(%ebp),%edx !16"); // mov 0x8(%ebp),%edx
asm ("mov____0x8(%ebp),%ebx !8");
asm ("mov____0x8(%ebp),%ecx !12");
asm ("mov____0x8(%ebp),%edx !16");
asm ("mov____$i32,%eax SYS_write"); // mov $0x4,%eax
asm ("int____$0x80"); // int $0x80
asm ("mov____$i32,%eax SYS_write");
asm ("int____$0x80");
}
int

View file

@ -155,8 +155,8 @@
(format #t "\"~a\"" (list->string (list-head data (1- (length data))))))
(else (format #t "~a" (string-join (map text->M1 data) " "))))
(newline)))
(display "\n:HEX2_text")
(for-each write-function (filter cdr functions))
(when (assoc-ref functions "main")
(display "\n\n:ELF_data\n") ;; FIXME
(display "\n\n:HEX2_data\n")
(display "\n\n:HEX2_data\n"))
(for-each write-global globals)))

View file

@ -52,6 +52,7 @@ DEFINE cmp____%edx,%eax 39d0
DEFINE hlt f4
DEFINE idiv___%ebx f7fb
DEFINE int____$0x80 cd80
DEFINE int cd
DEFINE je32 0f84
DEFINE je8 74
DEFINE jg32 0f8f
@ -185,8 +186,6 @@ DEFINE xor____%ecx,%ecx 31c9
DEFINE xor____%edx,%eax 31d0
DEFINE xor____%edx,%edx 31d2
DEFINE SYS_exit 01000000
DEFINE SYS_read 03000000
DEFINE SYS_write 04000000