blob: f62485eaaa3abc46ed9ccd7a0271dcde0dca45e4 [file] [log] [blame]
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001#!/bin/sh
2
3# Used to find files installed in sysroot which are not tracked by sstate manifest
4
5# Global vars
6tmpdir=
7
8usage () {
9 cat << EOF
10Welcome to sysroot cruft finding utility.
11$0 <OPTION>
12
13Options:
14 -h, --help
15 Display this help and exit.
16
17 --tmpdir=<tmpdir>
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).
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.
29EOF
30}
31
32# Print error information and exit.
33echo_error () {
34 echo "ERROR: $1" >&2
35 exit 1
36}
37
38while [ -n "$1" ]; do
39 case $1 in
40 --tmpdir=*)
41 tmpdir=`echo $1 | sed -e 's#^--tmpdir=##' | xargs readlink -e`
42 [ -d "$tmpdir" ] || echo_error "Invalid argument to --tmpdir"
43 shift
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 ;;
50 --help|-h)
51 usage
52 exit 0
53 ;;
54 *)
55 echo "Invalid arguments $*"
56 echo_error "Try '$0 -h' for more information."
57 ;;
58 esac
59done
60
61# sstate cache directory, use environment variable TMPDIR
62# if it was not specified, otherwise, error.
63[ -n "$tmpdir" ] || tmpdir=$TMPDIR
64[ -n "$tmpdir" ] || echo_error "No tmpdir found!"
65[ -d "$tmpdir" ] || echo_error "Invalid tmpdir \"$tmpdir\""
66
67OUTPUT=${tmpdir}/sysroot.cruft.`date "+%s"`
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/"
112
113mkdir ${OUTPUT}
114find ${tmpdir}/sstate-control -name \*.populate-sysroot\* -o -name \*.populate_sysroot\* -o -name \*.package\* | xargs cat | grep sysroots | \
115 sed 's#/$##g; s#///*#/#g' | \
116 # work around for paths ending with / for directories and multiplied // (e.g. paths to native sysroot)
117 sort | sed "s#^${SYSROOTS}##g" > ${OUTPUT}/master.list.all.txt
118sort -u ${OUTPUT}/master.list.all.txt > ${OUTPUT}/master.list.txt # -u because some directories are listed for more recipes
119find ${tmpdir}/sysroots/ | \
120 sort | sed "s#^${SYSROOTS}##g" > ${OUTPUT}/sysroot.list.txt
121
122diff ${OUTPUT}/master.list.all.txt ${OUTPUT}/master.list.txt > ${OUTPUT}/duplicates.txt
123diff ${OUTPUT}/master.list.txt ${OUTPUT}/sysroot.list.txt > ${OUTPUT}/diff.all.txt
124
125grep "^> ." ${OUTPUT}/diff.all.txt | sed 's/^> //g' > ${OUTPUT}/diff.txt
126for item in ${WHITELIST}; do
127 sed -i "\\#^${item}\$#d" ${OUTPUT}/diff.txt;
128 echo "${item}" >> ${OUTPUT}/used.whitelist.txt
129done
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
137# too many false positives for directories
138# echo "Following files are installed in sysroot at least twice"
139# cat ${OUTPUT}/duplicates
140
141RESULT=`cat ${OUTPUT}/diff.txt | wc -l`
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}