diff --git a/lang/rust/src/resolver.sld b/lang/rust/src/resolver.sld index fdae960..3b4e8c6 100644 --- a/lang/rust/src/resolver.sld +++ b/lang/rust/src/resolver.sld @@ -309,7 +309,8 @@ (define rustc-env #~( ; ("CARGO" . "") - ("CARGO_MANIFEST_DIR" . "") + ("CARGO_MANIFEST_DIR" . #$crate-root) + ,@(if (cargo-crate-links (resolved-package-crate resolved)) (list (cons "CARGO_MANIFEST_LINKS" (cargo-crate-links (resolved-package-crate resolved)))) '()) ("CARGO_PKG_VERSION" . ,(version-str (resolved-package-version resolved))) ("CARGO_PKG_VERSION_MAJOR" . ,(number->string (version-major (resolved-package-version resolved)))) ("CARGO_PKG_VERSION_MINOR" . ,(number->string (version-minor (resolved-package-version resolved)))) @@ -329,10 +330,22 @@ ; CARGO_PRIMARY_PACKAGE: not sensible here ; CARGO_TARGET_TMPDIR: integration/benchmark only ; CARGO_RUSTC_CURRENT_DIR: nightly only - + (define (upcase-underscore ch) (if (char=? ch #\-) #\_ (char-upcase ch))) + (define (make-cfg-values-env l out) + (cond + ((pair? l) + (let* ((env-name (string-map upcase-underscore (string-append "CARGO_CFG_" (caar l)))) + (existing (assoc env-name out))) + (when (and existing (cdar l)) + (set-cdr! existing (string-append (cdr existing) "," (cdar l)))) + (if existing + (make-cfg-values-env (cdr l) out) + (make-cfg-values-env (cdr l) (cons (cons env-name (or (cdar l) "")) out))))) + (else out))) + (when (resolved-package-build-script resolved) (unless (resolved-package-build-data (resolved-package-build-script resolved)) (build-package (resolved-package-build-script resolved))) @@ -340,14 +353,16 @@ (lambda (key value) (unless (resolved-package-build-data value) (build-package value)) - (for-each - (lambda (kv) - (set! dependency-metadata (cons (cons (string-map upcase-underscore (string-append "DEP_" (cargo-crate-links (resolved-package-crate value)) "_" (car kv))) (cdr kv)) dependency-metadata))) - (resolved-package-build-data-build-script-metadata (resolved-package-build-data value)))) + (when (cargo-crate-links (resolved-package-crate value)) + (for-each + (lambda (kv) + (set! dependency-metadata (cons (cons (string-map upcase-underscore (string-append "DEP_" (cargo-crate-links (resolved-package-crate value)) "_" (car kv))) (cdr kv)) dependency-metadata))) + (resolved-package-build-data-build-script-metadata (resolved-package-build-data value))))) (resolved-package-dependencies resolved)) (let*-values (((build-script) (cdr (resolved-package-build-data-rlib (resolved-package-build-data (resolved-package-build-script resolved))))) ((build-script-env) (build-script-env-overrides-for-crate (cargo-crate-name (resolved-package-crate resolved)))) + ((rewritten-features) (map (lambda (feature) (cons (string-map upcase-underscore (string-append "CARGO_FEATURE_" feature)) "")) (resolved-package-enabled-features resolved))) ((runner-output runner-outdir) (call-runner build-script crate-root #~( @@ -357,12 +372,13 @@ ("OPT_LEVEL" . "0") ("PROFILE" . "debug") ("DEBUG" . "true") + ,@(make-cfg-values-env cfg-values '()) ,@dependency-metadata + ,@rewritten-features #$@build-script-env ; TODO: OUT_DIR, NUM_JOBS, OPT_LEVEL/DEBUG/PROFILE, DEP_* ; RUSTC/RUSTDOC?, RUSTC_LINKER? and CARGO_ENCODED_RUSTFLAGS . #$rustc-env)))) - (printf "runner output for ~S: ~S\n" (cargo-crate-name (resolved-package-crate resolved)) runner-output) (map (lambda (v) (if (pair? v) @@ -370,9 +386,9 @@ (set! params `(#:cfg ,v . ,params)))) (build-script-output-cfg runner-output)) (set! buildscript-metadata (build-script-output-metadata runner-output)) + (for-each (lambda (kv) (set! rustc-env (cons kv rustc-env))) (build-script-output-env runner-output)) (let ((old-rustc-env rustc-env)) (set! rustc-env #~(("OUT_DIR" . #$runner-outdir) . #$old-rustc-env))) - ; Reverse order for scheme reasons. (for-each (lambda (kv) (set! bin-flags `(#:link ,kv . ,bin-flags))) (build-script-output-link-lib runner-output)) @@ -381,11 +397,10 @@ ; This should be replaced with .... $something (a dir of all build script outputs?) (unless (or (null? build-script-env) (null? bin-flags)) (let ((v (cadr bin-flags))) - (set-cdr! bin-flags (cons #~,(begin #$build-script-env v) (cddr bin-flags))))) + (set-cdr! bin-flags (cons #~,(begin #$build-script-env #$runner-outdir v) (cddr bin-flags))))) (for-each (lambda (kv) (set! bin-flags `(#:search-path ,kv . ,bin-flags))) - (build-script-output-link-search runner-output)) - (printf "~S bin flags: ~S\n" (cargo-crate-name (resolved-package-crate resolved)) bin-flags))) + (build-script-output-link-search runner-output)))) ; TODO(puck): check-cfg wants check-cfg everywhere ;(map ; (lambda (v) @@ -402,10 +417,14 @@ (unless (member value transitive-dependencies) (set! transitive-dependencies (cons value transitive-dependencies))) (define data (resolved-package-build-data value)) (define meta-or-rlib (or (resolved-package-build-data-metadata data) (resolved-package-build-data-rlib data))) + (define name (cratify-name key)) + ; TODO(puck): what _is_ the logic here? + (when (string=? key (cargo-crate-name (resolved-package-crate value))) + (set! name (cratify-name (cargo-target-name (resolved-package-cargo-target value))))) (set! params-meta - `(#:externs (,(cratify-name key) . ,(cdr meta-or-rlib)) . ,params-meta)) + `(#:externs (,name . ,(cdr meta-or-rlib)) . ,params-meta)) (set! params - `(#:externs (,(cratify-name key) . ,(cdr (resolved-package-build-data-rlib data))) . ,params))) + `(#:externs (,name . ,(cdr (resolved-package-build-data-rlib data))) . ,params))) (resolved-package-dependencies resolved)) (define transitive-dependencies-meta @@ -437,6 +456,8 @@ (when (eq? crate-type 'proc-macro) (set! rlib-name (string-append "lib" crate-name "-v" crate-version ".so"))) + (when (eq? crate-type 'bin) + (set! rlib-name crate-name)) (when (or (eq? crate-type 'proc-macro) (eq? crate-type 'bin)) (set! params (append transitive-bin-flags params)))