Mercurial > crates > nonstick
comparison libpam-sys/libpam-sys-impls/build.rs @ 108:e97534be35e3
Make some proc macros for doing cfg-like stuff for PAM impls.
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Sat, 28 Jun 2025 00:34:45 -0400 |
parents | |
children | bb465393621f |
comparison
equal
deleted
inserted
replaced
107:49c6633f6fd2 | 108:e97534be35e3 |
---|---|
1 use strum::EnumString; | |
2 | |
3 fn main() { | |
4 let pam_impl = match option_env!("LIBPAMSYS_IMPL") { | |
5 // The default option: Guess what PAM impl we're using based on OS. | |
6 None => { | |
7 // Otherwise, guess what PAM impl we're using based on the OS. | |
8 if cfg!(target_os = "linux") { | |
9 PamImpl::LinuxPam | |
10 } else if cfg!(any( | |
11 target_os = "macos", | |
12 target_os = "freebsd", | |
13 target_os = "netbsd", | |
14 target_os = "dragonfly", | |
15 target_os = "openbsd" | |
16 )) { | |
17 PamImpl::OpenPam | |
18 } else if cfg!(any()) { | |
19 PamImpl::Illumos | |
20 } else { | |
21 PamImpl::MinimalOpenPam | |
22 } | |
23 } | |
24 Some("_detect") => { | |
25 // Detect which impl it is from system headers. | |
26 if header_exists("security/_pam_types.h") { | |
27 PamImpl::LinuxPam | |
28 } else if header_exists("security/openpam.h") { | |
29 PamImpl::OpenPam | |
30 } else if header_exists("security/pam_appl.h") { | |
31 // We figure we're *probably* on Illumos or something like that. | |
32 PamImpl::Illumos | |
33 } else { | |
34 // If all else fails, assume the bare minimum. | |
35 PamImpl::MinimalOpenPam | |
36 } | |
37 } | |
38 Some(other) => match PamImpl::try_from(other) { | |
39 Ok(i) => i, | |
40 Err(_) => panic!("unknown PAM implementation {other:?}") | |
41 } | |
42 }; | |
43 println!("cargo:rustc-env=LIBPAMSYS_IMPL={pam_impl:?}"); | |
44 } | |
45 | |
46 #[derive(Debug, EnumString)] | |
47 enum PamImpl { | |
48 Illumos, | |
49 LinuxPam, | |
50 OpenPam, | |
51 MinimalOpenPam, | |
52 } | |
53 | |
54 fn header_exists(header: &str) -> bool { | |
55 bindgen::Builder::default() | |
56 .blocklist_item(".*") | |
57 .header_contents("header.h", &format!("#include <{header}>")) | |
58 .generate() | |
59 .is_ok() | |
60 } |