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