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