Skip to main content

bpf_linker/
lib.rs

1// The following macros are adapted from from https://github.com/TheDan64/inkwell,
2// licensed under Apache-2.0.
3// Original source: https://github.com/TheDan64/inkwell/blob/0b0a2c0b2eb5e458767093c2ab8c56cbd05ec4c9/src/lib.rs#L85-L112
4
5#![expect(unused_crate_dependencies, reason = "used in bin")]
6
7#[cfg(any(
8    feature = "rust-llvm-20",
9    feature = "rust-llvm-21",
10    feature = "rust-llvm-22"
11))]
12use aya_rustc_llvm_proxy as _;
13
14macro_rules! assert_unique_features {
15    () => {};
16    ($first:tt $(,$rest:tt)*) => {
17        $(
18            #[cfg(all(feature = $first, feature = $rest))]
19            compile_error!(concat!("features \"", $first, "\" and \"", $rest, "\" cannot be used together"));
20        )*
21        assert_unique_features!($($rest),*);
22    }
23}
24
25macro_rules! assert_used_features {
26    ($($all:tt),*) => {
27        #[cfg(not(any($(feature = $all),*)))]
28        compile_error!(concat!("One of the LLVM feature flags must be provided: ", $($all, " "),*));
29    }
30}
31
32macro_rules! assert_unique_used_features {
33    ($($all:tt),*) => {
34        assert_unique_features!($($all),*);
35        assert_used_features!($($all),*);
36    }
37}
38
39assert_unique_used_features! {
40    "llvm-20",
41    "llvm-21",
42    "llvm-22"
43}
44
45#[cfg(feature = "llvm-20")]
46pub extern crate llvm_sys_20 as llvm_sys;
47#[cfg(feature = "llvm-21")]
48pub extern crate llvm_sys_21 as llvm_sys;
49#[cfg(feature = "llvm-22")]
50pub extern crate llvm_sys_22 as llvm_sys;
51
52mod linker;
53mod llvm;
54
55pub use linker::*;