From fdf1f09d6f43e7aa80a43fa117c26d535106f936 Mon Sep 17 00:00:00 2001 From: John Turner Date: Sat, 15 Nov 2025 21:08:39 +0000 Subject: [PATCH] add meson support --- .gitignore | 6 +- meson.build | 20 +++ subprojects/thiserror/build.rs | 195 -------------------------- subprojects/thiserror/impl/src/lib.rs | 7 +- subprojects/thiserror/meson.build | 31 ++++ subprojects/thiserror/src/lib.rs | 6 +- tests/repo.rs | 10 -- 7 files changed, 63 insertions(+), 212 deletions(-) create mode 100644 meson.build delete mode 100644 subprojects/thiserror/build.rs create mode 100644 subprojects/thiserror/meson.build delete mode 100644 tests/repo.rs diff --git a/.gitignore b/.gitignore index c41cc9e..a822699 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ -/target \ No newline at end of file +/target +/subprojects +!/subprojects +/subprojects/* +!/subprojects/thiserror \ No newline at end of file diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..3bf81f0 --- /dev/null +++ b/meson.build @@ -0,0 +1,20 @@ +project( + 'gentoo-utils', + 'rust', + meson_version: '>=1.9.1', + default_options: {'rust_std': '2024', 'rust_nightly': 'enabled'}, +) + +rust = import('rust') + +mon = dependency('mon-0.1-rs') +get = dependency('get-0.1-rs') +itertools = dependency('itertools-0.14-rs') +thiserror = subproject('thiserror').get_variable('thiserror') + +gentoo_utils = static_library( + 'gentoo_utils', + 'src/lib.rs', + dependencies: [mon, get, itertools], + link_with: [thiserror] +) diff --git a/subprojects/thiserror/build.rs b/subprojects/thiserror/build.rs deleted file mode 100644 index d1558fb..0000000 --- a/subprojects/thiserror/build.rs +++ /dev/null @@ -1,195 +0,0 @@ -use std::env; -use std::ffi::OsString; -use std::fs; -use std::io::ErrorKind; -use std::iter; -use std::path::{Path, PathBuf}; -use std::process::{self, Command, Stdio}; -use std::str; - -const PRIVATE: &str = "\ -#[doc(hidden)] -pub mod __private$$ { - #[doc(hidden)] - pub use crate::private::*; -} -"; - -fn main() { - println!("cargo:rerun-if-changed=build/probe.rs"); - - println!("cargo:rustc-check-cfg=cfg(error_generic_member_access)"); - println!("cargo:rustc-check-cfg=cfg(thiserror_nightly_testing)"); - println!("cargo:rustc-check-cfg=cfg(thiserror_no_backtrace_type)"); - - let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap()); - let patch_version = env::var("CARGO_PKG_VERSION_PATCH").unwrap(); - let module = PRIVATE.replace("$$", &patch_version); - fs::write(out_dir.join("private.rs"), module).unwrap(); - - let error_generic_member_access; - let consider_rustc_bootstrap; - if compile_probe(false) { - // This is a nightly or dev compiler, so it supports unstable features - // regardless of RUSTC_BOOTSTRAP. No need to rerun build script if - // RUSTC_BOOTSTRAP is changed. - error_generic_member_access = true; - consider_rustc_bootstrap = false; - } else if let Some(rustc_bootstrap) = env::var_os("RUSTC_BOOTSTRAP") { - if compile_probe(true) { - // This is a stable or beta compiler for which the user has set - // RUSTC_BOOTSTRAP to turn on unstable features. Rerun build script - // if they change it. - error_generic_member_access = true; - consider_rustc_bootstrap = true; - } else if rustc_bootstrap == "1" { - // This compiler does not support the generic member access API in - // the form that thiserror expects. No need to pay attention to - // RUSTC_BOOTSTRAP. - error_generic_member_access = false; - consider_rustc_bootstrap = false; - } else { - // This is a stable or beta compiler for which RUSTC_BOOTSTRAP is - // set to restrict the use of unstable features by this crate. - error_generic_member_access = false; - consider_rustc_bootstrap = true; - } - } else { - // Without RUSTC_BOOTSTRAP, this compiler does not support the generic - // member access API in the form that thiserror expects, but try again - // if the user turns on unstable features. - error_generic_member_access = false; - consider_rustc_bootstrap = true; - } - - if error_generic_member_access { - println!("cargo:rustc-cfg=error_generic_member_access"); - } - - if consider_rustc_bootstrap { - println!("cargo:rerun-if-env-changed=RUSTC_BOOTSTRAP"); - } - - // core::error::Error stabilized in Rust 1.81 - // https://blog.rust-lang.org/2024/09/05/Rust-1.81.0.html#coreerrorerror - let rustc = rustc_minor_version(); - if cfg!(not(feature = "std")) && rustc.map_or(false, |rustc| rustc < 81) { - println!("cargo:rustc-cfg=feature=\"std\""); - } - - let Some(rustc) = rustc else { - return; - }; - - // std::backtrace::Backtrace stabilized in Rust 1.65 - // https://blog.rust-lang.org/2022/11/03/Rust-1.65.0.html#stabilized-apis - if rustc < 65 { - println!("cargo:rustc-cfg=thiserror_no_backtrace_type"); - } -} - -fn compile_probe(rustc_bootstrap: bool) -> bool { - if env::var_os("RUSTC_STAGE").is_some() { - // We are running inside rustc bootstrap. This is a highly non-standard - // environment with issues such as: - // - // https://github.com/rust-lang/cargo/issues/11138 - // https://github.com/rust-lang/rust/issues/114839 - // - // Let's just not use nightly features here. - return false; - } - - let rustc = cargo_env_var("RUSTC"); - let out_dir = cargo_env_var("OUT_DIR"); - let out_subdir = Path::new(&out_dir).join("probe"); - let probefile = Path::new("build").join("probe.rs"); - - if let Err(err) = fs::create_dir(&out_subdir) { - if err.kind() != ErrorKind::AlreadyExists { - eprintln!("Failed to create {}: {}", out_subdir.display(), err); - process::exit(1); - } - } - - let rustc_wrapper = env::var_os("RUSTC_WRAPPER").filter(|wrapper| !wrapper.is_empty()); - let rustc_workspace_wrapper = - env::var_os("RUSTC_WORKSPACE_WRAPPER").filter(|wrapper| !wrapper.is_empty()); - let mut rustc = rustc_wrapper - .into_iter() - .chain(rustc_workspace_wrapper) - .chain(iter::once(rustc)); - let mut cmd = Command::new(rustc.next().unwrap()); - cmd.args(rustc); - - if !rustc_bootstrap { - cmd.env_remove("RUSTC_BOOTSTRAP"); - } - - cmd.stderr(Stdio::null()) - .arg("--edition=2018") - .arg("--crate-name=thiserror") - .arg("--crate-type=lib") - .arg("--cap-lints=allow") - .arg("--emit=dep-info,metadata") - .arg("--out-dir") - .arg(&out_subdir) - .arg(probefile); - - if let Some(target) = env::var_os("TARGET") { - cmd.arg("--target").arg(target); - } - - // If Cargo wants to set RUSTFLAGS, use that. - if let Ok(rustflags) = env::var("CARGO_ENCODED_RUSTFLAGS") { - if !rustflags.is_empty() { - for arg in rustflags.split('\x1f') { - cmd.arg(arg); - } - } - } - - let success = match cmd.status() { - Ok(status) => status.success(), - Err(_) => false, - }; - - // Clean up to avoid leaving nondeterministic absolute paths in the dep-info - // file in OUT_DIR, which causes nonreproducible builds in build systems - // that treat the entire OUT_DIR as an artifact. - if let Err(err) = fs::remove_dir_all(&out_subdir) { - // libc::ENOTEMPTY - // Some filesystems (NFSv3) have timing issues under load where '.nfs*' - // dummy files can continue to get created for a short period after the - // probe command completes, breaking remove_dir_all. - // To be replaced with ErrorKind::DirectoryNotEmpty (Rust 1.83+). - const ENOTEMPTY: i32 = 39; - - if !(err.kind() == ErrorKind::NotFound - || (cfg!(target_os = "linux") && err.raw_os_error() == Some(ENOTEMPTY))) - { - eprintln!("Failed to clean up {}: {}", out_subdir.display(), err); - process::exit(1); - } - } - - success -} - -fn rustc_minor_version() -> Option { - let rustc = cargo_env_var("RUSTC"); - let output = Command::new(rustc).arg("--version").output().ok()?; - let version = str::from_utf8(&output.stdout).ok()?; - let mut pieces = version.split('.'); - if pieces.next() != Some("rustc 1") { - return None; - } - pieces.next()?.parse().ok() -} - -fn cargo_env_var(key: &str) -> OsString { - env::var_os(key).unwrap_or_else(|| { - eprintln!("Environment variable ${key} is not set during execution of build script"); - process::exit(1); - }) -} diff --git a/subprojects/thiserror/impl/src/lib.rs b/subprojects/thiserror/impl/src/lib.rs index 25890f2..2ff054b 100644 --- a/subprojects/thiserror/impl/src/lib.rs +++ b/subprojects/thiserror/impl/src/lib.rs @@ -34,7 +34,7 @@ mod valid; use proc_macro::TokenStream; use proc_macro2::{Ident, Span}; use quote::{ToTokens, TokenStreamExt as _}; -use syn::{parse_macro_input, DeriveInput}; +use syn::{DeriveInput, parse_macro_input}; #[proc_macro_derive(Error, attributes(backtrace, error, from, source))] pub fn derive_error(input: TokenStream) -> TokenStream { @@ -47,9 +47,6 @@ struct private; impl ToTokens for private { fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { - tokens.append(Ident::new( - concat!("__private", env!("CARGO_PKG_VERSION_PATCH")), - Span::call_site(), - )); + tokens.append(Ident::new(concat!("__private"), Span::call_site())); } } diff --git a/subprojects/thiserror/meson.build b/subprojects/thiserror/meson.build new file mode 100644 index 0000000..55d2fb3 --- /dev/null +++ b/subprojects/thiserror/meson.build @@ -0,0 +1,31 @@ +project( + 'thiserror', + 'rust', + version: '2.0.17', + meson_version: '>=1.9.1', + default_options: { + 'rust_std': '2024', + 'rust_nightly': 'enabled', + 'rust_edition': 2024, + }, +) + +rust = import('rust') + +syn = dependency('syn-2-rs') +proc_macro2 = dependency('proc-macro2-1-rs') +quote = dependency('quote-1-rs') + + +thiserror_proc_macro = rust.proc_macro( + 'thiserror_impl', + 'impl/src/lib.rs', + dependencies: [syn, proc_macro2, quote], +) + +thiserror = static_library( + 'thiserror', + 'src/lib.rs', + rust_args: ['--cfg', 'feature="std"'], + link_with: [thiserror_proc_macro], +) diff --git a/subprojects/thiserror/src/lib.rs b/subprojects/thiserror/src/lib.rs index 155272d..944960e 100644 --- a/subprojects/thiserror/src/lib.rs +++ b/subprojects/thiserror/src/lib.rs @@ -288,4 +288,8 @@ pub use thiserror_impl::*; mod private; -include!(concat!(env!("OUT_DIR"), "/private.rs")); +#[doc(hidden)] +pub mod __private { + #[doc(hidden)] + pub use crate::private::*; +} diff --git a/tests/repo.rs b/tests/repo.rs deleted file mode 100644 index 77a29b2..0000000 --- a/tests/repo.rs +++ /dev/null @@ -1,10 +0,0 @@ -use gentoo_utils::ebuild::repo::Repo; - -#[test] -fn test_read_repo() { - let repo = Repo::new("/var/db/repos/gentoo"); - - for category in repo.categories().unwrap().map(|cat| cat.unwrap()) { - for _ in category.ebuilds().unwrap().map(|ebuild| ebuild.unwrap()) {} - } -}