From 9271ba00391b0f1d11ae3b2ad75d2d7a86de7eb8 Mon Sep 17 00:00:00 2001 From: Jack May Date: Thu, 16 May 2019 17:35:42 -0700 Subject: [PATCH] Cleanup Rust BPF program building (#4318) --- ci/test-stable.sh | 1 - programs/bpf/build.rs | 103 ++++++++++++++++---------------- programs/bpf/rust/noop/build.sh | 13 ++-- programs/bpf/rust/noop/dump.sh | 6 +- 4 files changed, 61 insertions(+), 62 deletions(-) diff --git a/ci/test-stable.sh b/ci/test-stable.sh index 08fea7a048..96f68fdc0b 100755 --- a/ci/test-stable.sh +++ b/ci/test-stable.sh @@ -47,7 +47,6 @@ test-stable-perf) # BPF program tests _ make -C programs/bpf/c tests - _ programs/bpf/rust/noop/build.sh # Must be built out of band _ cargo +"$rust_stable" test \ --manifest-path programs/bpf/Cargo.toml \ --no-default-features --features=bpf_c,bpf_rust diff --git a/programs/bpf/build.rs b/programs/bpf/build.rs index 702596e8b8..d6784bac3e 100644 --- a/programs/bpf/build.rs +++ b/programs/bpf/build.rs @@ -5,14 +5,24 @@ use std::path::Path; use std::process::Command; use walkdir::WalkDir; -fn rerun_if_changed(files: &[&str], directories: &[&str]) { +fn rerun_if_changed(files: &[&str], directories: &[&str], excludes: &[&str]) { let mut all_files: Vec<_> = files.iter().map(|f| f.to_string()).collect(); for directory in directories { let files_in_directory: Vec<_> = WalkDir::new(directory) .into_iter() .map(|entry| entry.unwrap()) - .filter(|entry| entry.file_type().is_file()) + .filter(|entry| { + if !entry.file_type().is_file() { + return false; + } + for exclude in excludes.iter() { + if entry.path().to_str().unwrap().contains(exclude) { + return false; + } + } + true + }) .map(|f| f.path().to_str().unwrap().to_owned()) .collect(); all_files.extend_from_slice(&files_in_directory[..]); @@ -27,73 +37,62 @@ fn rerun_if_changed(files: &[&str], directories: &[&str]) { } fn main() { - println!("cargo:rerun-if-changed=build.rs"); - let bpf_c = !env::var("CARGO_FEATURE_BPF_C").is_err(); if bpf_c { - let out_dir = "OUT_DIR=../../../target/".to_string() + let install_dir = "OUT_DIR=../../../target/".to_string() + &env::var("PROFILE").unwrap() + &"/bpf".to_string(); - rerun_if_changed( - &["../../sdk/bpf/bpf.ld", "../../sdk/bpf/bpf.mk", "c/makefile"], - &["../../sdk/bpf/inc", "../../sdk/bpf/scripts", "c/src"], - ); - - println!("cargo:warning=(not a warning) Compiling C-based BPF programs"); - let status = Command::new("make") + println!("cargo:warning=(not a warning) Building C-based BPF programs"); + assert!(Command::new("make") .current_dir("c") .arg("programs") - .arg(&out_dir) + .arg(&install_dir) .status() - .expect("Failed to build C-based BPF programs"); - assert!(status.success()); + .expect("Failed to build C-based BPF programs") + .success()); + + rerun_if_changed(&["c/makefile"], &["c/src", "../../sdk"], &["/target/"]); } let bpf_rust = !env::var("CARGO_FEATURE_BPF_RUST").is_err(); if bpf_rust { let install_dir = - "../../../../target/".to_string() + &env::var("PROFILE").unwrap() + &"/bpf".to_string(); + "../../target/".to_string() + &env::var("PROFILE").unwrap() + &"/bpf".to_string(); - if !Path::new("rust/noop/target/bpfel-unknown-unknown/release/solana_bpf_rust_noop.so") - .is_file() - { - // Cannot build Rust BPF programs as part of main build because - // to build it requires calling Cargo with different parameters which - // would deadlock due to recursive cargo calls - panic!( - "solana_bpf_rust_noop.so not found, you must manually run \ - `programs/bpf/rust/noop/build.sh` to build it" - ); - } - - rerun_if_changed( - &[ - "rust/noop/bpf.ld", - "rust/noop/build.sh", - "rust/noop/Cargo.toml", - "rust/noop/target/bpfel-unknown-unknown/release/solana_bpf_rust_noop.so", - ], - &["rust/noop/src"], - ); - - println!( - "cargo:warning=(not a warning) Installing Rust-based BPF program: solana_bpf_rust_noop" - ); - let status = Command::new("mkdir") - .current_dir("rust/noop") + assert!(Command::new("mkdir") .arg("-p") .arg(&install_dir) .status() - .expect("Unable to create BPF install directory"); - assert!(status.success()); + .expect("Unable to create BPF install directory") + .success()); - let status = Command::new("cp") - .current_dir("rust/noop") - .arg("target/bpfel-unknown-unknown/release/solana_bpf_rust_noop.so") - .arg(&install_dir) - .status() - .expect("Failed to copy solana_rust_bpf_noop.so to install directory"); - assert!(status.success()); + let rust_programs = ["noop"]; + for program in rust_programs.iter() { + println!( + "cargo:warning=(not a warning) Building Rust-based BPF program: solana_bpf_rust_{}", + program + ); + assert!(Command::new("./build.sh") + .current_dir(format!("rust/{}", program)) + .status() + .expect(&format!( + "Failed to call solana-bpf-rust-{}'s build.sh", + program + )) + .success()); + let src = format!( + "rust/{}/target/bpfel-unknown-unknown/release/solana_bpf_rust_{}.so", + program, program, + ); + assert!(Command::new("cp") + .arg(&src) + .arg(&install_dir) + .status() + .expect(&format!("Failed to cp {} to {}", src, install_dir)) + .success()); + } + + rerun_if_changed(&[], &["rust", "../../sdk", &install_dir], &["/target/"]); } } diff --git a/programs/bpf/rust/noop/build.sh b/programs/bpf/rust/noop/build.sh index e9de0c76b7..3220aec38a 100755 --- a/programs/bpf/rust/noop/build.sh +++ b/programs/bpf/rust/noop/build.sh @@ -6,10 +6,12 @@ cargo install xargo set -e -# Ensure the sdk is installed -../../../../sdk/bpf/scripts/install.sh -rustup override set bpf +bpf_sdk=../../../../sdk/bpf +# Ensure the sdk is installed +"$bpf_sdk"/scripts/install.sh + +export RUSTUP_TOOLCHAIN=bpf export RUSTFLAGS="$RUSTFLAGS \ -C lto=no \ -C opt-level=2 \ @@ -18,10 +20,9 @@ export RUSTFLAGS="$RUSTFLAGS \ -C link-arg=--Bdynamic \ -C link-arg=-shared \ -C link-arg=--entry=entrypoint \ - -C linker=../../../../sdk/bpf/llvm-native/bin/ld.lld" + -C linker=$bpf_sdk/llvm-native/bin/ld.lld" export XARGO_HOME="$PWD/target/xargo" -export XARGO_RUST_SRC="../../../../sdk/bpf/rust-bpf-sysroot/src" -# export XARGO_RUST_SRC="../../../../../rust-bpf-sysroot/src" +export XARGO_RUST_SRC="$bpf_sdk/rust-bpf-sysroot/src" xargo build --target bpfel-unknown-unknown --release -v { { set +x; } 2>/dev/null; echo Success; } diff --git a/programs/bpf/rust/noop/dump.sh b/programs/bpf/rust/noop/dump.sh index 8108047d5b..f525425920 100755 --- a/programs/bpf/rust/noop/dump.sh +++ b/programs/bpf/rust/noop/dump.sh @@ -7,6 +7,6 @@ set -e ./clean.sh ./build.sh -ls -la ./target/bpfel_unknown_unknown/release/solana_bpf_rust_noop.so > dump.txt -greadelf -aW ./target/bpfel_unknown_unknown/release/solana_bpf_rust_noop.so | rustfilt >> dump.txt -llvm-objdump -print-imm-hex --source --disassemble ./target/bpfel_unknown_unknown/release/solana_bpf_rust_noop.so >> dump.txt +ls -la ./target/bpfel-unknown-unknown/release/solana_bpf_rust_noop.so > dump.txt +greadelf -aW ./target/bpfel-unknown-unknown/release/solana_bpf_rust_noop.so | rustfilt >> dump.txt +llvm-objdump -print-imm-hex --source --disassemble ./target/bpfel-unknown-unknown/release/solana_bpf_rust_noop.so >> dump.txt