summaryrefslogtreecommitdiffstats
path: root/scripts/sstate-sysroot-cruft.sh
diff options
context:
space:
mode:
authorMartin Jansa <martin.jansa@gmail.com>2014-08-10 20:41:53 +0200
committerRichard Purdie <richard.purdie@linuxfoundation.org>2014-08-11 12:30:51 +0100
commitd43b4392bb2e0d3d48457b5283fe0c43bb203e60 (patch)
tree1beb6e446b4843cae643359222295165c57fae9f /scripts/sstate-sysroot-cruft.sh
parentf62150b09e303b157cd9edd446ccf256a6c3a33f (diff)
downloadpoky-d43b4392bb2e0d3d48457b5283fe0c43bb203e60.tar.gz
sstate-sysroot-cruft.sh: Improve to use it from CI
* strip tmpdir prefix, so that we have shorter paths which aren't builder specific * use '#' for regexp delimiter so that we don't need to prefix forward slashes in paths * extend default whitelist to cover typical cases * add parameter for external whitelist file * use number of found paths as return code, so that CI can easily report error when new untracked files are found * use .txt suffix for all output files, so that they can be easily viewed in browser * add populate_sysroot task, because somewhere between dora and daisy the populate-sysroot files in sstate-control were renamed to have underscore instead of dash * only few entries not covered by this default whitelist were found in world build (but I'll leave these for people to whitelist, because they are not generated in most builds) * [^/]*/home/builder home directory from meta/recipes-graphics/builder/builder_0.1.bb * [^/]*/usr/src/kernel/patches * [^/]*/usr/lib/gdk-pixbuf-2.0/.*/loaders.cache 3 places are using this, not sure which one creates it meta/recipes-gnome/gdk-pixbuf/gdk-pixbuf_2.30.8.bb: GDK_PIXBUF_MODULE_FILE=${STAGING_LIBDIR_NATIVE}/gdk-pixbuf-2.0/${LIBV}/loaders.cache meta/recipes-gnome/gtk+/gtk-update-icon-cache-native_3.4.4.bb: GDK_PIXBUF_MODULE_FILE=${STAGING_LIBDIR_NATIVE}/gdk-pixbuf-2.0/2.10.0/loaders.cache scripts/postinst-intercepts/update_pixbuf_cache: >$GDK_PIXBUF_MODULEDIR/../loaders.cache && \ sed -i -e "s:$D::g" $GDK_PIXBUF_MODULEDIR/../loaders.cache (From OE-Core rev: b1bfec63949e16abe8c11c34530dfbfb176c04cd) Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/sstate-sysroot-cruft.sh')
-rwxr-xr-xscripts/sstate-sysroot-cruft.sh96
1 files changed, 85 insertions, 11 deletions
diff --git a/scripts/sstate-sysroot-cruft.sh b/scripts/sstate-sysroot-cruft.sh
index ca2316cdcc..f62485eaaa 100755
--- a/scripts/sstate-sysroot-cruft.sh
+++ b/scripts/sstate-sysroot-cruft.sh
@@ -17,6 +17,15 @@ Options:
17 --tmpdir=<tmpdir> 17 --tmpdir=<tmpdir>
18 Specify tmpdir, will use the environment variable TMPDIR if it is not specified. 18 Specify tmpdir, will use the environment variable TMPDIR if it is not specified.
19 Something like /OE/oe-core/tmp-eglibc (no / at the end). 19 Something like /OE/oe-core/tmp-eglibc (no / at the end).
20
21 --whitelist=<whitelist-file>
22 Text file, each line is regular expression for paths we want to ignore in resulting diff.
23 You can use diff file from the script output, if it contains only expected exceptions.
24 '#' is used as regexp delimiter, so you don't need to prefix forward slashes in paths.
25 ^ and $ is automatically added, so provide only the middle part.
26 Lines starting with '#' are ignored as comments.
27 All paths are relative to "sysroots" directory.
28 Directories don't end with forward slash.
20EOF 29EOF
21} 30}
22 31
@@ -33,6 +42,11 @@ while [ -n "$1" ]; do
33 [ -d "$tmpdir" ] || echo_error "Invalid argument to --tmpdir" 42 [ -d "$tmpdir" ] || echo_error "Invalid argument to --tmpdir"
34 shift 43 shift
35 ;; 44 ;;
45 --whitelist=*)
46 fwhitelist=`echo $1 | sed -e 's#^--whitelist=##' | xargs readlink -e`
47 [ -f "$fwhitelist" ] || echo_error "Invalid argument to --whitelist"
48 shift
49 ;;
36 --help|-h) 50 --help|-h)
37 usage 51 usage
38 exit 0 52 exit 0
@@ -51,28 +65,88 @@ done
51[ -d "$tmpdir" ] || echo_error "Invalid tmpdir \"$tmpdir\"" 65[ -d "$tmpdir" ] || echo_error "Invalid tmpdir \"$tmpdir\""
52 66
53OUTPUT=${tmpdir}/sysroot.cruft.`date "+%s"` 67OUTPUT=${tmpdir}/sysroot.cruft.`date "+%s"`
54WHITELIST="\/var\/pseudo\($\|\/[^\/]*$\) \/shlibs$ \.pyc$ \.pyo$" 68
69# top level directories
70WHITELIST="[^/]*"
71
72# generated by base-passwd recipe
73WHITELIST="${WHITELIST} \
74 .*/etc/group-\? \
75 .*/etc/passwd-\? \
76"
77# generated by pseudo-native
78WHITELIST="${WHITELIST} \
79 .*/var/pseudo \
80 .*/var/pseudo/[^/]* \
81"
82
83# generated by package.bbclass:SHLIBSDIRS = "${PKGDATA_DIR}/${MLPREFIX}shlibs"
84WHITELIST="${WHITELIST} \
85 .*/shlibs \
86 .*/pkgdata \
87"
88
89# generated by python
90WHITELIST="${WHITELIST} \
91 .*\.pyc \
92 .*\.pyo \
93"
94
95# generated by sgml-common-native
96WHITELIST="${WHITELIST} \
97 .*/etc/sgml/sgml-docbook.bak \
98"
99
100# generated by toolchain
101WHITELIST="${WHITELIST} \
102 [^/]*-tcbootstrap/lib \
103"
104
105# generated by useradd.bbclass
106WHITELIST="${WHITELIST} \
107 [^/]*/home \
108 [^/]*/home/xuser \
109"
110
111SYSROOTS="`readlink -f ${tmpdir}`/sysroots/"
55 112
56mkdir ${OUTPUT} 113mkdir ${OUTPUT}
57find ${tmpdir}/sstate-control -name \*.populate-sysroot\* -o -name \*.package\* | xargs cat | grep sysroots | \ 114find ${tmpdir}/sstate-control -name \*.populate-sysroot\* -o -name \*.populate_sysroot\* -o -name \*.package\* | xargs cat | grep sysroots | \
58 sed 's#/$##g; s#///*#/#g' | \ 115 sed 's#/$##g; s#///*#/#g' | \
59 # work around for paths ending with / for directories and multiplied // (e.g. paths to native sysroot) 116 # work around for paths ending with / for directories and multiplied // (e.g. paths to native sysroot)
60 sort > ${OUTPUT}/master.list.all 117 sort | sed "s#^${SYSROOTS}##g" > ${OUTPUT}/master.list.all.txt
61sort -u ${OUTPUT}/master.list.all > ${OUTPUT}/master.list # -u because some directories are listed for more recipes 118sort -u ${OUTPUT}/master.list.all.txt > ${OUTPUT}/master.list.txt # -u because some directories are listed for more recipes
62find ${tmpdir}/sysroots/ | \ 119find ${tmpdir}/sysroots/ | \
63 sort > ${OUTPUT}/sysroot.list 120 sort | sed "s#^${SYSROOTS}##g" > ${OUTPUT}/sysroot.list.txt
64 121
65diff ${OUTPUT}/master.list.all ${OUTPUT}/master.list > ${OUTPUT}/duplicates 122diff ${OUTPUT}/master.list.all.txt ${OUTPUT}/master.list.txt > ${OUTPUT}/duplicates.txt
66diff ${OUTPUT}/master.list ${OUTPUT}/sysroot.list > ${OUTPUT}/diff.all 123diff ${OUTPUT}/master.list.txt ${OUTPUT}/sysroot.list.txt > ${OUTPUT}/diff.all.txt
67 124
68cp ${OUTPUT}/diff.all ${OUTPUT}/diff 125grep "^> ." ${OUTPUT}/diff.all.txt | sed 's/^> //g' > ${OUTPUT}/diff.txt
69for item in ${WHITELIST}; do 126for item in ${WHITELIST}; do
70 sed -i "/${item}/d" ${OUTPUT}/diff; 127 sed -i "\\#^${item}\$#d" ${OUTPUT}/diff.txt;
128 echo "${item}" >> ${OUTPUT}/used.whitelist.txt
71done 129done
72 130
131if [ -s "$fwhitelist" ] ; then
132 cat $fwhitelist >> ${OUTPUT}/used.whitelist.txt
133 cat $fwhitelist | grep -v '^#' | while read item; do
134 sed -i "\\#^${item}\$#d" ${OUTPUT}/diff.txt;
135 done
136fi
73# too many false positives for directories 137# too many false positives for directories
74# echo "Following files are installed in sysroot at least twice" 138# echo "Following files are installed in sysroot at least twice"
75# cat ${OUTPUT}/duplicates 139# cat ${OUTPUT}/duplicates
76 140
77echo "Following files are installed in sysroot, but not tracked by sstate" 141RESULT=`cat ${OUTPUT}/diff.txt | wc -l`
78cat ${OUTPUT}/diff 142
143if [ "${RESULT}" != "0" ] ; then
144 echo "ERROR: ${RESULT} issues were found."
145 echo "ERROR: Following files are installed in sysroot, but not tracked by sstate:"
146 cat ${OUTPUT}/diff.txt
147else
148 echo "INFO: All files are tracked by sstate or were explicitly ignored by this script"
149fi
150
151echo "INFO: Output written in: ${OUTPUT}"
152exit ${RESULT}