1 # SPDX-License-Identifier: GPL-2.0-or-later
3 # Copyright (C) 2020 Paul Spooren <mail@aparcar.org>
6 ### size_compare - compare size of OpenWrt packages against upstream
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.
12 ### If no environmental variables are set the script reads the current
13 ### .config file. The evaluated env variables are the following:
15 ### TARGET SUBTARGET ARCH PACKAGES BIN_DIR BASE_URL CHECK_INSTALLED
18 ### ./scripts/size_compare.sh
21 ### -p --package-size Check IPK package size and not installed size
22 ### -h --help This message
25 -e ^CONFIG_TARGET_BOARD= \
26 -e ^CONFIG_TARGET_SUBTARGET= \
27 -e ^CONFIG_TARGET_ARCH_PACKAGES= \
28 -e ^CONFIG_BINARY_FOLDER= \
31 CONFIG_PACKAGES
=$
(sed -n 's/^CONFIG_PACKAGE_\(.*\)=y$/\1/p' .config |
tr '\n' ' ')
33 TARGET
=${TARGET:-$CONFIG_TARGET_BOARD}
34 SUBTARGET
=${SUBTARGET:-$CONFIG_TARGET_SUBTARGET}
35 ARCH
=${ARCH:-$CONFIG_TARGET_ARCH_PACKAGES}
36 PACKAGES
=${PACKAGES:-$CONFIG_PACKAGES}
37 BIN_DIR
=${CONFIG_BINARY_FOLDER:-./bin}
38 BASE_URL
="${BASE_URL:-https://downloads.openwrt.org/snapshots}"
39 CHECK_INSTALLED
="${CHECK_INSTALLED:-y}"
41 TARGET_URL
="$BASE_URL/targets/$TARGET/$SUBTARGET/packages/Packages.gz"
42 CONFIG_URL
="$BASE_URL/targets/$TARGET/$SUBTARGET/config.buildinfo"
43 PACKAGES_URL
="$BASE_URL/packages/$ARCH/base/Packages.gz"
45 if command -v curl
> /dev
/null
; then
46 DOWNLOAD_METHOD
="curl"
48 DOWNLOAD_METHOD
="wget --output-document=-"
52 sed -rn 's/^### ?//;T;p' "$0"
57 if [ -z "$CHECK_INSTALLED" ]; then
60 SEARCH_PATTERN
="Installed-Size"
62 while IFS
= read -r line
; do
63 if [ "$line" = "Package: $2" ]; then
66 if [ -n "$FOUND_PACKAGE" ]; then
69 echo "$line" | cut
-d ' ' -f 2
79 for PACKAGE
in $PACKAGES; do
80 if [ "$PACKAGE" = "libc" ]; then
83 PACKAGE_FILE
=$
(find "$BIN_DIR/packages/$ARCH/" \
84 "$BIN_DIR/targets/$TARGET/$SUBTARGET/" \
85 -name "${PACKAGE}_*.ipk" 2>/dev
/null |
head -n1)
87 if [ -z "$PACKAGE_FILE" ]; then
90 if [ -z "$CHECK_INSTALLED" ]; then
91 SIZE_LOCAL
=$
(stat
-c '%s' "$PACKAGE_FILE")
93 SIZE_LOCAL
=$
(tar tzvf
"$PACKAGE_FILE" .
/data.
tar.gz |
awk '{ print $3 }')
95 SIZE_UPSTREAM
=$
(package_size
"$TMP_INDEX" "$PACKAGE")
96 SIZE_DIFF
="$((SIZE_LOCAL - SIZE_UPSTREAM))"
97 TOTAL_DIFF
="$((TOTAL_DIFF + SIZE_DIFF))"
98 if [ "$SIZE_DIFF" -gt 0 ]; then
99 SIZE_DIFF
="+$SIZE_DIFF"
101 if [ -n "$SIZE_UPSTREAM" ]; then
102 echo "${SIZE_DIFF} ${SIZE_LOCAL} ${SIZE_UPSTREAM} $PACKAGE"
104 echo "$PACKAGE is missing upstream"
107 echo "~~~~~~~ total change ${TOTAL_DIFF}"
110 if [ "$1" = "-h" ]; then
115 if [ "$1" = "-p" ]; then
119 echo "Compare packages of $TARGET/$SUBTARGET/$ARCH":
123 echo "Checking configuration difference"
124 TMP_CONFIG
=$
(mktemp
/tmp
/config.XXXXXX
)
125 sed -n 's/^ \+config \(.*\)/\1/p' config
/Config-build.
in config
/Config-devel.
in > "${TMP_CONFIG}-FOCUS"
126 sort .config |
grep -f "${TMP_CONFIG}-FOCUS" |
grep -v "^#" |
sort > "${TMP_CONFIG}-LOCAL"
127 mv .config .config.bak
128 "$DOWNLOAD_METHOD" "$CONFIG_URL" > .config
129 make defconfig
> /dev
/null
2> /dev
/null
130 grep -f "${TMP_CONFIG}-FOCUS" .config |
grep -v "^#" |
sort > "${TMP_CONFIG}-UPSTREAM"
131 mv .config.bak .config
134 echo " --- start config diff ---"
135 diff -u "${TMP_CONFIG}-LOCAL" "${TMP_CONFIG}-UPSTREAM"
136 echo " --- end config diff ---"
137 rm "${TMP_CONFIG}-FOCUS" "${TMP_CONFIG}-UPSTREAM" "${TMP_CONFIG}-LOCAL"
140 if [ -z "$CHECK_INSTALLED" ]; then
141 echo "Checking IPK package size"
143 echo "Checking installed size"
147 echo "Fetching latest package indexes..."
148 TMP_INDEX
=$
(mktemp
/tmp
/size_compare_package_index.XXXXXX
)
149 "$DOWNLOAD_METHOD" "$TARGET_URL" |
gzip -d > "$TMP_INDEX" ||
exit 1
150 "$DOWNLOAD_METHOD" "$PACKAGES_URL" |
gzip -d >> "$TMP_INDEX" ||
exit 1
153 echo "Comparing package sizes..."
154 echo "Change Local Remote Package"
155 compare_sizes |
sort -g -r