From ee457520068834a965603f26ff85d40511cc6928 Mon Sep 17 00:00:00 2001 From: Tamir Duberstein Date: Thu, 10 Oct 2024 11:23:50 -0400 Subject: [PATCH] Move dependencies to workspace Add "{{project-name}}-ebpf" to workspace. Update various cargo configs to match main aya repo. --- .cargo/rust-analyzer.toml | 2 - Cargo.toml | 34 ++++++++++- test.sh | 6 +- xtask/Cargo.toml | 4 +- xtask/src/build.rs | 43 +++++++------- xtask/src/build_ebpf.rs | 57 ++++++++++--------- {{project-name}}-common/Cargo.toml | 2 +- {{project-name}}-ebpf/.cargo/config.toml | 10 +++- .../.cargo/rust-analyzer.toml | 3 - {{project-name}}-ebpf/.helix/config.toml | 2 - {{project-name}}-ebpf/Cargo.toml | 24 +------- {{project-name}}-ebpf/rust-toolchain.toml | 11 ---- {{project-name}}-ebpf/src/main.rs | 5 +- {{project-name}}/Cargo.toml | 21 +++---- 14 files changed, 114 insertions(+), 110 deletions(-) delete mode 100644 .cargo/rust-analyzer.toml delete mode 100644 {{project-name}}-ebpf/.cargo/rust-analyzer.toml delete mode 100644 {{project-name}}-ebpf/.helix/config.toml diff --git a/.cargo/rust-analyzer.toml b/.cargo/rust-analyzer.toml deleted file mode 100644 index deae97e..0000000 --- a/.cargo/rust-analyzer.toml +++ /dev/null @@ -1,2 +0,0 @@ -[rust-analyzer] -linkedProjects = ["Cargo.toml", "{{project-name}}-ebpf/Cargo.toml"] diff --git a/Cargo.toml b/Cargo.toml index c03af9e..b411146 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,35 @@ [workspace] resolver = "2" -members = ["xtask", "{{project-name}}", "{{project-name}}-common"] +members = ["xtask", "{{project-name}}", "{{project-name}}-common", "{{project-name}}-ebpf"] +default-members = ["xtask", "{{project-name}}", "{{project-name}}-common"] + +[workspace.dependencies] +aya = { version = "0.13.0", default-features = false } +aya-ebpf = { version = "0.1.1", default-features = false } +aya-log = { version = "0.2.1", default-features = false } +aya-log-ebpf = { version = "0.1.1", default-features = false } + +anyhow = { version = "1", default-features = false } +# `std` feature is currently required to build `clap`. +# +# See https://github.com/clap-rs/clap/blob/61f5ee5/clap_builder/src/lib.rs#L15. +clap = { version = "4.5.20", default-features = false, features = ["std"] } +env_logger = { version = "0.11.5", default-features = false } +libc = { version = "0.2.159", default-features = false } +log = { version = "0.4.22", default-features = false } +tokio = { version = "1.40.0", default-features = false } + +[profile.dev] +opt-level = 3 +debug = false +overflow-checks = false +lto = true +panic = "abort" +incremental = false +codegen-units = 1 +rpath = false + +[profile.release] +lto = true +panic = "abort" +codegen-units = 1 diff --git a/test.sh b/test.sh index b5dbaae..32aea76 100755 --- a/test.sh +++ b/test.sh @@ -34,7 +34,7 @@ case "$PROG_TYPE" in ADDITIONAL_ARGS="-d tracepoint_name=sys_enter" ;; "sk_msg") - ADDITIONAL_ARGS="-d sock_map=TEST" + ADDITIONAL_ARGS="-d sock_map=SOCK_MAP" ;; "tp_btf") ADDITIONAL_ARGS="-d tracepoint_name=net_dev_queue" @@ -51,7 +51,7 @@ esac cargo generate --path "${TEMPLATE_DIR}" -n test -d program_type="${PROG_TYPE}" ${ADDITIONAL_ARGS} pushd test -cargo xtask build-ebpf -cargo build +cargo xtask build +cargo xtask build --release popd exit 0 diff --git a/xtask/Cargo.toml b/xtask/Cargo.toml index c4dea5d..ed6bada 100644 --- a/xtask/Cargo.toml +++ b/xtask/Cargo.toml @@ -4,5 +4,5 @@ version = "0.1.0" edition = "2021" [dependencies] -anyhow = "1" -clap = { version = "4.1", features = ["derive"] } +anyhow = { workspace = true } +clap = { workspace = true, default-features = true, features = ["derive"] } diff --git a/xtask/src/build.rs b/xtask/src/build.rs index ddeee44..04709d9 100644 --- a/xtask/src/build.rs +++ b/xtask/src/build.rs @@ -15,28 +15,27 @@ pub struct Options { pub release: bool, } -/// Build the project -fn build_project(opts: &Options) -> Result<(), anyhow::Error> { - let mut args = vec!["build"]; - if opts.release { - args.push("--release") - } - let status = Command::new("cargo") - .args(&args) - .status() - .expect("failed to build userspace"); - assert!(status.success()); - Ok(()) -} - -/// Build our ebpf program and the project +/// Build our ebpf program and the userspace program. pub fn build(opts: Options) -> Result<(), anyhow::Error> { - // build our ebpf program followed by our application + let Options { + bpf_target, + release, + } = opts; + + // Build our ebpf program. build_ebpf(BuildOptions { - target: opts.bpf_target, - release: opts.release, - }) - .context("Error while building eBPF program")?; - build_project(&opts).context("Error while building userspace application")?; + target: bpf_target, + release, + })?; + + // Build our userspace program. + let mut cmd = Command::new("cargo"); + cmd.arg("build"); + if release { + cmd.arg("--release"); + } + let status = cmd.status().context("failed to build userspace")?; + anyhow::ensure!(status.success(), "failed to build userspace program: {}", status); + Ok(()) -} \ No newline at end of file +} diff --git a/xtask/src/build_ebpf.rs b/xtask/src/build_ebpf.rs index de8a9d6..ca83f1d 100644 --- a/xtask/src/build_ebpf.rs +++ b/xtask/src/build_ebpf.rs @@ -1,31 +1,38 @@ -use std::{path::PathBuf, process::Command}; +use std::process::Command; +use anyhow::Context as _; use clap::Parser; -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Clone)] pub enum Architecture { BpfEl, BpfEb, } +impl Architecture { + pub fn as_str(&self) -> &'static str { + match self { + Architecture::BpfEl => "bpfel-unknown-none", + Architecture::BpfEb => "bpfeb-unknown-none", + } + } +} + impl std::str::FromStr for Architecture { - type Err = String; + type Err = &'static str; fn from_str(s: &str) -> Result { Ok(match s { "bpfel-unknown-none" => Architecture::BpfEl, "bpfeb-unknown-none" => Architecture::BpfEb, - _ => return Err("invalid target".to_owned()), + _ => return Err("invalid target"), }) } } impl std::fmt::Display for Architecture { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.write_str(match self { - Architecture::BpfEl => "bpfel-unknown-none", - Architecture::BpfEb => "bpfeb-unknown-none", - }) + f.write_str(self.as_str()) } } @@ -40,28 +47,22 @@ pub struct Options { } pub fn build_ebpf(opts: Options) -> Result<(), anyhow::Error> { - let dir = PathBuf::from("{{project-name}}-ebpf"); - let target = format!("--target={}", opts.target); - let mut args = vec![ - "build", - target.as_str(), - "-Z", - "build-std=core", - ]; - if opts.release { - args.push("--release") + let Options { target, release } = opts; + + let mut cmd = Command::new("cargo"); + cmd.current_dir("{{project-name}}-ebpf") + // Command::new creates a child process which inherits all env variables. This means env + // vars set by the cargo xtask command are also inherited. RUSTUP_TOOLCHAIN is removed so + // the rust-toolchain.toml file in the -ebpf folder is honored. + .env_remove("RUSTUP_TOOLCHAIN") + .args(["build", "--target", target.as_str()]); + + if release { + cmd.arg("--release"); } - // Command::new creates a child process which inherits all env variables. This means env - // vars set by the cargo xtask command are also inherited. RUSTUP_TOOLCHAIN is removed - // so the rust-toolchain.toml file in the -ebpf folder is honored. + let status = cmd.status().context("failed to build bpf program")?; + anyhow::ensure!(status.success(), "failed to build bpf program: {}", status); - let status = Command::new("cargo") - .current_dir(dir) - .env_remove("RUSTUP_TOOLCHAIN") - .args(&args) - .status() - .expect("failed to build bpf program"); - assert!(status.success()); Ok(()) } diff --git a/{{project-name}}-common/Cargo.toml b/{{project-name}}-common/Cargo.toml index 153d2ba..713d8fd 100644 --- a/{{project-name}}-common/Cargo.toml +++ b/{{project-name}}-common/Cargo.toml @@ -8,7 +8,7 @@ default = [] user = ["aya"] [dependencies] -aya = { version = "0.13", optional = true } +aya = { workspace = true, optional = true } [lib] path = "src/lib.rs" diff --git a/{{project-name}}-ebpf/.cargo/config.toml b/{{project-name}}-ebpf/.cargo/config.toml index 4302a7f..d8d7a20 100644 --- a/{{project-name}}-ebpf/.cargo/config.toml +++ b/{{project-name}}-ebpf/.cargo/config.toml @@ -1,6 +1,12 @@ +# We have this so that one doesn't need to manually pass +# --target=bpfel-unknown-none -Z build-std=core when running cargo +# check/build/doc etc. +# +# NB: this file gets loaded only if you run cargo from this directory, it's +# ignored if you run from the workspace root. See +# https://doc.rust-lang.org/cargo/reference/config.html#hierarchical-structure [build] -target-dir = "../target" -target = "bpfel-unknown-none" +target = ["bpfeb-unknown-none", "bpfel-unknown-none"] [unstable] build-std = ["core"] diff --git a/{{project-name}}-ebpf/.cargo/rust-analyzer.toml b/{{project-name}}-ebpf/.cargo/rust-analyzer.toml deleted file mode 100644 index 9855618..0000000 --- a/{{project-name}}-ebpf/.cargo/rust-analyzer.toml +++ /dev/null @@ -1,3 +0,0 @@ -[rust-analyzer] -cargo.target = "bpfel-unknown-none" -checkOnSave.allTargets = false diff --git a/{{project-name}}-ebpf/.helix/config.toml b/{{project-name}}-ebpf/.helix/config.toml deleted file mode 100644 index da5424f..0000000 --- a/{{project-name}}-ebpf/.helix/config.toml +++ /dev/null @@ -1,2 +0,0 @@ -[editor] -workspace-lsp-roots = [] diff --git a/{{project-name}}-ebpf/Cargo.toml b/{{project-name}}-ebpf/Cargo.toml index 5952771..4f5f274 100644 --- a/{{project-name}}-ebpf/Cargo.toml +++ b/{{project-name}}-ebpf/Cargo.toml @@ -4,29 +4,11 @@ version = "0.1.0" edition = "2021" [dependencies] -aya-ebpf = "0.1.1" -aya-log-ebpf = "0.1.1" {{ project-name }}-common = { path = "../{{ project-name }}-common" } +aya-ebpf = { workspace = true } +aya-log-ebpf = { workspace = true } + [[bin]] name = "{{ project-name }}" path = "src/main.rs" - -[profile.dev] -opt-level = 3 -debug = false -debug-assertions = false -overflow-checks = false -lto = true -panic = "abort" -incremental = false -codegen-units = 1 -rpath = false - -[profile.release] -lto = true -panic = "abort" -codegen-units = 1 - -[workspace] -members = [] diff --git a/{{project-name}}-ebpf/rust-toolchain.toml b/{{project-name}}-ebpf/rust-toolchain.toml index 24ce391..5d56faf 100644 --- a/{{project-name}}-ebpf/rust-toolchain.toml +++ b/{{project-name}}-ebpf/rust-toolchain.toml @@ -1,13 +1,2 @@ [toolchain] channel = "nightly" -# The source code of rustc, provided by the rust-src component, is needed for -# building eBPF programs. -components = [ - "cargo", - "clippy", - "rust-docs", - "rust-src", - "rust-std", - "rustc", - "rustfmt", -] diff --git a/{{project-name}}-ebpf/src/main.rs b/{{project-name}}-ebpf/src/main.rs index a0c265f..b599724 100644 --- a/{{project-name}}-ebpf/src/main.rs +++ b/{{project-name}}-ebpf/src/main.rs @@ -138,7 +138,7 @@ use aya_log_ebpf::info; use {{crate_name}}_common::SockKey; -#[map(name="{{sock_map}}")] +#[map] static {{sock_map}}: SockHash = SockHash::::with_max_entries(1024, 0); #[sk_msg] @@ -353,7 +353,8 @@ fn try_{{crate_name}}(ctx: PerfEventContext) -> Result { } {%- endcase %} +#[cfg(not(test))] #[panic_handler] fn panic(_info: &core::panic::PanicInfo) -> ! { - unsafe { core::hint::unreachable_unchecked() } + loop {} } diff --git a/{{project-name}}/Cargo.toml b/{{project-name}}/Cargo.toml index a6d0f66..83c71d2 100644 --- a/{{project-name}}/Cargo.toml +++ b/{{project-name}}/Cargo.toml @@ -2,20 +2,21 @@ name = "{{project-name}}" version = "0.1.0" edition = "2021" -publish = false [dependencies] -aya = "0.13" -aya-log = "0.2" +{{project-name}}-common = { path = "../{{project-name}}-common", features = ["user"] } + +anyhow = { workspace = true } +aya = { workspace = true } +aya-log = { workspace = true } +env_logger = {workspace = true } +libc = { workspace = true } +log = { workspace = true } +tokio = { workspace = true, features = ["macros", "rt", "rt-multi-thread", "net", "signal"] } + {% if program_types_with_opts contains program_type -%} -clap = { version = "4.1", features = ["derive"] } +clap = { workspace = true, features = ["derive"] } {% endif -%} -{{project-name}}-common = { path = "../{{project-name}}-common", features = ["user"] } -anyhow = "1" -env_logger = "0.10" -libc = "0.2" -log = "0.4" -tokio = { version = "1.25", features = ["macros", "rt", "rt-multi-thread", "net", "signal"] } [[bin]] name = "{{project-name}}"