#!/usr/bin/env bash # # Patches the SPL crates for developing against a local solana monorepo # solana_dir=$1 if [[ -z $solana_dir ]]; then echo "Usage: $0 " exit 1 fi workspace_crates=( Cargo.toml ) if [[ ! -r "$solana_dir"/scripts/read-cargo-variable.sh ]]; then echo "$solana_dir is not a path to the solana monorepo" exit 1 fi set -e solana_dir=$(cd "$solana_dir" && pwd) cd "$(dirname "$0")" project_root=$(pwd) source "$solana_dir"/scripts/read-cargo-variable.sh # The toolchain file only exists in version >= 1.15 toolchain_file="$solana_dir"/rust-toolchain.toml if [[ -f "$toolchain_file" ]]; then cp "$toolchain_file" . fi # only add exclude rule when solana root is under spl root if echo "$solana_dir" | grep "^$project_root" > /dev/null; then echo "Excluding $solana_dir from workspace" echo for crate in "${workspace_crates[@]}"; do if grep -q "exclude.*$solana_dir" "$crate"; then echo "$crate is already patched" else cat >> $crate << EXCLUDE exclude = ["$solana_dir"] EXCLUDE fi done fi # get version from Cargo.toml first. if it is empty, get it from other places. solana_ver="$(readCargoVariable version "$solana_dir"/Cargo.toml)" solana_ver=${solana_ver:-$(readCargoVariable version "$solana_dir"/sdk/Cargo.toml)} crates_map=() crates_map+=("solana-account-decoder account-decoder") crates_map+=("solana-banks-client banks-client") crates_map+=("solana-banks-server banks-server") crates_map+=("solana-bpf-loader-program programs/bpf_loader") crates_map+=("solana-clap-utils clap-utils") crates_map+=("solana-clap-v3-utils clap-v3-utils") crates_map+=("solana-cli-config cli-config") crates_map+=("solana-cli-output cli-output") crates_map+=("solana-client client") crates_map+=("solana-core core") crates_map+=("solana-logger logger") crates_map+=("solana-notifier notifier") crates_map+=("solana-remote-wallet remote-wallet") crates_map+=("solana-program sdk/program") crates_map+=("solana-program-test program-test") crates_map+=("solana-runtime runtime") crates_map+=("solana-sdk sdk") crates_map+=("solana-stake-program programs/stake") crates_map+=("solana-test-validator test-validator") crates_map+=("solana-transaction-status transaction-status") crates_map+=("solana-version version") crates_map+=("solana-vote-program programs/vote") crates_map+=("solana-zk-token-sdk zk-token-sdk") patch_crates=() for map_entry in "${crates_map[@]}"; do read -r crate_name crate_path <<<"$map_entry" full_path="$solana_dir/$crate_path" if [[ -r "$full_path/Cargo.toml" ]]; then patch_crates+=("$crate_name = { path = \"$full_path\" }") fi done echo "Patching in $solana_ver from $solana_dir" echo for crate in "${workspace_crates[@]}"; do if grep -q '\[patch.crates-io\]' "$crate"; then echo "$crate is already patched" else cat >> "$crate" <