]> Repositorios git - scryer-prolog.git/commitdiff
cleanup and fix miri & cross-compile
authorBennet Bleßmann <[email protected]>
Tue, 21 Jan 2025 18:20:33 +0000 (19:20 +0100)
committerBennet Bleßmann <[email protected]>
Fri, 1 Aug 2025 16:22:13 +0000 (18:22 +0200)
Cargo.lock
Cargo.toml
tests/scryer/ffi.rs

index 0feaf573ba92d0122b57ceec0f608b44816e0dd9..b32352a35880ccb969091336dc977300061dc66e 100644 (file)
@@ -591,6 +591,12 @@ dependencies = [
  "windows-sys 0.59.0",
 ]
 
+[[package]]
+name = "current_platform"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a74858bcfe44b22016cb49337d7b6f04618c58e5dbfdef61b06b8c434324a0bc"
+
 [[package]]
 name = "dashu"
 version = "0.4.2"
@@ -2689,6 +2695,7 @@ dependencies = [
  "crossterm",
  "crrl",
  "ctrlc",
+ "current_platform",
  "dashu",
  "derive_more",
  "dirs-next",
index 3087a3a244717d7d0cbda9f772b5d82017841b9a..58a330f59cd327e9d08471c6e882d073b4208944 100644 (file)
@@ -119,6 +119,7 @@ js-sys = "0.3"
 ouroboros = "0.18"
 
 [dev-dependencies]
+current_platform = "0.2.0"
 maplit = "1.0.2"
 serial_test = "3.1.1"
 
index 33beec1ff064caf283c93e90944c43925762fac4..95c465c01a422c47f3bf8e6b90a4a33e7c2942f5 100644 (file)
@@ -1,28 +1,27 @@
 use std::{
     env::consts::{DLL_PREFIX, DLL_SUFFIX},
     io::Write,
-    path::Path,
+    path::{Path, PathBuf},
     process::Stdio,
 };
 
 use crate::helper::load_module_test;
 
-#[test]
-fn ffi_f64_nan() {
-    let tmp_dir: &Path = env!("CARGO_TARGET_TMPDIR").as_ref();
-    println!("CARGO_TARGET_TMPDIR: {tmp_dir:?}");
+use current_platform::CURRENT_PLATFORM;
 
-    // technically UB as tests are by default multi-threaded,
-    // but there is currently no other easy way to get the dynamic library file path as an input into a load_module_test test
-    std::env::set_var(
-        "ffi_f64_nan_LIB",
-        tmp_dir.join(format!("{DLL_PREFIX}ffi_f64_nan{DLL_SUFFIX}")),
-    );
+const TMP_DIR: &'static str = env!("CARGO_TARGET_TMPDIR");
+
+// each test is building its own library so that they can easier run in parallel,
+// i.e. don't need to wait for a large dynamic library to compile,
+// also rusts test infra currently has no functionallity for a setup/befor step
+fn build_dynamic_library(name: &str, src: &str) -> PathBuf {
+    let tmp_dir: &Path = TMP_DIR.as_ref();
 
     let mut child = std::process::Command::new("rustc")
         .stdin(Stdio::piped())
+        .arg(format!("--target={CURRENT_PLATFORM}"))
         .arg("--crate-type=dylib")
-        .arg("--crate-name=ffi_f64_nan")
+        .arg(format!("--crate-name={name}"))
         .arg("--out-dir")
         .arg(tmp_dir)
         .arg("-")
@@ -33,19 +32,31 @@ fn ffi_f64_nan() {
         .stdin
         .take()
         .unwrap()
-        .write_all(
-            r##"
-        #[no_mangle]
-        extern "C" fn ffi_f64_nan() -> f64 {
-            f64::NAN
-        }
-    "##
-            .as_bytes(),
-        )
+        .write_all(src.as_bytes())
         .unwrap();
 
     assert!(child.wait().unwrap().success());
 
+    tmp_dir.join(format!("{DLL_PREFIX}{name}{DLL_SUFFIX}"))
+}
+
+#[test]
+#[cfg_attr(miri, ignore = "ffi")]
+fn ffi_f64_nan() {
+    let dynlib_path = build_dynamic_library(
+        "ffi_f64_nan",
+        r##"
+                #[no_mangle]
+                extern "C" fn ffi_f64_nan() -> f64 {
+                    f64::NAN
+                }
+            "##,
+    );
+
+    // technically UB as tests are by default multi-threaded,
+    // but there is currently no other easy way to get the dynamic library file path as an input into a load_module_test test
+    std::env::set_var("ffi_f64_nan_LIB", dynlib_path);
+
     load_module_test(
         "tests-pl/ffi_f64_nan.pl",
         "   error(evaluation_error(undefined),round/1).\n",
@@ -53,48 +64,26 @@ fn ffi_f64_nan() {
 }
 
 #[test]
+#[cfg_attr(miri, ignore = "ffi")]
 fn ffi_f64_minus_zero() {
-    let tmp_dir: &Path = env!("CARGO_TARGET_TMPDIR").as_ref();
-    println!("CARGO_TARGET_TMPDIR: {tmp_dir:?}");
+    let dynlib_path = build_dynamic_library(
+        "ffi_f64_minus_zero",
+        r##"
+                #[no_mangle]
+                extern "C" fn ffi_f64_minus_zero() -> f64 {
+                    -0.0
+                }
 
-    // technically UB as tests are by default multi-threaded,
-    // but there is currently no other easy way to get the dynamic library file path as an input into a load_module_test test
-    std::env::set_var(
-        "ffi_f64_minus_zero_LIB",
-        tmp_dir.join(format!("{DLL_PREFIX}ffi_f64_minus_zero{DLL_SUFFIX}")),
+                #[no_mangle]
+                extern "C" fn signum(f: f64) -> f64 {
+                    f.signum()
+                }
+            "##,
     );
 
-    let mut child = std::process::Command::new("rustc")
-        .stdin(Stdio::piped())
-        .arg("--crate-type=dylib")
-        .arg("--crate-name=ffi_f64_minus_zero")
-        .arg("--out-dir")
-        .arg(tmp_dir)
-        .arg("-")
-        .spawn()
-        .unwrap();
-
-    child
-        .stdin
-        .take()
-        .unwrap()
-        .write_all(
-            r##"
-        #[no_mangle]
-        extern "C" fn ffi_f64_minus_zero() -> f64 {
-            -0.0
-        }
-
-        #[no_mangle]
-        extern "C" fn signum(f: f64) -> f64 {
-            f.signum()
-        }
-    "##
-            .as_bytes(),
-        )
-        .unwrap();
-
-    assert!(child.wait().unwrap().success());
+    // technically UB as tests are by default multi-threaded,
+    // but there is currently no other easy way to get the dynamic library file path as an input into a load_module_test test
+    std::env::set_var("ffi_f64_minus_zero_LIB", dynlib_path);
 
     // note: ouput is currently wrong correct would be 1.0,1.0
     load_module_test("tests-pl/ffi_f64_minus_zero.pl", "-1.0,1.0");