178 lines
3.8 KiB
Bash
Executable File
178 lines
3.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# This script is based on Solana's upstream do.sh. If our usage of
|
|
# bpf-sdk breaks, it is best to inspect its context and check with
|
|
# Solana's latest program build workflow.
|
|
|
|
cd "$(dirname "$0")"
|
|
|
|
usage() {
|
|
cat <<EOF
|
|
Usage: do.sh <action> <project> <action specific arguments>
|
|
Supported actions:
|
|
build
|
|
build-lib
|
|
clean
|
|
clippy
|
|
doc
|
|
dump
|
|
fmt
|
|
test
|
|
update
|
|
Supported projects:
|
|
all
|
|
any directory containing a Cargo.toml file
|
|
EOF
|
|
}
|
|
|
|
sdkDir=$HOME/.local/share/solana/install/active_release/bin/sdk/bpf
|
|
profile=deploy
|
|
|
|
perform_action() {
|
|
set -e
|
|
set -x
|
|
projectDir="$PWD"/$2
|
|
targetDir=target
|
|
case "$1" in
|
|
build)
|
|
if [[ -f "$projectDir"/Xargo.toml ]]; then
|
|
# "$sdkDir"/rust/build.sh "$projectDir"
|
|
so_path="$targetDir/$profile"
|
|
cargo build-bpf --manifest-path "$projectDir/Cargo.toml"
|
|
files=`find $so_path -maxdepth 1 -type f \! -name "*_debug.so" -name "*.so"`
|
|
echo "pwd: $PWD"
|
|
for file in $files
|
|
do
|
|
cp $file ${file/.so/_debug.so} # Copy with rename
|
|
$sdkDir/scripts/strip.sh $file $file
|
|
# "$sdkDir"/dependencies/llvm-native/bin/llvm-objcopy --strip-all "$file"
|
|
done
|
|
else
|
|
echo "$projectDir does not contain a program, skipping"
|
|
fi
|
|
;;
|
|
build-lib)
|
|
(
|
|
cd "$projectDir"
|
|
echo "build $projectDir"
|
|
export RUSTFLAGS="${@:3}"
|
|
cargo build
|
|
)
|
|
;;
|
|
clean)
|
|
"$sdkDir"/rust/clean.sh "$projectDir"
|
|
;;
|
|
clippy)
|
|
(
|
|
cd "$projectDir"
|
|
echo "clippy $projectDir"
|
|
cargo +nightly clippy --features=program ${@:3}
|
|
)
|
|
;;
|
|
doc)
|
|
(
|
|
cd "$projectDir"
|
|
echo "generating docs $projectDir"
|
|
cargo doc ${@:3}
|
|
)
|
|
;;
|
|
dump)
|
|
# Dump depends on tools that are not installed by default and must be installed manually
|
|
# - greadelf
|
|
# - rustfilt
|
|
(
|
|
pwd
|
|
"$0" build "$2"
|
|
|
|
so_path="$targetDir/$profile"
|
|
files=`find $so_path -maxdepth 1 -type f \! -name "*_debug.so" -name "*.so"`
|
|
for file in $files
|
|
do
|
|
dump_filename="${file}_dump"
|
|
echo $file
|
|
echo $dump_filename
|
|
|
|
if [ -f "$file" ]; then
|
|
ls \
|
|
-la \
|
|
"$file" \
|
|
>"${dump_filename}_mangled.txt"
|
|
greadelf \
|
|
-aW \
|
|
"$file" \
|
|
>>"${dump_filename}_mangled.txt"
|
|
"$sdkDir/dependencies/llvm-native/bin/llvm-objdump" \
|
|
-print-imm-hex \
|
|
--source \
|
|
--disassemble \
|
|
"$file" \
|
|
>>"${dump_filename}_mangled.txt"
|
|
sed \
|
|
s/://g \
|
|
<"${dump_filename}_mangled.txt" |
|
|
rustfilt \
|
|
>"${dump_filename}.txt"
|
|
else
|
|
echo "Warning: No dump created, cannot find: $file"
|
|
fi
|
|
done
|
|
)
|
|
;;
|
|
fmt)
|
|
(
|
|
cd "$projectDir"
|
|
echo "formatting $projectDir"
|
|
cargo fmt ${@:3}
|
|
)
|
|
;;
|
|
help)
|
|
usage
|
|
exit
|
|
;;
|
|
test)
|
|
(
|
|
cd "$projectDir"
|
|
echo "test $projectDir"
|
|
cargo test --features=program ${@:3}
|
|
)
|
|
;;
|
|
# update)
|
|
# mkdir -p $sdkParentDir
|
|
# ./bpf-sdk-install.sh $sdkParentDir
|
|
# ;;
|
|
*)
|
|
echo "Error: Unknown command"
|
|
usage
|
|
exit
|
|
;;
|
|
esac
|
|
}
|
|
|
|
set -e
|
|
if [[ $1 == "update" ]]; then
|
|
perform_action "$1"
|
|
exit
|
|
else
|
|
if [[ "$#" -lt 2 ]]; then
|
|
usage
|
|
exit
|
|
fi
|
|
if [[ ! -d "$sdkDir" ]]; then
|
|
true
|
|
# ./do.sh update
|
|
fi
|
|
fi
|
|
|
|
if [[ $2 == "all" ]]; then
|
|
# Perform operation on all projects
|
|
for project in */; do
|
|
if [[ -f "$project"Cargo.toml ]]; then
|
|
perform_action "$1" "${project%/}" ${@:3}
|
|
else
|
|
continue
|
|
fi
|
|
done
|
|
else
|
|
# Perform operation on requested project
|
|
perform_action "$1" "$2" "${@:3}"
|
|
fi
|