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 modifiactions is easy to see.
12 ### If no environmental variables are set the scritp 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
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
)
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}"
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"
42 if command -v curl
> /dev
/null
; then
43 DOWNLOAD_METHOD
="curl"
45 DOWNLOAD_METHOD
="wget --output-document=-"
49 sed -rn 's/^### ?//;T;p' "$0"
54 if [ -z "$CHECK_INSTALLED" ]; then
57 SEARCH_PATTERN
="Installed-Size"
59 while IFS
= read -r line
; do
60 if [ "$line" = "Package: $2" ]; then
63 if [ -n "$FOUND_PACKAGE" ]; then
66 echo "$line" | cut
-d ' ' -f 2
75 for PACKAGE
in $PACKAGES; do
76 if [ "$PACKAGE" = "libc" ]; then
79 PACKAGE_FILE
=$
(find "$BIN_DIR/packages/$ARCH/" \
80 "$BIN_DIR/targets/$TARGET/$SUBTARGET/" \
81 -name "${PACKAGE}_*.ipk" 2>/dev
/null |
head -n1)
83 if [ -z "$PACKAGE_FILE" ]; then
86 if [ -z "$CHECK_INSTALLED" ]; then
87 SIZE_LOCAL
=$
(stat
-c '%s' "$PACKAGE_FILE")
89 SIZE_LOCAL
=$
(tar tzvf
"$PACKAGE_FILE" .
/data.
tar.gz |
awk '{ print $3 }')
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"
96 if [ -n "$SIZE_UPSTREAM" ]; then
97 echo "${SIZE_DIFF} ${SIZE_LOCAL} ${SIZE_UPSTREAM} $PACKAGE"
99 echo "$PACKAGE is missing upstream"
104 if [ "$1" = "-h" ]; then
109 if [ "$1" = "-p" ]; then
113 echo "Compare packages of $TARGET/$SUBTARGET/$ARCH":
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
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"
134 if [ -z "$CHECK_INSTALLED" ]; then
135 echo "Checking IPK package size"
137 echo "Checking installed size"
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
147 echo "Comparing package sizes..."
148 echo "Change Local Remote Package"
149 compare_sizes |
sort -g -r