check-abi.sh raw
1 #!/bin/sh
2
3 set -eu
4
5 default_base_version="$(git describe --match "v*.*.*" --abbrev=0)"
6 default_new_version="HEAD"
7
8 display_help_and_exit() {
9 echo "Usage: $0 [<base_ver> [<new_ver>]]"
10 echo ""
11 echo "Description: This script uses the ABI Compliance Checker tool to determine if the ABI"
12 echo " of a new version of libsecp256k1 has changed in a backward-incompatible way."
13 echo ""
14 echo "Options:"
15 echo " base_ver Specify the base version as a git commit-ish"
16 echo " (default: most recent reachable tag matching \"v.*.*\", currently \"$default_base_version\")"
17 echo " new_ver Specify the new version as a git commit-ish"
18 echo " (default: $default_new_version)"
19 echo " -h, --help Display this help message"
20 exit 0
21 }
22
23 if [ "$#" -eq 0 ]; then
24 base_version="$default_base_version"
25 new_version="$default_new_version"
26 elif [ "$#" -eq 1 ] && { [ "$1" = "-h" ] || [ "$1" = "--help" ]; }; then
27 display_help_and_exit
28 elif [ "$#" -eq 1 ] || [ "$#" -eq 2 ]; then
29 base_version="$1"
30 if [ "$#" -eq 2 ]; then
31 new_version="$2"
32 fi
33 else
34 echo "Invalid usage. See help:"
35 echo ""
36 display_help_and_exit
37 fi
38
39 checkout_and_build() {
40 _orig_dir="$(pwd)"
41 git worktree add --detach "$1" "$2"
42 cd "$1"
43 mkdir build && cd build
44 cmake -S .. --preset dev-mode \
45 -DCMAKE_C_COMPILER=gcc -DCMAKE_BUILD_TYPE=None -DCMAKE_C_FLAGS="-g -Og -gdwarf-4" \
46 -DSECP256K1_BUILD_BENCHMARK=OFF \
47 -DSECP256K1_BUILD_TESTS=OFF \
48 -DSECP256K1_BUILD_EXHAUSTIVE_TESTS=OFF \
49 -DSECP256K1_BUILD_CTIME_TESTS=OFF \
50 -DSECP256K1_BUILD_EXAMPLES=OFF
51 cmake --build . -j "$(nproc)"
52 abi-dumper lib/libsecp256k1.so -o ABI.dump -lver "$2" -public-headers ../include/
53 cd "$_orig_dir"
54 }
55
56 echo "Comparing $base_version (base version) to $new_version (new version)"
57 echo
58
59 base_source_dir="$(mktemp -d)"
60 checkout_and_build "$base_source_dir" "$base_version"
61
62 new_source_dir="$(mktemp -d)"
63 checkout_and_build "$new_source_dir" "$new_version"
64
65 abi-compliance-checker -lib libsecp256k1 -old "${base_source_dir}/build/ABI.dump" -new "${new_source_dir}/build/ABI.dump"
66 git worktree remove "$base_source_dir"
67 git worktree remove "$new_source_dir"
68