bcm53xx: 6.6: fix ASM cache workaround linking
[openwrt/openwrt.git] / scripts / size_compare.sh
1 # SPDX-License-Identifier: GPL-2.0-or-later
2 #
3 # Copyright (C) 2020 Paul Spooren <mail@aparcar.org>
4 #
5 ###
6 ### size_compare - compare size of OpenWrt packages against upstream
7 ###
8 ### The script compares locally compiled package with the package indexes
9 ### available upstream. This way the storage impact of optimizations or
10 ### feature modifications is easy to see.
11 ###
12 ### If no environmental variables are set the script reads the current
13 ### .config file. The evaluated env variables are the following:
14 ###
15 ### TARGET SUBTARGET ARCH PACKAGES BIN_DIR BASE_URL CHECK_INSTALLED
16 ###
17 ### Usage:
18 ### ./scripts/size_compare.sh
19 ###
20 ### Options:
21 ### -p --package-size Check IPK package size and not installed size
22 ### -h --help This message
23
24 CONFIG_TARGET=$(sed -n 's/^CONFIG_TARGET_BOARD="\(.*\)"$/\1/p' .config)
25 CONFIG_SUBTARGET=$(sed -n 's/^CONFIG_TARGET_SUBTARGET="\(.*\)"$/\1/p' .config)
26 CONFIG_ARCH=$(sed -n 's/^CONFIG_TARGET_ARCH_PACKAGES="\(.*\)"$/\1/p' .config)
27 CONFIG_PACKAGES=$(sed -n 's/^CONFIG_PACKAGE_\(.*\)=y$/\1/p' .config | tr '\n' ' ')
28 CONFIG_BIN_DIR=$(sed -n 's/^CONFIG_BINARY_DIR="\(.*\)"$/\1/p' .config)
29
30 TARGET=${TARGET:-$CONFIG_TARGET}
31 SUBTARGET=${SUBTARGET:-$CONFIG_SUBTARGET}
32 ARCH=${ARCH:-$CONFIG_ARCH}
33 PACKAGES=${PACKAGES:-$CONFIG_PACKAGES}
34 BIN_DIR=${CONFIG_BIN_DIR:-./bin}
35 BASE_URL="${BASE_URL:-https://downloads.openwrt.org/snapshots}"
36 CHECK_INSTALLED="${CHECK_INSTALLED:-y}"
37
38 TARGET_URL="$BASE_URL/targets/$TARGET/$SUBTARGET/packages/Packages.gz"
39 CONFIG_URL="$BASE_URL/targets/$TARGET/$SUBTARGET/config.buildinfo"
40 PACKAGES_URL="$BASE_URL/packages/$ARCH/base/Packages.gz"
41
42 if command -v curl > /dev/null; then
43 DOWNLOAD_METHOD="curl"
44 else
45 DOWNLOAD_METHOD="wget --output-document=-"
46 fi
47
48 help() {
49 sed -rn 's/^### ?//;T;p' "$0"
50 }
51
52 package_size () {
53 FOUND_PACKAGE=
54 if [ -z "$CHECK_INSTALLED" ]; then
55 SEARCH_PATTERN="Size"
56 else
57 SEARCH_PATTERN="Installed-Size"
58 fi
59 while IFS= read -r line; do
60 if [ "$line" = "Package: $2" ]; then
61 FOUND_PACKAGE=y
62 fi
63 if [ -n "$FOUND_PACKAGE" ]; then
64 case $line in
65 "$SEARCH_PATTERN"*)
66 echo "$line" | cut -d ' ' -f 2
67 break
68 ;;
69 esac
70 fi
71 done < "$1"
72 }
73
74 compare_sizes () {
75 for PACKAGE in $PACKAGES; do
76 if [ "$PACKAGE" = "libc" ]; then
77 continue
78 fi
79 PACKAGE_FILE=$(find "$BIN_DIR/packages/$ARCH/" \
80 "$BIN_DIR/targets/$TARGET/$SUBTARGET/" \
81 -name "${PACKAGE}_*.ipk" 2>/dev/null | head -n1)
82
83 if [ -z "$PACKAGE_FILE" ]; then
84 continue
85 fi
86 if [ -z "$CHECK_INSTALLED" ]; then
87 SIZE_LOCAL=$(stat -c '%s' "$PACKAGE_FILE")
88 else
89 SIZE_LOCAL=$(tar tzvf "$PACKAGE_FILE" ./data.tar.gz | awk '{ print $3 }')
90 fi
91 SIZE_UPSTREAM=$(package_size "$TMP_INDEX" "$PACKAGE")
92 SIZE_DIFF="$((SIZE_LOCAL-SIZE_UPSTREAM))"
93 if [ "$SIZE_DIFF" -gt 0 ]; then
94 SIZE_DIFF="+$SIZE_DIFF"
95 fi
96 if [ -n "$SIZE_UPSTREAM" ]; then
97 echo "${SIZE_DIFF} ${SIZE_LOCAL} ${SIZE_UPSTREAM} $PACKAGE"
98 else
99 echo "$PACKAGE is missing upstream"
100 fi
101 done
102 }
103
104 if [ "$1" = "-h" ]; then
105 help
106 exit 0
107 fi
108
109 if [ "$1" = "-p" ]; then
110 CHECK_INSTALLED=
111 fi
112
113 echo "Compare packages of $TARGET/$SUBTARGET/$ARCH":
114 echo "$PACKAGES"
115 echo
116
117 echo "Checking configuration difference"
118 TMP_CONFIG=$(mktemp /tmp/config.XXXXXX)
119 sed -n 's/^ \+config \(.*\)/\1/p' config/Config-build.in config/Config-devel.in > "${TMP_CONFIG}-FOCUS"
120 sort .config | grep -f "${TMP_CONFIG}-FOCUS" | grep -v "^#" | sort > "${TMP_CONFIG}-LOCAL"
121 mv .config .config.bak
122 "$DOWNLOAD_METHOD" "$CONFIG_URL" > .config
123 make defconfig > /dev/null 2> /dev/null
124 grep -f "${TMP_CONFIG}-FOCUS" .config | grep -v "^#" | sort > "${TMP_CONFIG}-UPSTREAM"
125 mv .config.bak .config
126
127 echo
128 echo " --- start config diff ---"
129 diff -u "${TMP_CONFIG}-LOCAL" "${TMP_CONFIG}-UPSTREAM"
130 echo " --- end config diff ---"
131 rm "${TMP_CONFIG}-FOCUS" "${TMP_CONFIG}-UPSTREAM" "${TMP_CONFIG}-LOCAL"
132 echo
133
134 if [ -z "$CHECK_INSTALLED" ]; then
135 echo "Checking IPK package size"
136 else
137 echo "Checking installed size"
138 fi
139 echo
140
141 echo "Fetching latest package indexes..."
142 TMP_INDEX=$(mktemp /tmp/size_compare_package_index.XXXXXX)
143 "$DOWNLOAD_METHOD" "$TARGET_URL" | gzip -d > "$TMP_INDEX" || exit 1
144 "$DOWNLOAD_METHOD" "$PACKAGES_URL" | gzip -d >> "$TMP_INDEX" || exit 1
145 echo
146
147 echo "Comparing package sizes..."
148 echo "Change Local Remote Package"
149 compare_sizes | sort -g -r
150
151 rm "$TMP_INDEX"