瀏覽代碼

ci: test-checks.sh all sbf code & use nightly only (#30602)

Ryo Onodera 2 年之前
父節點
當前提交
7f58345dad
共有 35 個文件被更改,包括 78 次插入17 次删除
  1. 5 6
      ci/test-checks.sh
  2. 4 0
      programs/sbf/Cargo.toml
  3. 2 0
      programs/sbf/benches/bpf_loader.rs
  4. 5 0
      programs/sbf/build.rs
  5. 2 0
      programs/sbf/rust/128bit/src/lib.rs
  6. 2 0
      programs/sbf/rust/128bit_dep/src/lib.rs
  7. 3 1
      programs/sbf/rust/alloc/src/lib.rs
  8. 2 0
      programs/sbf/rust/custom_heap/src/lib.rs
  9. 2 1
      programs/sbf/rust/deprecated_loader/src/lib.rs
  10. 2 0
      programs/sbf/rust/dup_accounts/src/lib.rs
  11. 2 0
      programs/sbf/rust/external_spend/src/lib.rs
  12. 1 1
      programs/sbf/rust/inner_instruction_alignment_check/src/lib.rs
  13. 1 1
      programs/sbf/rust/instruction_introspection/src/lib.rs
  14. 1 0
      programs/sbf/rust/invoked/src/processor.rs
  15. 2 0
      programs/sbf/rust/iter/src/lib.rs
  16. 2 0
      programs/sbf/rust/many_args/src/helper.rs
  17. 2 0
      programs/sbf/rust/many_args_dep/src/lib.rs
  18. 2 0
      programs/sbf/rust/mem/Cargo.toml
  19. 1 1
      programs/sbf/rust/mem/src/lib.rs
  20. 2 0
      programs/sbf/rust/mem/tests/lib.rs
  21. 1 1
      programs/sbf/rust/panic/src/lib.rs
  22. 2 0
      programs/sbf/rust/param_passing_dep/src/lib.rs
  23. 1 0
      programs/sbf/rust/sanity/Cargo.toml
  24. 1 0
      programs/sbf/rust/sanity/src/lib.rs
  25. 1 1
      programs/sbf/rust/sanity/tests/lib.rs
  26. 1 1
      programs/sbf/rust/secp256k1_recover/src/lib.rs
  27. 1 0
      programs/sbf/rust/sibling_inner_instruction/src/lib.rs
  28. 3 1
      programs/sbf/rust/simulation/src/lib.rs
  29. 1 1
      programs/sbf/rust/simulation/tests/lib.rs
  30. 1 1
      programs/sbf/rust/simulation/tests/validator.rs
  31. 2 0
      programs/sbf/rust/spoof1_system/src/lib.rs
  32. 4 0
      programs/sbf/rust/sysvar/Cargo.toml
  33. 2 0
      programs/sbf/rust/sysvar/tests/lib.rs
  34. 9 0
      programs/sbf/tests/programs.rs
  35. 3 0
      version/Cargo.toml

+ 5 - 6
ci/test-checks.sh

@@ -51,10 +51,12 @@ echo --- build environment
 export RUST_BACKTRACE=1
 export RUST_BACKTRACE=1
 export RUSTFLAGS="-D warnings -A incomplete_features"
 export RUSTFLAGS="-D warnings -A incomplete_features"
 
 
+# run cargo check for all rust files in this monorepo for faster turnaround in
+# case of any compilation/build error for nightly
+
 # Only force up-to-date lock files on edge
 # Only force up-to-date lock files on edge
 if [[ $CI_BASE_BRANCH = "$EDGE_CHANNEL" ]]; then
 if [[ $CI_BASE_BRANCH = "$EDGE_CHANNEL" ]]; then
-  # Exclude --benches as it's not available in rust stable yet
-  if _ scripts/cargo-for-all-lock-files.sh check --locked --tests --bins --examples; then
+  if _ scripts/cargo-for-all-lock-files.sh "+${rust_nightly}" check --locked --workspace --all-targets --features dummy-for-ci-check; then
     true
     true
   else
   else
     check_status=$?
     check_status=$?
@@ -63,9 +65,6 @@ if [[ $CI_BASE_BRANCH = "$EDGE_CHANNEL" ]]; then
     echo "$0:   [tree (for outdated Cargo.lock sync)|check (for compilation error)|update -p foo --precise x.y.z (for your Cargo.toml update)] ..." >&2
     echo "$0:   [tree (for outdated Cargo.lock sync)|check (for compilation error)|update -p foo --precise x.y.z (for your Cargo.toml update)] ..." >&2
     exit "$check_status"
     exit "$check_status"
   fi
   fi
-
-   # Ensure nightly and --benches
-  _ scripts/cargo-for-all-lock-files.sh "+${rust_nightly}" check --locked --all-targets
 else
 else
   echo "Note: cargo-for-all-lock-files.sh skipped because $CI_BASE_BRANCH != $EDGE_CHANNEL"
   echo "Note: cargo-for-all-lock-files.sh skipped because $CI_BASE_BRANCH != $EDGE_CHANNEL"
 fi
 fi
@@ -76,7 +75,7 @@ nightly_clippy_allows=()
 
 
 # -Z... is needed because of clippy bug: https://github.com/rust-lang/rust-clippy/issues/4612
 # -Z... is needed because of clippy bug: https://github.com/rust-lang/rust-clippy/issues/4612
 # run nightly clippy for `sdk/` as there's a moderate amount of nightly-only code there
 # run nightly clippy for `sdk/` as there's a moderate amount of nightly-only code there
- _ scripts/cargo-for-all-lock-files.sh -- "+${rust_nightly}" clippy -Zunstable-options --all-targets -- \
+ _ scripts/cargo-for-all-lock-files.sh -- "+${rust_nightly}" clippy -Zunstable-options --workspace --all-targets --features dummy-for-ci-check -- \
    --deny=warnings \
    --deny=warnings \
    --deny=clippy::integer_arithmetic \
    --deny=clippy::integer_arithmetic \
    "${nightly_clippy_allows[@]}"
    "${nightly_clippy_allows[@]}"

+ 4 - 0
programs/sbf/Cargo.toml

@@ -66,6 +66,10 @@ edition = { workspace = true }
 [features]
 [features]
 sbf_c = []
 sbf_c = []
 sbf_rust = []
 sbf_rust = []
+dummy-for-ci-check = [
+    "sbf_c",
+    "sbf_rust",
+]
 
 
 [build-dependencies]
 [build-dependencies]
 walkdir = "2"
 walkdir = "2"

+ 2 - 0
programs/sbf/benches/bpf_loader.rs

@@ -1,5 +1,7 @@
 #![feature(test)]
 #![feature(test)]
 #![cfg(feature = "sbf_c")]
 #![cfg(feature = "sbf_c")]
+#![allow(clippy::uninlined_format_args)]
+#![allow(clippy::integer_arithmetic)]
 
 
 use {solana_rbpf::memory_region::MemoryState, std::slice};
 use {solana_rbpf::memory_region::MemoryState, std::slice};
 
 

+ 5 - 0
programs/sbf/build.rs

@@ -37,6 +37,11 @@ fn rerun_if_changed(files: &[&str], directories: &[&str], excludes: &[&str]) {
 }
 }
 
 
 fn main() {
 fn main() {
+    if env::var("CARGO_FEATURE_DUMMY_FOR_CI_CHECK").is_ok() {
+        println!("cargo:warning=(not a warning) Compiling with host toolchain for CI...");
+        return;
+    }
+
     let sbf_c = env::var("CARGO_FEATURE_SBF_C").is_ok();
     let sbf_c = env::var("CARGO_FEATURE_SBF_C").is_ok();
     if sbf_c {
     if sbf_c {
         let install_dir = "OUT_DIR=../target/".to_string() + &env::var("PROFILE").unwrap() + "/sbf";
         let install_dir = "OUT_DIR=../target/".to_string() + &env::var("PROFILE").unwrap() + "/sbf";

+ 2 - 0
programs/sbf/rust/128bit/src/lib.rs

@@ -1,5 +1,7 @@
 //! Example Rust-based SBF program tests loop iteration
 //! Example Rust-based SBF program tests loop iteration
 
 
+#![allow(clippy::integer_arithmetic)]
+
 extern crate solana_program;
 extern crate solana_program;
 use solana_program::{custom_heap_default, custom_panic_default, entrypoint::SUCCESS};
 use solana_program::{custom_heap_default, custom_panic_default, entrypoint::SUCCESS};
 
 

+ 2 - 0
programs/sbf/rust/128bit_dep/src/lib.rs

@@ -1,5 +1,7 @@
 //! Solana Rust-based SBF program utility functions and types
 //! Solana Rust-based SBF program utility functions and types
 
 
+#![allow(clippy::integer_arithmetic)]
+
 extern crate solana_program;
 extern crate solana_program;
 
 
 pub fn uadd(x: u128, y: u128) -> u128 {
 pub fn uadd(x: u128, y: u128) -> u128 {

+ 3 - 1
programs/sbf/rust/alloc/src/lib.rs

@@ -1,5 +1,7 @@
 //! Example Rust-based SBF program that test dynamic memory allocation
 //! Example Rust-based SBF program that test dynamic memory allocation
 
 
+#![allow(clippy::integer_arithmetic)]
+
 #[macro_use]
 #[macro_use]
 extern crate alloc;
 extern crate alloc;
 use {
 use {
@@ -37,7 +39,7 @@ pub extern "C" fn entrypoint(_input: *mut u8) -> u64 {
             *ptr.add(i) = i as u8;
             *ptr.add(i) = i as u8;
         }
         }
         for i in 0..ITERS {
         for i in 0..ITERS {
-            assert_eq!(*ptr.add(i as usize), i as u8);
+            assert_eq!(*ptr.add(i), i as u8);
         }
         }
         sol_log_64(0x3, 0, 0, 0, u64::from(*ptr.add(42)));
         sol_log_64(0x3, 0, 0, 0, u64::from(*ptr.add(42)));
         assert_eq!(*ptr.add(42), 42);
         assert_eq!(*ptr.add(42), 42);

+ 2 - 0
programs/sbf/rust/custom_heap/src/lib.rs

@@ -1,5 +1,7 @@
 //! Example Rust-based SBF that tests out using a custom heap
 //! Example Rust-based SBF that tests out using a custom heap
 
 
+#![allow(clippy::integer_arithmetic)]
+
 use {
 use {
     solana_program::{
     solana_program::{
         account_info::AccountInfo,
         account_info::AccountInfo,

+ 2 - 1
programs/sbf/rust/deprecated_loader/src/lib.rs

@@ -1,6 +1,7 @@
 //! Example Rust-based SBF program that supports the deprecated loader
 //! Example Rust-based SBF program that supports the deprecated loader
 
 
 #![allow(unreachable_code)]
 #![allow(unreachable_code)]
+#![allow(clippy::integer_arithmetic)]
 
 
 extern crate solana_program;
 extern crate solana_program;
 use solana_program::{
 use solana_program::{
@@ -23,7 +24,7 @@ fn return_sstruct() -> SStruct {
 #[no_mangle]
 #[no_mangle]
 fn custom_panic(info: &core::panic::PanicInfo<'_>) {
 fn custom_panic(info: &core::panic::PanicInfo<'_>) {
     // Full panic reporting
     // Full panic reporting
-    msg!(&format!("{}", info));
+    msg!(&format!("{info}"));
 }
 }
 
 
 solana_program::entrypoint_deprecated!(process_instruction);
 solana_program::entrypoint_deprecated!(process_instruction);

+ 2 - 0
programs/sbf/rust/dup_accounts/src/lib.rs

@@ -1,5 +1,7 @@
 //! Example Rust-based SBF program that tests duplicate accounts passed via accounts
 //! Example Rust-based SBF program that tests duplicate accounts passed via accounts
 
 
+#![allow(clippy::integer_arithmetic)]
+
 extern crate solana_program;
 extern crate solana_program;
 use solana_program::{
 use solana_program::{
     account_info::AccountInfo,
     account_info::AccountInfo,

+ 2 - 0
programs/sbf/rust/external_spend/src/lib.rs

@@ -1,5 +1,7 @@
 //! Example Rust-based SBF program that moves a lamport from one account to another
 //! Example Rust-based SBF program that moves a lamport from one account to another
 
 
+#![allow(clippy::integer_arithmetic)]
+
 extern crate solana_program;
 extern crate solana_program;
 use solana_program::{account_info::AccountInfo, entrypoint::ProgramResult, pubkey::Pubkey};
 use solana_program::{account_info::AccountInfo, entrypoint::ProgramResult, pubkey::Pubkey};
 
 

+ 1 - 1
programs/sbf/rust/inner_instruction_alignment_check/src/lib.rs

@@ -40,5 +40,5 @@ custom_heap_default!();
 #[no_mangle]
 #[no_mangle]
 fn custom_panic(info: &core::panic::PanicInfo<'_>) {
 fn custom_panic(info: &core::panic::PanicInfo<'_>) {
     // Full panic reporting
     // Full panic reporting
-    msg!(&format!("{}", info));
+    msg!(&format!("{info}"));
 }
 }

+ 1 - 1
programs/sbf/rust/instruction_introspection/src/lib.rs

@@ -42,7 +42,7 @@ fn process_instruction(
     msg!(&format!("id: {}", instruction.program_id));
     msg!(&format!("id: {}", instruction.program_id));
 
 
     msg!(&format!("data[0]: {}", instruction.data[0]));
     msg!(&format!("data[0]: {}", instruction.data[0]));
-    msg!(&format!("index: {}", current_instruction));
+    msg!(&format!("index: {current_instruction}"));
 
 
     if instruction_data.len() == 2 {
     if instruction_data.len() == 2 {
         // CPI ourself with the same arguments to confirm the instructions sysvar reports the same
         // CPI ourself with the same arguments to confirm the instructions sysvar reports the same

+ 1 - 0
programs/sbf/rust/invoked/src/processor.rs

@@ -1,6 +1,7 @@
 //! Example Rust-based SBF program that issues a cross-program-invocation
 //! Example Rust-based SBF program that issues a cross-program-invocation
 
 
 #![cfg(feature = "program")]
 #![cfg(feature = "program")]
+#![allow(clippy::integer_arithmetic)]
 
 
 use {
 use {
     crate::instructions::*,
     crate::instructions::*,

+ 2 - 0
programs/sbf/rust/iter/src/lib.rs

@@ -1,5 +1,7 @@
 //! Example Rust-based SBF program tests loop iteration
 //! Example Rust-based SBF program tests loop iteration
 
 
+#![allow(clippy::integer_arithmetic)]
+
 extern crate solana_program;
 extern crate solana_program;
 use solana_program::{
 use solana_program::{
     custom_heap_default, custom_panic_default, entrypoint::SUCCESS, log::sol_log_64,
     custom_heap_default, custom_panic_default, entrypoint::SUCCESS, log::sol_log_64,

+ 2 - 0
programs/sbf/rust/many_args/src/helper.rs

@@ -1,5 +1,7 @@
 //! Example Rust-based SBF program tests loop iteration
 //! Example Rust-based SBF program tests loop iteration
 
 
+#![allow(clippy::integer_arithmetic)]
+
 extern crate solana_program;
 extern crate solana_program;
 use solana_program::log::*;
 use solana_program::log::*;
 
 

+ 2 - 0
programs/sbf/rust/many_args_dep/src/lib.rs

@@ -1,5 +1,7 @@
 //! Solana Rust-based SBF program utility functions and types
 //! Solana Rust-based SBF program utility functions and types
 
 
+#![allow(clippy::integer_arithmetic)]
+
 extern crate solana_program;
 extern crate solana_program;
 use solana_program::{log::sol_log_64, msg};
 use solana_program::{log::sol_log_64, msg};
 
 

+ 2 - 0
programs/sbf/rust/mem/Cargo.toml

@@ -11,6 +11,8 @@ edition = { workspace = true }
 
 
 [features]
 [features]
 no-entrypoint = []
 no-entrypoint = []
+test-bpf = []
+dummy-for-ci-check = ["test-bpf"]
 
 
 [dependencies]
 [dependencies]
 solana-program = { workspace = true }
 solana-program = { workspace = true }

+ 1 - 1
programs/sbf/rust/mem/src/lib.rs

@@ -1,6 +1,6 @@
 //! Test mem functions
 //! Test mem functions
 
 
-#[cfg(not(feature = "no-entrypoint"))]
+#[cfg(any(not(feature = "no-entrypoint"), feature = "test-bpf"))]
 pub mod entrypoint;
 pub mod entrypoint;
 
 
 pub trait MemOps {
 pub trait MemOps {

+ 2 - 0
programs/sbf/rust/mem/tests/lib.rs

@@ -1,3 +1,5 @@
+#![cfg(feature = "test-bpf")]
+
 use {
 use {
     solana_program_test::*,
     solana_program_test::*,
     solana_sbf_rust_mem::entrypoint::process_instruction,
     solana_sbf_rust_mem::entrypoint::process_instruction,

+ 1 - 1
programs/sbf/rust/panic/src/lib.rs

@@ -5,7 +5,7 @@
 fn custom_panic(info: &core::panic::PanicInfo<'_>) {
 fn custom_panic(info: &core::panic::PanicInfo<'_>) {
     // Note: Full panic reporting is included here for testing purposes
     // Note: Full panic reporting is included here for testing purposes
     solana_program::msg!("program custom panic enabled");
     solana_program::msg!("program custom panic enabled");
-    solana_program::msg!(&format!("{}", info));
+    solana_program::msg!(&format!("{info}"));
 }
 }
 
 
 extern crate solana_program;
 extern crate solana_program;

+ 2 - 0
programs/sbf/rust/param_passing_dep/src/lib.rs

@@ -1,5 +1,7 @@
 //! Example Rust-based SBF program tests loop iteration
 //! Example Rust-based SBF program tests loop iteration
 
 
+#![allow(clippy::integer_arithmetic)]
+
 extern crate solana_program;
 extern crate solana_program;
 
 
 #[derive(Debug)]
 #[derive(Debug)]

+ 1 - 0
programs/sbf/rust/sanity/Cargo.toml

@@ -11,6 +11,7 @@ edition = { workspace = true }
 
 
 [features]
 [features]
 test-bpf = []
 test-bpf = []
+dummy-for-ci-check = ["test-bpf"]
 
 
 [dependencies]
 [dependencies]
 solana-program = { workspace = true }
 solana-program = { workspace = true }

+ 1 - 0
programs/sbf/rust/sanity/src/lib.rs

@@ -1,6 +1,7 @@
 //! Example Rust-based SBF sanity program that prints out the parameters passed to it
 //! Example Rust-based SBF sanity program that prints out the parameters passed to it
 
 
 #![allow(unreachable_code)]
 #![allow(unreachable_code)]
+#![allow(clippy::integer_arithmetic)]
 
 
 extern crate solana_program;
 extern crate solana_program;
 use solana_program::{
 use solana_program::{

+ 1 - 1
programs/sbf/rust/sanity/tests/lib.rs

@@ -12,7 +12,7 @@ use {
 };
 };
 
 
 #[tokio::test]
 #[tokio::test]
-async fn test_sysvars() {
+async fn test_sanity() {
     let program_id = Pubkey::new_unique();
     let program_id = Pubkey::new_unique();
     let program_test = ProgramTest::new(
     let program_test = ProgramTest::new(
         "solana_sbf_rust_sanity",
         "solana_sbf_rust_sanity",

+ 1 - 1
programs/sbf/rust/secp256k1_recover/src/lib.rs

@@ -60,7 +60,7 @@ fn test_secp256k1_recover_malleability() {
     let signature = libsecp256k1::Signature::parse_standard_slice(&signature_bytes).unwrap();
     let signature = libsecp256k1::Signature::parse_standard_slice(&signature_bytes).unwrap();
 
 
     // Flip the S value in the signature to make a different but valid signature.
     // Flip the S value in the signature to make a different but valid signature.
-    let mut alt_signature = signature.clone();
+    let mut alt_signature = signature;
     alt_signature.s = -alt_signature.s;
     alt_signature.s = -alt_signature.s;
     let alt_recovery_id = libsecp256k1::RecoveryId::parse(recovery_id ^ 1).unwrap();
     let alt_recovery_id = libsecp256k1::RecoveryId::parse(recovery_id ^ 1).unwrap();
 
 

+ 1 - 0
programs/sbf/rust/sibling_inner_instruction/src/lib.rs

@@ -1,6 +1,7 @@
 //! Example Rust-based SBF program that queries sibling instructions
 //! Example Rust-based SBF program that queries sibling instructions
 
 
 #![cfg(feature = "program")]
 #![cfg(feature = "program")]
+#![allow(clippy::integer_arithmetic)]
 
 
 use solana_program::{
 use solana_program::{
     account_info::AccountInfo,
     account_info::AccountInfo,

+ 3 - 1
programs/sbf/rust/simulation/src/lib.rs

@@ -1,3 +1,5 @@
+#![allow(clippy::integer_arithmetic)]
+
 use {
 use {
     solana_program::{
     solana_program::{
         account_info::{next_account_info, AccountInfo},
         account_info::{next_account_info, AccountInfo},
@@ -29,7 +31,7 @@ pub fn process_instruction(
     let slot: u64 = u64::from_le_bytes(data[data.len() - 8..].try_into().unwrap());
     let slot: u64 = u64::from_le_bytes(data[data.len() - 8..].try_into().unwrap());
 
 
     let clock_from_cache = Clock::get().unwrap();
     let clock_from_cache = Clock::get().unwrap();
-    let clock_from_account = Clock::from_account_info(&clock_account_info).unwrap();
+    let clock_from_account = Clock::from_account_info(clock_account_info).unwrap();
 
 
     msg!("next_slot from slot history is {:?} ", slot);
     msg!("next_slot from slot history is {:?} ", slot);
     msg!("clock from cache is in slot {:?} ", clock_from_cache.slot);
     msg!("clock from cache is in slot {:?} ", clock_from_cache.slot);

+ 1 - 1
programs/sbf/rust/simulation/tests/lib.rs

@@ -13,7 +13,7 @@ use {
 };
 };
 
 
 #[tokio::test]
 #[tokio::test]
-async fn no_panic() {
+async fn no_panic_banks_client() {
     let program_id = Pubkey::new_unique();
     let program_id = Pubkey::new_unique();
     let program_test = ProgramTest::new(
     let program_test = ProgramTest::new(
         "solana_sbf_rust_simulation",
         "solana_sbf_rust_simulation",

+ 1 - 1
programs/sbf/rust/simulation/tests/validator.rs

@@ -11,7 +11,7 @@ use {
 };
 };
 
 
 #[test]
 #[test]
-fn no_panic() {
+fn no_panic_rpc_client() {
     solana_logger::setup_with_default("solana_program_runtime=debug");
     solana_logger::setup_with_default("solana_program_runtime=debug");
     let program_id = Pubkey::new_unique();
     let program_id = Pubkey::new_unique();
 
 

+ 2 - 0
programs/sbf/rust/spoof1_system/src/lib.rs

@@ -1,3 +1,5 @@
+#![allow(clippy::integer_arithmetic)]
+
 use solana_program::{account_info::AccountInfo, entrypoint::ProgramResult, pubkey::Pubkey};
 use solana_program::{account_info::AccountInfo, entrypoint::ProgramResult, pubkey::Pubkey};
 
 
 solana_program::entrypoint!(process_instruction);
 solana_program::entrypoint!(process_instruction);

+ 4 - 0
programs/sbf/rust/sysvar/Cargo.toml

@@ -12,6 +12,10 @@ edition = { workspace = true }
 [dependencies]
 [dependencies]
 solana-program = { workspace = true }
 solana-program = { workspace = true }
 
 
+[features]
+test-bpf = []
+dummy-for-ci-check = ["test-bpf"]
+
 [dev-dependencies]
 [dev-dependencies]
 solana-program-runtime = { workspace = true }
 solana-program-runtime = { workspace = true }
 solana-program-test = { workspace = true }
 solana-program-test = { workspace = true }

+ 2 - 0
programs/sbf/rust/sysvar/tests/lib.rs

@@ -1,3 +1,5 @@
+#![cfg(feature = "test-bpf")]
+
 use {
 use {
     solana_program_test::*,
     solana_program_test::*,
     solana_sbf_rust_sysvar::process_instruction,
     solana_sbf_rust_sysvar::process_instruction,

+ 9 - 0
programs/sbf/tests/programs.rs

@@ -1,4 +1,13 @@
 #![cfg(any(feature = "sbf_c", feature = "sbf_rust"))]
 #![cfg(any(feature = "sbf_c", feature = "sbf_rust"))]
+#![allow(clippy::clone_on_copy)]
+#![allow(clippy::needless_range_loop)]
+#![allow(clippy::redundant_clone)]
+#![allow(clippy::needless_borrow)]
+#![allow(clippy::cmp_owned)]
+#![allow(clippy::needless_collect)]
+#![allow(clippy::match_like_matches_macro)]
+#![allow(clippy::unnecessary_cast)]
+#![allow(clippy::uninlined_format_args)]
 
 
 #[macro_use]
 #[macro_use]
 extern crate solana_bpf_loader_program;
 extern crate solana_bpf_loader_program;

+ 3 - 0
version/Cargo.toml

@@ -18,6 +18,9 @@ solana-frozen-abi = { workspace = true }
 solana-frozen-abi-macro = { workspace = true }
 solana-frozen-abi-macro = { workspace = true }
 solana-sdk = { workspace = true }
 solana-sdk = { workspace = true }
 
 
+[features]
+dummy-for-ci-check = []
+
 [lib]
 [lib]
 name = "solana_version"
 name = "solana_version"