From: Bennet Bleßmann Date: Tue, 21 Jan 2025 18:20:33 +0000 (+0100) Subject: cleanup and fix miri & cross-compile X-Git-Tag: v0.10.0~29^2~19 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=7227e1d97c86a2f1e1474f1d67c197ed18b6eea3;p=scryer-prolog.git cleanup and fix miri & cross-compile --- diff --git a/Cargo.lock b/Cargo.lock index 0feaf573..b32352a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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", diff --git a/Cargo.toml b/Cargo.toml index 3087a3a2..58a330f5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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" diff --git a/tests/scryer/ffi.rs b/tests/scryer/ffi.rs index 33beec1f..95c465c0 100644 --- a/tests/scryer/ffi.rs +++ b/tests/scryer/ffi.rs @@ -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");