From 57986f982a823670adb68ef24b2f77486a8d09c1 Mon Sep 17 00:00:00 2001 From: Jon Cinque Date: Tue, 28 Dec 2021 18:37:35 -0500 Subject: [PATCH] cargo-build-bpf: Add Windows support (#20276) * cargo-build-bpf: Add Windows support * Update error message --- sdk/bpf/scripts/install.sh | 22 ++++++++---- sdk/cargo-build-bpf/src/main.rs | 59 ++++++++++++++++++++++++--------- 2 files changed, 59 insertions(+), 22 deletions(-) diff --git a/sdk/bpf/scripts/install.sh b/sdk/bpf/scripts/install.sh index 3d06a3b371..95159415d2 100755 --- a/sdk/bpf/scripts/install.sh +++ b/sdk/bpf/scripts/install.sh @@ -3,11 +3,21 @@ mkdir -p "$(dirname "$0")"/../dependencies cd "$(dirname "$0")"/../dependencies -if [[ "$(uname)" = Darwin ]]; then - machine=osx -else - machine=linux -fi +unameOut="$(uname -s)" +case "${unameOut}" in + Linux*) + criterion_suffix= + machine=linux;; + Darwin*) + criterion_suffix= + machine=osx;; + MINGW*) + criterion_suffix=-mingw + machine=windows;; + *) + criterion_suffix= + machine=linux +esac download() { declare url="$1/$2/$3" @@ -80,7 +90,7 @@ if [[ ! -e criterion-$version.md || ! -e criterion ]]; then job="download \ https://github.com/Snaipe/Criterion/releases/download \ $version \ - criterion-$version-$machine-x86_64.tar.bz2 \ + criterion-$version-$machine$criterion_suffix-x86_64.tar.bz2 \ criterion" get $version criterion "$job" ) diff --git a/sdk/cargo-build-bpf/src/main.rs b/sdk/cargo-build-bpf/src/main.rs index f95f9839d0..2dcac2058d 100644 --- a/sdk/cargo-build-bpf/src/main.rs +++ b/sdk/cargo-build-bpf/src/main.rs @@ -463,7 +463,9 @@ fn build_bpf_package(config: &Config, target_directory: &Path, package: &cargo_m if legacy_program_feature_present { println!("Legacy program feature detected"); } - let bpf_tools_download_file_name = if cfg!(target_os = "macos") { + let bpf_tools_download_file_name = if cfg!(target_os = "windows") { + "solana-bpf-tools-windows.tar.bz2" + } else if cfg!(target_os = "macos") { "solana-bpf-tools-osx.tar.bz2" } else { "solana-bpf-tools-linux.tar.bz2" @@ -513,16 +515,21 @@ fn build_bpf_package(config: &Config, target_directory: &Path, package: &cargo_m env::set_var("AR", llvm_bin.join("llvm-ar")); env::set_var("OBJDUMP", llvm_bin.join("llvm-objdump")); env::set_var("OBJCOPY", llvm_bin.join("llvm-objcopy")); - let rustflags = match env::var("RUSTFLAGS") { + const RF_LTO: &str = "-C lto=no"; + let mut rustflags = match env::var("RUSTFLAGS") { Ok(rf) => { - if rf.contains("-C lto=no") { + if rf.contains(&RF_LTO) { rf } else { - rf + &" -C lto=no".to_string() + format!("{} {}", rf, RF_LTO) } } - _ => "-C lto=no".to_string(), + _ => RF_LTO.to_string(), }; + if cfg!(windows) && !rustflags.contains("-C linker=") { + let ld_path = llvm_bin.join("ld.lld"); + rustflags = format!("{} -C linker={}", rustflags, ld_path.display()); + } if config.verbose { println!("RUSTFLAGS={}", rustflags); } @@ -602,6 +609,17 @@ fn build_bpf_package(config: &Config, target_directory: &Path, package: &cargo_m } if file_older_or_missing(&program_unstripped_so, &program_so) { + #[cfg(windows)] + let output = spawn( + &llvm_bin.join("llvm-objcopy"), + &[ + "--strip-all".as_ref(), + program_unstripped_so.as_os_str(), + program_so.as_os_str(), + ], + config.generate_child_script_on_failure, + ); + #[cfg(not(windows))] let output = spawn( &config.bpf_sdk.join("scripts").join("strip.sh"), &[&program_unstripped_so, &program_so], @@ -613,13 +631,26 @@ fn build_bpf_package(config: &Config, target_directory: &Path, package: &cargo_m } if config.dump && file_older_or_missing(&program_unstripped_so, &program_dump) { - let output = spawn( - &config.bpf_sdk.join("scripts").join("dump.sh"), - &[&program_unstripped_so, &program_dump], - config.generate_child_script_on_failure, - ); - if config.verbose { - println!("{}", output); + let dump_script = config.bpf_sdk.join("scripts").join("dump.sh"); + #[cfg(windows)] + { + eprintln!("Using Bash scripts from within a program is not supported on Windows, skipping `--dump`."); + eprintln!( + "Please run \"{} {} {}\" from a Bash-supporting shell, then re-run this command to see the processed program dump.", + &dump_script.display(), + &program_unstripped_so.display(), + &program_dump.display()); + } + #[cfg(not(windows))] + { + let output = spawn( + &dump_script, + &[&program_unstripped_so, &program_dump], + config.generate_child_script_on_failure, + ); + if config.verbose { + println!("{}", output); + } } postprocess_dump(&program_dump); } @@ -678,10 +709,6 @@ fn build_bpf(config: Config, manifest_path: Option) { } fn main() { - if cfg!(windows) { - println!("Solana Rust BPF toolchain is not available on Windows"); - exit(1); - } let default_config = Config::default(); let default_bpf_sdk = format!("{}", default_config.bpf_sdk.display());