rust: various build script fixes
This commit is contained in:
parent
e42315e67a
commit
8c129e33db
12 changed files with 307 additions and 165 deletions
|
|
@ -11,39 +11,9 @@
|
|||
(zilch lang rust))
|
||||
|
||||
(export
|
||||
<build-script-output>
|
||||
make-build-script-output build-script-output?
|
||||
build-script-output-rerun-if-changed build-script-output-rerun-if-env-changed
|
||||
build-script-output-link-arg build-script-output-link-lib build-script-output-link-search
|
||||
build-script-output-flags build-script-output-cfg build-script-output-check-cfg
|
||||
build-script-output-env build-script-output-warning build-script-output-metadata
|
||||
|
||||
call-runner)
|
||||
|
||||
(begin
|
||||
(define-record-type <build-script-output>
|
||||
(make-build-script-output rerun-if-changed rerun-if-env-changed link-arg link-lib link-search flags cfg check-cfg env warning metadata)
|
||||
build-script-output?
|
||||
(rerun-if-changed build-script-output-rerun-if-changed set-build-script-output-rerun-if-changed!)
|
||||
(rerun-if-env-changed build-script-output-rerun-if-env-changed set-build-script-output-rerun-if-env-changed!)
|
||||
(link-arg build-script-output-link-arg set-build-script-output-link-arg!)
|
||||
(link-lib build-script-output-link-lib set-build-script-output-link-lib!)
|
||||
(link-search build-script-output-link-search set-build-script-output-link-search!)
|
||||
(flags build-script-output-flags set-build-script-output-flags!)
|
||||
(cfg build-script-output-cfg set-build-script-output-cfg!)
|
||||
(check-cfg build-script-output-check-cfg set-build-script-output-check-cfg!)
|
||||
(env build-script-output-env set-build-script-output-env!)
|
||||
(warning build-script-output-warning set-build-script-output-warning!)
|
||||
(metadata build-script-output-metadata set-build-script-output-metadata!))
|
||||
(define-record-printer (<build-script-output> entry out)
|
||||
(fprintf out "#<build-script-output changed:~S env-changed:~S flags:~S cfg:~S check-cfg:~S env:~S>"
|
||||
(build-script-output-rerun-if-changed entry)
|
||||
(build-script-output-rerun-if-env-changed entry)
|
||||
(build-script-output-flags entry)
|
||||
(build-script-output-cfg entry)
|
||||
(build-script-output-check-cfg entry)
|
||||
(build-script-output-env entry)))
|
||||
|
||||
(define linker (delay (let ((v (cdr (assoc "out" (nixpkgs "gcc"))))) #~,(string-append #$v "/bin/cc"))))
|
||||
|
||||
(foreign-declare "#include \"runner_source.h\"")
|
||||
|
|
@ -57,76 +27,13 @@
|
|||
#:edition "2021"
|
||||
#:emits '(#:link #t))))
|
||||
|
||||
(define (parse-build-script-line line out)
|
||||
;; Rewrite cargo:foo -> cargo::foo
|
||||
(when (and (string-prefix? "cargo:" line) (not (string-prefix? "cargo::" line)))
|
||||
(set! line (string-append "cargo::" (string-copy line 6))))
|
||||
(cond
|
||||
((string-prefix? "cargo::rerun-if-changed=" line)
|
||||
(set-build-script-output-rerun-if-changed! out (cons (string-copy line 24) (build-script-output-rerun-if-changed out))))
|
||||
((string-prefix? "cargo::rerun-if-env-changed=" line)
|
||||
(set-build-script-output-rerun-if-env-changed! out (cons (string-copy line 28) (build-script-output-rerun-if-env-changed out))))
|
||||
((string-prefix? "cargo::rustc-flags=" line)
|
||||
(set-build-script-output-flags! out (cons (string-copy line 19) (build-script-output-flags out))))
|
||||
((string-prefix? "cargo::rustc-cfg=" line)
|
||||
(let* ((kv (string-copy line 17))
|
||||
(splat-start (and (string-suffix? "\"" kv) (string-contains kv "=\""))))
|
||||
(set-build-script-output-cfg! out
|
||||
(cons
|
||||
(if splat-start
|
||||
(cons (string-copy kv 0 splat-start) (string-copy kv (+ splat-start 2) (- (string-length kv) 1)))
|
||||
kv)
|
||||
(build-script-output-cfg out)))))
|
||||
((string-prefix? "cargo::rustc-check-cfg=" line)
|
||||
(set-build-script-output-check-cfg! out (cons (string-copy line 23) (build-script-output-check-cfg out))))
|
||||
((string-prefix? "cargo::rustc-env=" line)
|
||||
(let* ((kv (string-copy line 17))
|
||||
(splat-start (string-contains kv "=")))
|
||||
(set-build-script-output-env! out
|
||||
(cons
|
||||
(cons (string-copy kv 0 splat-start) (string-copy kv (+ splat-start 1)))
|
||||
(build-script-output-env out)))))
|
||||
((string-prefix? "cargo::metadata=" line)
|
||||
(let* ((kv (string-copy line 16))
|
||||
(splat-start (string-contains kv "=")))
|
||||
(set-build-script-output-metadata! out
|
||||
(cons
|
||||
(cons (string-copy kv 0 splat-start) (string-copy kv (+ splat-start 1)))
|
||||
(build-script-output-metadata out)))))
|
||||
((string-prefix? "cargo::rustc-link-search=" line)
|
||||
(let* ((kv (string-copy line 25))
|
||||
(splat-start (string-contains kv "=")))
|
||||
(set-build-script-output-link-search! out
|
||||
(cons
|
||||
(if splat-start (cons (string-copy kv 0 splat-start) (string-copy kv (+ splat-start 1)))
|
||||
kv)
|
||||
(build-script-output-link-search out)))))
|
||||
((string-prefix? "cargo::rustc-link-lib=" line)
|
||||
(set-build-script-output-link-lib! out
|
||||
(cons
|
||||
(string-copy line 22)
|
||||
(build-script-output-link-lib out))))
|
||||
|
||||
; TODO(puck): bad
|
||||
((string-prefix? "cargo::" line)
|
||||
(let* ((kv (string-copy line 7))
|
||||
(splat-start (string-contains kv "=")))
|
||||
(set-build-script-output-metadata! out
|
||||
(cons
|
||||
(cons (string-copy kv 0 splat-start) (string-copy kv (+ splat-start 1)))
|
||||
(build-script-output-metadata out)))))))
|
||||
;; TODO: link-arg-*, warning, others?
|
||||
|
||||
(define (parse-build-script-output port)
|
||||
(define out (make-build-script-output '() '() '() '() '() '() '() '() '() '() '()))
|
||||
(define (tick)
|
||||
(define line (read-line port))
|
||||
(if (eof-object? line)
|
||||
out
|
||||
(begin (parse-build-script-line line out) (tick))))
|
||||
(tick))
|
||||
|
||||
(define (call-runner input-script cwd env)
|
||||
(define output (store-path-for-ca-drv* "build.rs-run" "x86_64-linux" #~(#$runner-runner) #~(("script" . #$input-script) ("cwd" . #$cwd) ("OUT_DIR" . ,(make-placeholder "outdir")) . #$env) '("out" "outdir")))
|
||||
(values (call-with-port (store-path-open (cdr (assoc "out" output))) parse-build-script-output) (cdr (assoc "outdir" output))))))
|
||||
(define output (store-path-for-ca-drv* "build.rs-run" "x86_64-linux"
|
||||
`(,runner-runner)
|
||||
#~(("script" . #$input-script)
|
||||
("cwd" . #$cwd)
|
||||
("OUT_DIR" . ,(make-placeholder "outdir"))
|
||||
. #$env)
|
||||
'("out" "outdir")))
|
||||
(values (cdr (assoc "outdir" output)) (cdr (assoc "out" output))))))
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue