build-downstream-anchor-projects.sh 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #!/usr/bin/env bash
  2. #
  3. # Builds known downstream projects against local solana source
  4. #
  5. set -e
  6. cd "$(dirname "$0")"/..
  7. source ci/_
  8. source scripts/patch-crates.sh
  9. source scripts/read-cargo-variable.sh
  10. source scripts/patch-spl-crates-for-anchor.sh
  11. anchor_version=$1
  12. solana_ver=$(readCargoVariable version Cargo.toml)
  13. solana_dir=$PWD
  14. cargo="$solana_dir"/cargo
  15. cargo_build_sbf="$solana_dir"/cargo-build-sbf
  16. cargo_test_sbf="$solana_dir"/cargo-test-sbf
  17. mkdir -p target/downstream-projects-anchor
  18. cd target/downstream-projects-anchor
  19. update_anchor_dependencies() {
  20. declare project_root="$1"
  21. declare anchor_ver="$2"
  22. declare tomls=()
  23. while IFS='' read -r line; do tomls+=("$line"); done < <(find "$project_root" -name Cargo.toml)
  24. sed -i -e "s#\(anchor-lang = \"\)[^\"]*\(\"\)#\1=$anchor_ver\2#g" "${tomls[@]}" || return $?
  25. sed -i -e "s#\(anchor-spl = \"\)[^\"]*\(\"\)#\1=$anchor_ver\2#g" "${tomls[@]}" || return $?
  26. sed -i -e "s#\(anchor-lang = { version = \"\)[^\"]*\(\"\)#\1=$anchor_ver\2#g" "${tomls[@]}" || return $?
  27. sed -i -e "s#\(anchor-spl = { version = \"\)[^\"]*\(\"\)#\1=$anchor_ver\2#g" "${tomls[@]}" || return $?
  28. }
  29. patch_crates_io_anchor() {
  30. declare Cargo_toml="$1"
  31. declare anchor_dir="$2"
  32. cat >> "$Cargo_toml" <<EOF
  33. anchor-lang = { path = "$anchor_dir/lang" }
  34. anchor-spl = { path = "$anchor_dir/spl" }
  35. EOF
  36. }
  37. # NOTE This isn't run in a subshell to get $anchor_dir and $anchor_ver
  38. anchor() {
  39. set -x
  40. rm -rf spl
  41. git clone https://github.com/solana-labs/solana-program-library.git spl
  42. cd spl || exit 1
  43. ./patch.crates-io.sh "$solana_dir"
  44. spl_dir=$PWD
  45. get_spl_versions "$spl_dir"
  46. cd ..
  47. rm -rf anchor
  48. git clone https://github.com/coral-xyz/anchor.git
  49. cd anchor || exit 1
  50. # checkout tag
  51. if [[ -n "$anchor_version" ]]; then
  52. git checkout "$anchor_version"
  53. fi
  54. # copy toolchain file to use solana's rust version
  55. cp "$solana_dir"/rust-toolchain.toml .
  56. update_solana_dependencies . "$solana_ver"
  57. patch_crates_io_solana Cargo.toml "$solana_dir"
  58. patch_spl_crates . Cargo.toml "$spl_dir"
  59. # Exclude `avm` tests because they don't depend on Solana or SPL
  60. $cargo test --workspace --exclude avm
  61. # serum_dex and mpl-token-metadata are using caret versions of solana and SPL dependencies
  62. # rather pull and patch those as well, ignore for now
  63. # (cd spl && $cargo_build_sbf --features dex metadata stake)
  64. (cd spl && $cargo_build_sbf --features stake)
  65. (cd client && $cargo test --all-features)
  66. anchor_dir=$PWD
  67. anchor_ver=$(readCargoVariable version "$anchor_dir"/lang/Cargo.toml)
  68. cd "$solana_dir"/target/downstream-projects-anchor
  69. }
  70. openbook() {
  71. # Openbook-v2 is still using cargo 1.70.0, which is not compatible with the latest main
  72. rm -rf openbook-v2
  73. git clone https://github.com/openbook-dex/openbook-v2.git
  74. cd openbook-v2
  75. update_solana_dependencies . "$solana_ver"
  76. patch_crates_io_solana Cargo.toml "$solana_dir"
  77. $cargo_build_sbf --features enable-gpl
  78. cd programs/openbook-v2
  79. $cargo_test_sbf --features enable-gpl
  80. }
  81. mango() {
  82. (
  83. set -x
  84. rm -rf mango-v4
  85. git clone https://github.com/blockworks-foundation/mango-v4.git
  86. cd mango-v4
  87. update_solana_dependencies . "$solana_ver"
  88. patch_crates_io_solana_no_header Cargo.toml "$solana_dir"
  89. $cargo_test_sbf --features enable-gpl
  90. )
  91. }
  92. metaplex() {
  93. (
  94. set -x
  95. rm -rf mpl-token-metadata
  96. git clone https://github.com/metaplex-foundation/mpl-token-metadata
  97. # copy toolchain file to use solana's rust version
  98. cp "$solana_dir"/rust-toolchain.toml mpl-token-metadata/
  99. cd mpl-token-metadata
  100. ./configs/program-scripts/dump.sh ./programs/bin
  101. ROOT_DIR=$(pwd)
  102. cd programs/token-metadata
  103. update_solana_dependencies . "$solana_ver"
  104. patch_crates_io_solana Cargo.toml "$solana_dir"
  105. OUT_DIR="$ROOT_DIR"/programs/bin
  106. export SBF_OUT_DIR="$OUT_DIR"
  107. $cargo_test_sbf --sbf-out-dir "${OUT_DIR}"
  108. )
  109. }
  110. _ anchor
  111. #_ metaplex
  112. #_ mango
  113. #_ openbook