diff --git a/Cargo.lock b/Cargo.lock index 2e467d9ecd..68644a507e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3792,6 +3792,7 @@ version = "1.4.18" dependencies = [ "cargo_metadata", "clap", + "solana-sdk", ] [[package]] diff --git a/sdk/cargo-build-bpf/Cargo.toml b/sdk/cargo-build-bpf/Cargo.toml index 4808746a98..e3d78efce6 100644 --- a/sdk/cargo-build-bpf/Cargo.toml +++ b/sdk/cargo-build-bpf/Cargo.toml @@ -12,6 +12,7 @@ publish = false [dependencies] clap = "2.33.3" cargo_metadata = "0.12.0" +solana-sdk = { path = "..", version = "1.4.18" } [features] program = [] diff --git a/sdk/cargo-build-bpf/src/main.rs b/sdk/cargo-build-bpf/src/main.rs index 297112cf5d..f148401773 100644 --- a/sdk/cargo-build-bpf/src/main.rs +++ b/sdk/cargo-build-bpf/src/main.rs @@ -1,13 +1,16 @@ -use clap::{ - crate_description, crate_name, crate_version, value_t, value_t_or_exit, values_t, App, Arg, -}; -use std::{ - env, - ffi::OsStr, - fs, - path::{Path, PathBuf}, - process::exit, - process::Command, +use { + clap::{ + crate_description, crate_name, crate_version, value_t, value_t_or_exit, values_t, App, Arg, + }, + solana_sdk::signature::{write_keypair_file, Keypair}, + std::{ + env, + ffi::OsStr, + fs, + path::{Path, PathBuf}, + process::exit, + process::Command, + }, }; struct Config { @@ -166,6 +169,7 @@ fn build_bpf_package( let program_unstripped_so = target_build_directory.join(&format!("{}.so", program_name)); let program_dump = bpf_out_dir.join(&format!("{}-dump.txt", program_name)); let program_so = bpf_out_dir.join(&format!("{}.so", program_name)); + let program_keypair = bpf_out_dir.join(&format!("{}-keypair.json", program_name)); fn file_older_or_missing(prerequisite_file: &Path, target_file: &Path) -> bool { let prerequisite_metadata = fs::metadata(prerequisite_file).unwrap_or_else(|err| { @@ -186,6 +190,17 @@ fn build_bpf_package( } } + if !program_keypair.exists() { + write_keypair_file(&Keypair::new(), &program_keypair).unwrap_or_else(|err| { + eprintln!( + "Unable to get create {}: {}", + program_keypair.display(), + err + ); + exit(1); + }); + } + if file_older_or_missing(&program_unstripped_so, &program_so) { spawn( &config.bpf_sdk.join("scripts/strip.sh"), diff --git a/sdk/src/signature.rs b/sdk/src/signature.rs index 08b8ad3ca1..278e2ca65d 100644 --- a/sdk/src/signature.rs +++ b/sdk/src/signature.rs @@ -333,9 +333,8 @@ pub fn read_keypair(reader: &mut R) -> Result Result> { - assert!(path != "-"); - let mut file = File::open(path.to_string())?; +pub fn read_keypair_file>(path: F) -> Result> { + let mut file = File::open(path.as_ref())?; read_keypair(&mut file) } @@ -349,12 +348,13 @@ pub fn write_keypair( Ok(serialized) } -pub fn write_keypair_file( +pub fn write_keypair_file>( keypair: &Keypair, - outfile: &str, + outfile: F, ) -> Result> { - assert!(outfile != "-"); - if let Some(outdir) = Path::new(outfile).parent() { + let outfile = outfile.as_ref(); + + if let Some(outdir) = outfile.parent() { fs::create_dir_all(outdir)?; }