From 054b320f27ed72077d6ef7046d1cda3b11a6140c Mon Sep 17 00:00:00 2001 From: Puck Meerburg Date: Wed, 27 Nov 2024 14:18:18 +0000 Subject: [PATCH] (zilch lang rust cargo): parse cfg values at runtime --- lang/rust/cfg-fetch.rs | 10 +++++++ lang/rust/default.nix | 1 + lang/rust/src/cargo.sld | 60 ++++++++++++++++------------------------- 3 files changed, 34 insertions(+), 37 deletions(-) create mode 100644 lang/rust/cfg-fetch.rs diff --git a/lang/rust/cfg-fetch.rs b/lang/rust/cfg-fetch.rs new file mode 100644 index 0000000..d03e374 --- /dev/null +++ b/lang/rust/cfg-fetch.rs @@ -0,0 +1,10 @@ +use std::{env::var_os, fs::{create_dir, File}, os::unix::process::CommandExt, process::Command}; + +fn main() { + Err( + Command::new(var_os("rustc").unwrap()) + .arg("--print=cfg") + .stdout(File::create(var_os("out").unwrap()).unwrap()) + .exec()) + .unwrap() +} diff --git a/lang/rust/default.nix b/lang/rust/default.nix index 00bd4b8..abc038a 100644 --- a/lang/rust/default.nix +++ b/lang/rust/default.nix @@ -15,5 +15,6 @@ ]; overrides.preBuild = '' (cat buildrs-runner.rs; printf '\0') | xxd -i -n runner_source > runner_source.h + (cat cfg-fetch.rs; printf '\0') | xxd -i -n cfgfetch_source > cfgfetch_source.h ''; } diff --git a/lang/rust/src/cargo.sld b/lang/rust/src/cargo.sld index bcb39f1..a79e85f 100644 --- a/lang/rust/src/cargo.sld +++ b/lang/rust/src/cargo.sld @@ -9,6 +9,7 @@ (chicken foreign) (srfi 4) (srfi 128) (srfi 146) (srfi 152) (srfi 207) (zilch lang rust registry) (zilch lang rust) (zilch lang rust cfg) + (zilch lang rust cfg) (zilch lang go vfs)) (export @@ -36,6 +37,8 @@ make-cargo-workspace cargo-workspace? cargo-workspace-members cargo-workspace-exclude cargo-workspace-dependencies + cfg-values + parse-cargo-toml) (begin @@ -182,45 +185,28 @@ (cargo-workspace-exclude entry) (cargo-workspace-dependencies entry))) - ; TODO(puck): aaaa + (foreign-declare "#include \"cfgfetch_source.h\"") + (define cfgfetch-bin + (cdar + (call-rustc + (zfile (foreign-value "cfgfetch_source" nonnull-c-string)) '() + #:codegen-flags (cons "linker" (force linker)) + #:crate-type 'bin + #:crate-name "cfgfetch" + #:edition "2021" + #:emits '(#:link #t)))) + (define cfg-target "x86_64-unknown-linux-gnu") + (define (read-cfg-value port rest) + (define line (read-line port)) + (if (eof-object? line) + rest + (let* ((line (cfg-parse line))) + (read-cfg-value port (cons (cdr line) rest))))) + (define cfg-values - '(( "debug_assertions" . #f) - ( "fmt_debug" . "full") - ( "overflow_checks" . #f) - ( "panic" . "unwind") - ( "relocation_model" . "pic") - ( "target_abi" . "") - ( "target_arch" . "x86_64") - ( "target_endian" . "little") - ( "target_env" . "gnu") - ( "target_family" . "unix") - ( "target_feature" . "fxsr") - ( "target_feature" . "sse") - ( "target_feature" . "sse2") - ( "target_has_atomic" . #f) - ( "target_has_atomic" . "16") - ( "target_has_atomic" . "32") - ( "target_has_atomic" . "64") - ( "target_has_atomic" . "8") - ( "target_has_atomic" . "ptr") - ( "target_has_atomic_equal_alignment" . "16") - ( "target_has_atomic_equal_alignment" . "32") - ( "target_has_atomic_equal_alignment" . "64") - ( "target_has_atomic_equal_alignment" . "8") - ( "target_has_atomic_equal_alignment" . "ptr") - ( "target_has_atomic_load_store" . #f) - ( "target_has_atomic_load_store" . "16") - ( "target_has_atomic_load_store" . "32") - ( "target_has_atomic_load_store" . "64") - ( "target_has_atomic_load_store" . "8") - ( "target_has_atomic_load_store" . "ptr") - ( "target_os" . "linux") - ( "target_pointer_width" . "64") - ( "target_thread_local" . #f) - ( "target_vendor" . "unknown") - ( "ub_checks" . #f) - ( "unix" . #f))) + (let ((vals (cdar (store-path-for-ca-drv* "cfg-values" "x86_64-linux" #~(#$cfgfetch-bin) #~(("rustc" . ,(string-append #$rustc "/bin/rustc"))) '("out"))))) + (call-with-port (store-path-open vals) (lambda (p) (read-cfg-value p '()))))) (define (cratify-name name) ; NOTE! string-map _has_ to return a char. non-chars are mistreated and cause memory corruption.