xref: /OK3568_Linux_fs/yocto/scripts/sstate-sysroot-cruft.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1#!/bin/sh
2#
3# SPDX-License-Identifier: GPL-2.0-only
4#
5# Used to find files installed in sysroot which are not tracked by sstate manifest
6
7# Global vars
8tmpdir=
9
10usage () {
11  cat << EOF
12Welcome to sysroot cruft finding utility.
13$0 <OPTION>
14
15Options:
16  -h, --help
17        Display this help and exit.
18
19  --tmpdir=<tmpdir>
20        Specify tmpdir, will use the environment variable TMPDIR if it is not specified.
21	Something like /OE/oe-core/tmp-eglibc (no / at the end).
22
23  --whitelist=<whitelist-file>
24        Text file, each line is regular expression for paths we want to ignore in resulting diff.
25        You can use diff file from the script output, if it contains only expected exceptions.
26        '#' is used as regexp delimiter, so you don't need to prefix forward slashes in paths.
27        ^ and $ is automatically added, so provide only the middle part.
28        Lines starting with '#' are ignored as comments.
29        All paths are relative to "sysroots" directory.
30        Directories don't end with forward slash.
31EOF
32}
33
34# Print error information and exit.
35echo_error () {
36  echo "ERROR: $1" >&2
37  exit 1
38}
39
40while [ -n "$1" ]; do
41  case $1 in
42    --tmpdir=*)
43      tmpdir=`echo $1 | sed -e 's#^--tmpdir=##' | xargs readlink -e`
44      [ -d "$tmpdir" ] || echo_error "Invalid argument to --tmpdir"
45      shift
46        ;;
47    --whitelist=*)
48      fwhitelist=`echo $1 | sed -e 's#^--whitelist=##' | xargs readlink -e`
49      [ -f "$fwhitelist" ] || echo_error "Invalid argument to --whitelist"
50      shift
51        ;;
52    --help|-h)
53      usage
54      exit 0
55        ;;
56    *)
57      echo "Invalid arguments $*"
58      echo_error "Try '$0 -h' for more information."
59        ;;
60  esac
61done
62
63# sstate cache directory, use environment variable TMPDIR
64# if it was not specified, otherwise, error.
65[ -n "$tmpdir" ] || tmpdir=$TMPDIR
66[ -n "$tmpdir" ] || echo_error "No tmpdir found!"
67[ -d "$tmpdir" ] || echo_error "Invalid tmpdir \"$tmpdir\""
68
69OUTPUT=${tmpdir}/sysroot.cruft.`date "+%s"`
70
71# top level directories
72WHITELIST="[^/]*"
73
74# generated by base-passwd recipe
75WHITELIST="${WHITELIST} \
76  .*/etc/group-\? \
77  .*/etc/passwd-\? \
78"
79# generated by pseudo-native
80WHITELIST="${WHITELIST} \
81  .*/var/pseudo \
82  .*/var/pseudo/[^/]* \
83"
84
85# generated by package.bbclass:SHLIBSDIRS = "${PKGDATA_DIR}/${MLPREFIX}shlibs"
86WHITELIST="${WHITELIST} \
87  .*/shlibs \
88  .*/pkgdata \
89"
90
91# generated by python
92WHITELIST="${WHITELIST} \
93  .*\.pyc \
94  .*\.pyo \
95  .*/__pycache__ \
96"
97
98# generated by lua
99WHITELIST="${WHITELIST} \
100  .*\.luac \
101"
102
103# generated by sgml-common-native
104WHITELIST="${WHITELIST} \
105  .*/etc/sgml/sgml-docbook.bak \
106"
107
108# generated by php
109WHITELIST="${WHITELIST} \
110  .*/usr/lib/php5/php/.channels \
111  .*/usr/lib/php5/php/.channels/.* \
112  .*/usr/lib/php5/php/.registry \
113  .*/usr/lib/php5/php/.registry/.* \
114  .*/usr/lib/php5/php/.depdb \
115  .*/usr/lib/php5/php/.depdblock \
116  .*/usr/lib/php5/php/.filemap \
117  .*/usr/lib/php5/php/.lock \
118"
119
120# generated by toolchain
121WHITELIST="${WHITELIST} \
122  [^/]*-tcbootstrap/lib \
123"
124
125# generated by useradd.bbclass
126WHITELIST="${WHITELIST} \
127  [^/]*/home \
128  [^/]*/home/xuser \
129  [^/]*/home/xuser/.bashrc \
130  [^/]*/home/xuser/.profile \
131  [^/]*/home/builder \
132  [^/]*/home/builder/.bashrc \
133  [^/]*/home/builder/.profile \
134"
135
136# generated by image.py for WIC
137# introduced in oe-core commit 861ce6c5d4836df1a783be3b01d2de56117c9863
138WHITELIST="${WHITELIST} \
139  [^/]*/imgdata \
140  [^/]*/imgdata/[^/]*\.env \
141"
142
143# generated by fontcache.bbclass
144WHITELIST="${WHITELIST} \
145  .*/var/cache/fontconfig/ \
146"
147
148SYSROOTS="`readlink -f ${tmpdir}`/sysroots/"
149
150mkdir ${OUTPUT}
151find ${tmpdir}/sstate-control -name \*.populate-sysroot\* -o -name \*.populate_sysroot\* -o -name \*.package\* | xargs cat | grep sysroots | \
152  sed 's#/$##g; s#///*#/#g' | \
153  # work around for paths ending with / for directories and multiplied // (e.g. paths to native sysroot)
154  sort | sed "s#^${SYSROOTS}##g" > ${OUTPUT}/master.list.all.txt
155sort -u ${OUTPUT}/master.list.all.txt > ${OUTPUT}/master.list.txt # -u because some directories are listed for more recipes
156find ${tmpdir}/sysroots/ | \
157  sort | sed "s#^${SYSROOTS}##g" > ${OUTPUT}/sysroot.list.txt
158
159diff ${OUTPUT}/master.list.all.txt ${OUTPUT}/master.list.txt > ${OUTPUT}/duplicates.txt
160diff ${OUTPUT}/master.list.txt ${OUTPUT}/sysroot.list.txt > ${OUTPUT}/diff.all.txt
161
162grep "^> ." ${OUTPUT}/diff.all.txt | sed 's/^> //g' > ${OUTPUT}/diff.txt
163for item in ${WHITELIST}; do
164  sed -i "\\#^${item}\$#d" ${OUTPUT}/diff.txt;
165  echo "${item}" >> ${OUTPUT}/used.whitelist.txt
166done
167
168if [ -s "$fwhitelist" ] ; then
169  cat $fwhitelist >> ${OUTPUT}/used.whitelist.txt
170  cat $fwhitelist | grep -v '^#' | while read item; do
171    sed -i "\\#^${item}\$#d" ${OUTPUT}/diff.txt;
172  done
173fi
174# too many false positives for directories
175# echo "Following files are installed in sysroot at least twice"
176# cat ${OUTPUT}/duplicates
177
178RESULT=`cat ${OUTPUT}/diff.txt | wc -l`
179
180if [ "${RESULT}" != "0" ] ; then
181  echo "ERROR: ${RESULT} issues were found."
182  echo "ERROR: Following files are installed in sysroot, but not tracked by sstate:"
183  cat ${OUTPUT}/diff.txt
184else
185  echo "INFO: All files are tracked by sstate or were explicitly ignored by this script"
186fi
187
188echo "INFO: Output written in: ${OUTPUT}"
189exit ${RESULT}
190