From f1eabc75f19c20a9501218ae9a21226d97143079 Mon Sep 17 00:00:00 2001 From: zhangyao2022 Date: Tue, 6 Jun 2023 13:56:10 +0800 Subject: [PATCH] fix: adapt lower version libblkid --- exts/devmaster/Cargo.toml | 3 ++ exts/devmaster/build.rs | 19 +++++++++++ exts/devmaster/src/lib/builtin/blkid.rs | 5 ++- libs/basic/Cargo.toml | 1 + libs/basic/src/build_util.rs | 45 +++++++++++++++++++++++++ libs/basic/src/lib.rs | 1 + libs/blkid_rs/Cargo.toml | 3 ++ libs/blkid_rs/build.rs | 5 ++- libs/blkid_rs/src/lib.rs | 23 +++++++------ libs/blkid_rs/src/probe.rs | 9 +++-- 10 files changed, 100 insertions(+), 14 deletions(-) create mode 100644 exts/devmaster/build.rs create mode 100644 libs/basic/src/build_util.rs diff --git a/exts/devmaster/Cargo.toml b/exts/devmaster/Cargo.toml index b96a9ea0..708ca7db 100644 --- a/exts/devmaster/Cargo.toml +++ b/exts/devmaster/Cargo.toml @@ -42,3 +42,6 @@ shell-words = "1.1.0" sscanf = "0.4.0" serde = "1.0.130" confique = { version = "0.1.3", default-features = false, features = ['toml'] } + +[build-dependencies] +basic = { path = "../../libs/basic" } diff --git a/exts/devmaster/build.rs b/exts/devmaster/build.rs new file mode 100644 index 00000000..f0be411c --- /dev/null +++ b/exts/devmaster/build.rs @@ -0,0 +1,19 @@ +// Copyright (c) 2022 Huawei Technologies Co.,Ltd. All rights reserved. +// +// sysMaster is licensed under Mulan PSL v2. +// You can use this software according to the terms and conditions of the Mulan +// PSL v2. +// You may obtain a copy of Mulan PSL v2 at: +// http://license.coscl.org.cn/MulanPSL2 +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY +// KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +// See the Mulan PSL v2 for more details. +// + +//! +use basic::build_util; + +fn main() { + build_util::build_libblkid(); +} diff --git a/exts/devmaster/src/lib/builtin/blkid.rs b/exts/devmaster/src/lib/builtin/blkid.rs index a66bbb56..3e95cc48 100644 --- a/exts/devmaster/src/lib/builtin/blkid.rs +++ b/exts/devmaster/src/lib/builtin/blkid.rs @@ -23,6 +23,7 @@ use basic::gpt::GPT_XBOOTLDR; use basic::uuid::Uuid; use blkid_rs::BlkidFltr; use blkid_rs::BlkidPartition; +#[cfg(blkid = "libblkid_2_37")] use blkid_rs::BlkidProbPartsFlags; use blkid_rs::BlkidProbe; use blkid_rs::BlkidSublksFlags; @@ -66,6 +67,7 @@ impl Args { self.noraid } + #[cfg(blkid = "libblkid_2_37")] fn hint(&self) -> Option<&str> { if self.hint.is_empty() { None @@ -237,7 +239,7 @@ impl Blkid { return Ok(()); } } - + #[cfg(blkid = "libblkid_2_37")] if let Err(e) = probe.set_partitions_flags(BlkidProbPartsFlags::ENTRY_DETAILS) { log::warn!("set partitions flags error: {:?}", e); } @@ -418,6 +420,7 @@ impl Builtin for Blkid { .map_err(op_command_err!("filter superblock usage error"))?; } + #[cfg(blkid = "libblkid_2_37")] if let Some(hint) = args.hint() { probe .set_hint(hint, 0) diff --git a/libs/basic/Cargo.toml b/libs/basic/Cargo.toml index c52bdd04..64fbfba3 100644 --- a/libs/basic/Cargo.toml +++ b/libs/basic/Cargo.toml @@ -19,6 +19,7 @@ pathdiff = "0.2.1" caps = "0.5.5" lazy_static = "1.4.0" bitflags = "1.3.2" +pkg-config = "0.3" [dev-dependencies] libtests = { path = "../libtests" } diff --git a/libs/basic/src/build_util.rs b/libs/basic/src/build_util.rs new file mode 100644 index 00000000..6e3e2ced --- /dev/null +++ b/libs/basic/src/build_util.rs @@ -0,0 +1,45 @@ +// Copyright (c) 2022 Huawei Technologies Co.,Ltd. All rights reserved. +// +// sysMaster is licensed under Mulan PSL v2. +// You can use this software according to the terms and conditions of the Mulan +// PSL v2. +// You may obtain a copy of Mulan PSL v2 at: +// http://license.coscl.org.cn/MulanPSL2 +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY +// KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +// See the Mulan PSL v2 for more details. +// + +//! utils for build.rs +const BLKID: &str = "blkid"; +const BLKID_MIN_VER: &str = "2.35.2"; + +/// Generate cfg blkid version information +pub fn build_libblkid() { + let libblkid = match pkg_config::Config::new() + .atleast_version(BLKID_MIN_VER) + .probe(BLKID) + { + Ok(lib) => lib, + Err(_) => { + println!("cargo:rustc-cfg={}=\"libblkid_2_37\"", BLKID); + return; + } + }; + + // Get MIN info + let min_version = libblkid + .version + .split('.') + .nth(1) + .expect("Failed to get MIN info of version"); + + if min_version + .parse::() + .expect("Failed to parse MIN info of version") + >= 37 + { + println!("cargo:rustc-cfg={}=\"libblkid_2_37\"", BLKID); + } +} diff --git a/libs/basic/src/lib.rs b/libs/basic/src/lib.rs index 6ff62a6f..8678b584 100644 --- a/libs/basic/src/lib.rs +++ b/libs/basic/src/lib.rs @@ -11,6 +11,7 @@ // See the Mulan PSL v2 for more details. //! +pub mod build_util; pub mod condition; pub mod conf_parser; pub mod device; diff --git a/libs/blkid_rs/Cargo.toml b/libs/blkid_rs/Cargo.toml index aa766bfe..c806b415 100644 --- a/libs/blkid_rs/Cargo.toml +++ b/libs/blkid_rs/Cargo.toml @@ -8,6 +8,9 @@ default_features = false features = ["runtime"] version = "0.63.0" +[build-dependencies] +basic = { path = "../basic" } + [dependencies] libc = "0.2.*" bitflags = "1.3.2" diff --git a/libs/blkid_rs/build.rs b/libs/blkid_rs/build.rs index f9ab24a6..e04c48e7 100644 --- a/libs/blkid_rs/build.rs +++ b/libs/blkid_rs/build.rs @@ -13,6 +13,7 @@ //! generate libblkid.rs //! +use basic::build_util; use bindgen::Builder; use std::{env, path::PathBuf}; @@ -28,5 +29,7 @@ fn main() { let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("libblkid.rs"); libblkid_gen .write_to_file(out_path) - .expect("Couldn't write libblkid_gen"); + .expect("Couldn't write libblkid.rs"); + + build_util::build_libblkid(); } diff --git a/libs/blkid_rs/src/lib.rs b/libs/blkid_rs/src/lib.rs index 42f0a58d..a438a9e1 100644 --- a/libs/blkid_rs/src/lib.rs +++ b/libs/blkid_rs/src/lib.rs @@ -68,16 +68,6 @@ bitflags! { const ONLYIN = libblkid::BLKID_FLTR_ONLYIN as i32; } - /// BlkidProbPartsFlags - pub struct BlkidProbPartsFlags: i32 { - /// force gpt - const FORCE_GPT = libblkid::BLKID_PARTS_FORCE_GPT as i32; - /// get entry details info - const ENTRY_DETAILS= libblkid::BLKID_PARTS_ENTRY_DETAILS as i32; - /// magic - const MAGIC = libblkid::BLKID_PARTS_MAGIC as i32; - } - /// BlkidUsageFlags pub struct BlkidUsageFlags: i32 { /// filesystemd @@ -91,6 +81,19 @@ bitflags! { } } +#[cfg(blkid = "libblkid_2_37")] +bitflags! { + /// BlkidProbPartsFlags + pub struct BlkidProbPartsFlags: i32 { + /// force gpt + const FORCE_GPT = libblkid::BLKID_PARTS_FORCE_GPT as i32; + /// get entry details info + const ENTRY_DETAILS= libblkid::BLKID_PARTS_ENTRY_DETAILS as i32; + /// magic + const MAGIC = libblkid::BLKID_PARTS_MAGIC as i32; + } +} + // Shared code for encoding methods fn string_shared(string: &str, closure: F) -> Result where diff --git a/libs/blkid_rs/src/probe.rs b/libs/blkid_rs/src/probe.rs index c76efd02..1e50a102 100644 --- a/libs/blkid_rs/src/probe.rs +++ b/libs/blkid_rs/src/probe.rs @@ -9,14 +9,17 @@ // KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. // See the Mulan PSL v2 for more details. +// use std::{ffi::CString, os::unix::io::RawFd, ptr}; use crate::{ - errno_ret, libblkid, partition::BlkidPartlist, BlkidFltr, BlkidProbPartsFlags, - BlkidSublksFlags, BlkidUsageFlags, + errno_ret, libblkid, partition::BlkidPartlist, BlkidFltr, BlkidSublksFlags, BlkidUsageFlags, }; +#[cfg(blkid = "libblkid_2_37")] +use crate::BlkidProbPartsFlags; + type Result = std::result::Result; /// A structure for probing block devices. @@ -177,6 +180,7 @@ impl BlkidProbe { } /// Set hint + #[cfg(blkid = "libblkid_2_37")] pub fn set_hint(&mut self, name: &str, value: u64) -> Result<()> { let name_cstring = CString::new(name).unwrap(); errno_ret!(unsafe { libblkid::blkid_probe_set_hint(self.0, name_cstring.as_ptr(), value) }); @@ -184,6 +188,7 @@ impl BlkidProbe { } ///Set partitions flags + #[cfg(blkid = "libblkid_2_37")] pub fn set_partitions_flags(&mut self, flags: BlkidProbPartsFlags) -> Result<()> { errno_ret!(unsafe { libblkid::blkid_probe_set_partitions_flags(self.0, flags.bits()) }); Ok(()) -- Gitee