Merge pull request #96 from alessandrod/cross

Fix bindings for archs other than x86
pull/97/head
Alessandro Decina 3 years ago committed by GitHub
commit 8f20ead0c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -20,6 +20,11 @@ jobs:
- uses: Swatinem/rust-cache@v1 - uses: Swatinem/rust-cache@v1
- name: Install headers
run: |
apt -y update
apt -y install libc6-dev libc6-dev-{aarch64,armel}-cross
- name: Run codegen - name: Run codegen
run: | run: |
cargo xtask codegen --libbpf-dir ./libbpf cargo xtask codegen --libbpf-dir ./libbpf

@ -157,6 +157,24 @@ fn codegen_bindings(opts: &Options) -> Result<(), anyhow::Error> {
for arch in Architecture::supported() { for arch in Architecture::supported() {
let mut bindgen = builder(); let mut bindgen = builder();
// Set target triple. This will set the right flags (which you can see
// running clang -target=X -E - -dM </dev/null)
let target = match arch {
Architecture::X86_64 => "x86_64-unknown-linux-gnu",
Architecture::ARMv7 => "armv7-unknown-linux-gnu",
Architecture::AArch64 => "aarch64-unknown-linux-gnu",
};
bindgen = bindgen.clang_args(&["-target", target]);
// Set the sysroot. This is needed to ensure that the correct arch
// specific headers are imported.
let sysroot = match arch {
Architecture::X86_64 => &opts.x86_64_sysroot,
Architecture::ARMv7 => &opts.armv7_sysroot,
Architecture::AArch64 => &opts.aarch64_sysroot,
};
bindgen = bindgen.clang_args(&["-I", &*sysroot.to_string_lossy()]);
for x in &types { for x in &types {
bindgen = bindgen.allowlist_type(x); bindgen = bindgen.allowlist_type(x);
} }
@ -164,19 +182,6 @@ fn codegen_bindings(opts: &Options) -> Result<(), anyhow::Error> {
bindgen = bindgen.allowlist_var(x).constified_enum("BTF_KIND_.*"); bindgen = bindgen.allowlist_var(x).constified_enum("BTF_KIND_.*");
} }
// FIXME: this stuff is probably debian/ubuntu specific
match arch {
Architecture::X86_64 => {
bindgen = bindgen.clang_args(&["-I", "/usr/include/x86_64-linux-gnu"]);
}
Architecture::ARMv7 => {
bindgen = bindgen.clang_args(&["-I", "/usr/arm-linux-gnueabi/include"]);
}
Architecture::AArch64 => {
bindgen = bindgen.clang_args(&["-I", "/usr/aarch64-linux-gnu/include"]);
}
};
for x in &types { for x in &types {
bindgen = bindgen.allowlist_type(x); bindgen = bindgen.allowlist_type(x);
} }

@ -70,9 +70,27 @@ pub fn codegen(opts: &Options) -> Result<(), anyhow::Error> {
}; };
for arch in Architecture::supported() { for arch in Architecture::supported() {
let generated = dir.join("src").join(arch.to_string()); let mut bindgen = builder();
// Set target triple. This will set the right flags (which you can see
// running clang -target=X -E - -dM </dev/null)
let target = match arch {
Architecture::X86_64 => "x86_64-unknown-linux-gnu",
Architecture::ARMv7 => "armv7-unknown-linux-gnu",
Architecture::AArch64 => "aarch64-unknown-linux-gnu",
};
bindgen = bindgen.clang_args(&["-target", target]);
// Set the sysroot. This is needed to ensure that the correct arch
// specific headers are imported.
let sysroot = match arch {
Architecture::X86_64 => &opts.x86_64_sysroot,
Architecture::ARMv7 => &opts.armv7_sysroot,
Architecture::AArch64 => &opts.aarch64_sysroot,
};
bindgen = bindgen.clang_args(&["-I", &*sysroot.to_string_lossy()]);
let bindings = builder() let bindings = bindgen
.generate() .generate()
.map_err(|_| anyhow!("bindgen failed"))? .map_err(|_| anyhow!("bindgen failed"))?
.to_string(); .to_string();
@ -84,6 +102,7 @@ pub fn codegen(opts: &Options) -> Result<(), anyhow::Error> {
tree.items[index] = Item::Verbatim(TokenStream::new()) tree.items[index] = Item::Verbatim(TokenStream::new())
} }
let generated = dir.join("src").join(arch.to_string());
// write the bindings, with the original helpers removed // write the bindings, with the original helpers removed
write_to_file_fmt( write_to_file_fmt(
&generated.join("bindings.rs"), &generated.join("bindings.rs"),

@ -53,6 +53,17 @@ pub struct Options {
#[structopt(long)] #[structopt(long)]
libbpf_dir: PathBuf, libbpf_dir: PathBuf,
// sysroot options. Default to ubuntu headers installed by the
// libc6-dev-{arm64,armel}-cross packages.
#[structopt(long, default_value = "/usr/include/x86_64-linux-gnu")]
x86_64_sysroot: PathBuf,
#[structopt(long, default_value = "/usr/aarch64-linux-gnu/include")]
aarch64_sysroot: PathBuf,
#[structopt(long, default_value = "/usr/arm-linux-gnueabi/include")]
armv7_sysroot: PathBuf,
#[structopt(subcommand)] #[structopt(subcommand)]
command: Option<Command>, command: Option<Command>,
} }

Loading…
Cancel
Save