cargo-build-bpf: Add Windows support (#20276) (#22155)

* cargo-build-bpf: Add Windows support

* Update error message

(cherry picked from commit 57986f982a)

Co-authored-by: Jon Cinque <jon.cinque@gmail.com>
This commit is contained in:
mergify[bot]
2021-12-29 03:07:39 +00:00
committed by GitHub
parent adc584ee22
commit 14ed446923
2 changed files with 59 additions and 22 deletions

View File

@ -3,11 +3,21 @@
mkdir -p "$(dirname "$0")"/../dependencies mkdir -p "$(dirname "$0")"/../dependencies
cd "$(dirname "$0")"/../dependencies cd "$(dirname "$0")"/../dependencies
if [[ "$(uname)" = Darwin ]]; then unameOut="$(uname -s)"
machine=osx case "${unameOut}" in
else Linux*)
machine=linux criterion_suffix=
fi machine=linux;;
Darwin*)
criterion_suffix=
machine=osx;;
MINGW*)
criterion_suffix=-mingw
machine=windows;;
*)
criterion_suffix=
machine=linux
esac
download() { download() {
declare url="$1/$2/$3" declare url="$1/$2/$3"
@ -80,7 +90,7 @@ if [[ ! -e criterion-$version.md || ! -e criterion ]]; then
job="download \ job="download \
https://github.com/Snaipe/Criterion/releases/download \ https://github.com/Snaipe/Criterion/releases/download \
$version \ $version \
criterion-$version-$machine-x86_64.tar.bz2 \ criterion-$version-$machine$criterion_suffix-x86_64.tar.bz2 \
criterion" criterion"
get $version criterion "$job" get $version criterion "$job"
) )

View File

@ -462,7 +462,9 @@ fn build_bpf_package(config: &Config, target_directory: &Path, package: &cargo_m
if legacy_program_feature_present { if legacy_program_feature_present {
println!("Legacy program feature detected"); 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" "solana-bpf-tools-osx.tar.bz2"
} else { } else {
"solana-bpf-tools-linux.tar.bz2" "solana-bpf-tools-linux.tar.bz2"
@ -514,16 +516,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("AR", llvm_bin.join("llvm-ar"));
env::set_var("OBJDUMP", llvm_bin.join("llvm-objdump")); env::set_var("OBJDUMP", llvm_bin.join("llvm-objdump"));
env::set_var("OBJCOPY", llvm_bin.join("llvm-objcopy")); 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) => { Ok(rf) => {
if rf.contains("-C lto=no") { if rf.contains(&RF_LTO) {
rf rf
} else { } 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 { if config.verbose {
println!("RUSTFLAGS={}", rustflags); println!("RUSTFLAGS={}", rustflags);
} }
@ -603,6 +610,17 @@ fn build_bpf_package(config: &Config, target_directory: &Path, package: &cargo_m
} }
if file_older_or_missing(&program_unstripped_so, &program_so) { 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( let output = spawn(
&config.bpf_sdk.join("scripts").join("strip.sh"), &config.bpf_sdk.join("scripts").join("strip.sh"),
&[&program_unstripped_so, &program_so], &[&program_unstripped_so, &program_so],
@ -614,13 +632,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) { if config.dump && file_older_or_missing(&program_unstripped_so, &program_dump) {
let output = spawn( let dump_script = config.bpf_sdk.join("scripts").join("dump.sh");
&config.bpf_sdk.join("scripts").join("dump.sh"), #[cfg(windows)]
&[&program_unstripped_so, &program_dump], {
config.generate_child_script_on_failure, eprintln!("Using Bash scripts from within a program is not supported on Windows, skipping `--dump`.");
); eprintln!(
if config.verbose { "Please run \"{} {} {}\" from a Bash-supporting shell, then re-run this command to see the processed program dump.",
println!("{}", output); &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); postprocess_dump(&program_dump);
} }
@ -679,10 +710,6 @@ fn build_bpf(config: Config, manifest_path: Option<PathBuf>) {
} }
fn main() { fn main() {
if cfg!(windows) {
println!("Solana Rust BPF toolchain is not available on Windows");
exit(1);
}
let default_config = Config::default(); let default_config = Config::default();
let default_bpf_sdk = format!("{}", default_config.bpf_sdk.display()); let default_bpf_sdk = format!("{}", default_config.bpf_sdk.display());