Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ target/
/agent/src/ebpf/kernel/*.ll
/agent/src/ebpf/kernel/*.objdump
/agent/src/ebpf/kernel/*.elf
/agent/src/ebpf/.output/
/agent/src/ebpf/user/socket_trace_bpf_5_2.c
/agent/src/ebpf/user/socket_trace_bpf_core.c
/agent/src/ebpf/user/socket_trace_bpf_common.c
Expand All @@ -53,6 +54,3 @@ target/
/agent/src/ebpf/samples/rust/socket-tracer/src/ebpf.rs
/agent/src/ebpf/.flamegraph.pl
/agent/src/ebpf/kernel/*.tmp



1 change: 1 addition & 0 deletions agent/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ src/flow_generator/protocol_logs/mq/pulsar.proto.rs
src/ebpf/data
src/ebpf/.data_done
src/ebpf/libtrace.a
src/ebpf/.output/
src/ebpf/deepflow-ebpfctl
src/ebpf/kernel/*.elf.tmp
src/ebpf/kernel/socket_trace.ll
Expand Down
5 changes: 5 additions & 0 deletions agent/build.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,3 +94,8 @@ git clone --recursive https://github.com/deepflowio/deepflow.git
cd deepflow/agent
cargo build
```

## Build Speed Tips

- Force rebuild eBPF/C artifacts: `DF_EBPF_CLEAN=1 cargo build --release`
- eBPF `*.objdump` is generated by default; disable to speed up: `DF_EBPF_OBJDUMP=0 cargo build --release`
115 changes: 101 additions & 14 deletions agent/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/

use std::{
env,
env, fs,
path::{Path, PathBuf},
process::Command,
str,
Expand Down Expand Up @@ -90,7 +90,7 @@ fn set_build_info() -> Result<()> {
//
// rerun build script when one of the following file changes
// - C source files, except for
// - generated bpf bytecode files (socket_trace_*.c / perf_profiler_*.c)
// - generated bpf bytecode files (`*_bpf_*.c`, e.g. socket_trace_bpf_*.c / perf_profiler_bpf_*.c)
// - java agent so files and jattach bin
// - Header files
// - `src/ebpf/mod.rs` (to exclude rust sources in `samples` folder)
Expand All @@ -101,6 +101,9 @@ fn set_libtrace_rerun_files() -> Result<()> {
match ext {
"c" => {
if let Some(name) = path.file_name().and_then(|s| s.to_str()) {
if name.contains("_bpf_") {
return false;
}
if name.starts_with("socket_trace_") || name.starts_with("perf_profiler_") {
return false;
}
Expand Down Expand Up @@ -136,26 +139,110 @@ fn set_libtrace_rerun_files() -> Result<()> {
}
println!("cargo:rerun-if-changed={}", relative_path.display());
}

// eBPF/C code also includes headers from trace-utils.
for entry in WalkDir::new(base_dir.join("crates/trace-utils/src")) {
let entry = entry?;
if !entry.file_type().is_file() {
continue;
}
let path = entry.path();
if path.extension().and_then(|s| s.to_str()) != Some("h") {
continue;
}
let relative_path = path.strip_prefix(&base_dir)?;
println!("cargo:rerun-if-changed={}", relative_path.display());
}
Ok(())
}

fn set_build_libtrace() -> Result<()> {
set_libtrace_rerun_files()?;
let output = match env::var("CARGO_CFG_TARGET_ENV")?.as_str() {
"gnu" => Command::new("sh").arg("-c")
.arg("cd src/ebpf && make clean && make --no-print-directory && make tools --no-print-directory")
.output()?,
"musl" => Command::new("sh").arg("-c")
.arg("cd src/ebpf && make clean && CC=musl-gcc CLANG=musl-clang make --no-print-directory && CC=musl-gcc CLANG=musl-clang make tools --no-print-directory")
.output()?,
_ => panic!("Unsupported target"),
println!("cargo:rerun-if-env-changed=DF_EBPF_CLEAN");
println!("cargo:rerun-if-env-changed=DF_EBPF_OBJDUMP");

let target_env = env::var("CARGO_CFG_TARGET_ENV")?;

let target_id = format!(
"{}-{}-{}",
env::var("CARGO_CFG_TARGET_OS").unwrap_or_default(),
env::var("CARGO_CFG_TARGET_ARCH").unwrap_or_default(),
target_env
);
let root = PathBuf::from(env::var("CARGO_MANIFEST_DIR")?);
let state_file = root.join("src/ebpf/.output/.last_ebpf_build_target");
if let Some(parent) = state_file.parent() {
fs::create_dir_all(parent)?;
}
let previous_target = fs::read_to_string(&state_file)
.ok()
.map(|s| s.trim().to_owned());

let force_clean = match env::var("DF_EBPF_CLEAN") {
Ok(s) => !s.is_empty() && s != "0" && s.to_lowercase() != "false",
Err(_) => false,
};
let need_clean = force_clean
|| previous_target
.as_deref()
.map(|t| t != target_id)
.unwrap_or(false);

// NOTE:
// Keep default behavior consistent with historical builds: always generate `*.objdump`.
// Override with `DF_EBPF_OBJDUMP=0/false` to disable.
let objdump_enabled = match env::var("DF_EBPF_OBJDUMP") {
Ok(s) => {
let v = s.trim().to_lowercase();
!(v == "0" || v == "false" || v == "off" || v == "no")
}
Err(_) => true,
};
let objdump_value = if objdump_enabled { "1" } else { "0" };
let ebpf_output_dir = format!(".output/{}", target_id);
let kernel_output_dir = format!("../{}/kernel", ebpf_output_dir);

let cargo_makeflags = env::var("CARGO_MAKEFLAGS").ok();
let num_jobs = env::var("NUM_JOBS").ok();

let run_make = |targets: &[&str]| -> Result<()> {
let mut cmd = Command::new("make");
cmd.current_dir(root.join("src/ebpf"));
if let Some(makeflags) = &cargo_makeflags {
cmd.env("MAKEFLAGS", makeflags);
} else if let Some(jobs) = &num_jobs {
cmd.arg(format!("-j{}", jobs));
}
cmd.arg("--no-print-directory");
cmd.arg(format!("VMLINUX_OBJDUMP={}", objdump_value));
cmd.arg(format!("KERNEL_OUTPUT_DIR={}", kernel_output_dir));
cmd.arg(format!("OBJDIR={}", ebpf_output_dir));
match target_env.as_str() {
"gnu" => {}
"musl" => {
cmd.env("CC", "musl-gcc");
cmd.env("CLANG", "musl-clang");
}
_ => panic!("Unsupported target"),
}
cmd.args(targets);

let output = cmd.output()?;
if !output.status.success() {
eprintln!("{}", str::from_utf8(&output.stderr)?);
eprintln!("{}", str::from_utf8(&output.stdout)?);
panic!("compile libtrace.a error!");
}
Ok(())
};
if !output.status.success() {
eprintln!("{}", str::from_utf8(&output.stderr)?);
panic!("compile libtrace.a error!");

if need_clean {
run_make(&["clean"])?;
}
run_make(&["build", "tools"])?;
fs::write(&state_file, format!("{}\n", target_id))?;

let library_name = "trace";
let root = PathBuf::from(env::var("CARGO_MANIFEST_DIR")?);
let library_dir = dunce::canonicalize(root.join("src/ebpf/"))?;
println!("cargo:rustc-link-lib=static={}", library_name);
println!(
Expand Down
5 changes: 5 additions & 0 deletions agent/build_cn.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,3 +93,8 @@ git clone --recursive https://github.com/deepflowio/deepflow.git
cd deepflow/agent
cargo build
```

## 构建提速建议

- 强制重新生成 eBPF/C 相关产物:`DF_EBPF_CLEAN=1 cargo build --release`
- eBPF 的 `*.objdump` 默认生成,如需提速可关闭:`DF_EBPF_OBJDUMP=0 cargo build --release`
Loading
Loading