1*4882a593Smuzhiyun 2*4882a593Smuzhiyunoe_soinstall() { 3*4882a593Smuzhiyun # Purpose: Install shared library file and 4*4882a593Smuzhiyun # create the necessary links 5*4882a593Smuzhiyun # Example: oe_soinstall libfoo.so.1.2.3 ${D}${libdir} 6*4882a593Smuzhiyun libname=`basename $1` 7*4882a593Smuzhiyun case "$libname" in 8*4882a593Smuzhiyun *.so) 9*4882a593Smuzhiyun bbfatal "oe_soinstall: Shared library must haved versioned filename (e.g. libfoo.so.1.2.3)" 10*4882a593Smuzhiyun ;; 11*4882a593Smuzhiyun esac 12*4882a593Smuzhiyun install -m 755 $1 $2/$libname 13*4882a593Smuzhiyun sonamelink=`${HOST_PREFIX}readelf -d $1 |grep 'Library soname:' |sed -e 's/.*\[\(.*\)\].*/\1/'` 14*4882a593Smuzhiyun if [ -z $sonamelink ]; then 15*4882a593Smuzhiyun bbfatal "oe_soinstall: $libname is missing ELF tag 'SONAME'." 16*4882a593Smuzhiyun fi 17*4882a593Smuzhiyun solink=`echo $libname | sed -e 's/\.so\..*/.so/'` 18*4882a593Smuzhiyun ln -sf $libname $2/$sonamelink 19*4882a593Smuzhiyun ln -sf $libname $2/$solink 20*4882a593Smuzhiyun} 21*4882a593Smuzhiyun 22*4882a593Smuzhiyunoe_libinstall() { 23*4882a593Smuzhiyun # Purpose: Install a library, in all its forms 24*4882a593Smuzhiyun # Example 25*4882a593Smuzhiyun # 26*4882a593Smuzhiyun # oe_libinstall libltdl ${STAGING_LIBDIR}/ 27*4882a593Smuzhiyun # oe_libinstall -C src/libblah libblah ${D}/${libdir}/ 28*4882a593Smuzhiyun dir="" 29*4882a593Smuzhiyun libtool="" 30*4882a593Smuzhiyun silent="" 31*4882a593Smuzhiyun require_static="" 32*4882a593Smuzhiyun require_shared="" 33*4882a593Smuzhiyun while [ "$#" -gt 0 ]; do 34*4882a593Smuzhiyun case "$1" in 35*4882a593Smuzhiyun -C) 36*4882a593Smuzhiyun shift 37*4882a593Smuzhiyun dir="$1" 38*4882a593Smuzhiyun ;; 39*4882a593Smuzhiyun -s) 40*4882a593Smuzhiyun silent=1 41*4882a593Smuzhiyun ;; 42*4882a593Smuzhiyun -a) 43*4882a593Smuzhiyun require_static=1 44*4882a593Smuzhiyun ;; 45*4882a593Smuzhiyun -so) 46*4882a593Smuzhiyun require_shared=1 47*4882a593Smuzhiyun ;; 48*4882a593Smuzhiyun -*) 49*4882a593Smuzhiyun bbfatal "oe_libinstall: unknown option: $1" 50*4882a593Smuzhiyun ;; 51*4882a593Smuzhiyun *) 52*4882a593Smuzhiyun break; 53*4882a593Smuzhiyun ;; 54*4882a593Smuzhiyun esac 55*4882a593Smuzhiyun shift 56*4882a593Smuzhiyun done 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun libname="$1" 59*4882a593Smuzhiyun shift 60*4882a593Smuzhiyun destpath="$1" 61*4882a593Smuzhiyun if [ -z "$destpath" ]; then 62*4882a593Smuzhiyun bbfatal "oe_libinstall: no destination path specified" 63*4882a593Smuzhiyun fi 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun __runcmd () { 66*4882a593Smuzhiyun if [ -z "$silent" ]; then 67*4882a593Smuzhiyun echo >&2 "oe_libinstall: $*" 68*4882a593Smuzhiyun fi 69*4882a593Smuzhiyun $* 70*4882a593Smuzhiyun } 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun if [ -z "$dir" ]; then 73*4882a593Smuzhiyun dir=`pwd` 74*4882a593Smuzhiyun fi 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun dotlai=$libname.lai 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun # Sanity check that the libname.lai is unique 79*4882a593Smuzhiyun number_of_files=`(cd $dir; find . -name "$dotlai") | wc -l` 80*4882a593Smuzhiyun if [ $number_of_files -gt 1 ]; then 81*4882a593Smuzhiyun bbfatal "oe_libinstall: $dotlai is not unique in $dir" 82*4882a593Smuzhiyun fi 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun dir=$dir`(cd $dir;find . -name "$dotlai") | sed "s/^\.//;s/\/$dotlai\$//;q"` 86*4882a593Smuzhiyun olddir=`pwd` 87*4882a593Smuzhiyun __runcmd cd $dir 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun lafile=$libname.la 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun # If such file doesn't exist, try to cut version suffix 92*4882a593Smuzhiyun if [ ! -f "$lafile" ]; then 93*4882a593Smuzhiyun libname1=`echo "$libname" | sed 's/-[0-9.]*$//'` 94*4882a593Smuzhiyun lafile1=$libname.la 95*4882a593Smuzhiyun if [ -f "$lafile1" ]; then 96*4882a593Smuzhiyun libname=$libname1 97*4882a593Smuzhiyun lafile=$lafile1 98*4882a593Smuzhiyun fi 99*4882a593Smuzhiyun fi 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun if [ -f "$lafile" ]; then 102*4882a593Smuzhiyun # libtool archive 103*4882a593Smuzhiyun eval `cat $lafile|grep "^library_names="` 104*4882a593Smuzhiyun libtool=1 105*4882a593Smuzhiyun else 106*4882a593Smuzhiyun library_names="$libname.so* $libname.dll.a $libname.*.dylib" 107*4882a593Smuzhiyun fi 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun __runcmd install -d $destpath/ 110*4882a593Smuzhiyun dota=$libname.a 111*4882a593Smuzhiyun if [ -f "$dota" -o -n "$require_static" ]; then 112*4882a593Smuzhiyun rm -f $destpath/$dota 113*4882a593Smuzhiyun __runcmd install -m 0644 $dota $destpath/ 114*4882a593Smuzhiyun fi 115*4882a593Smuzhiyun if [ -f "$dotlai" -a -n "$libtool" ]; then 116*4882a593Smuzhiyun rm -f $destpath/$libname.la 117*4882a593Smuzhiyun __runcmd install -m 0644 $dotlai $destpath/$libname.la 118*4882a593Smuzhiyun fi 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun for name in $library_names; do 121*4882a593Smuzhiyun files=`eval echo $name` 122*4882a593Smuzhiyun for f in $files; do 123*4882a593Smuzhiyun if [ ! -e "$f" ]; then 124*4882a593Smuzhiyun if [ -n "$libtool" ]; then 125*4882a593Smuzhiyun bbfatal "oe_libinstall: $dir/$f not found." 126*4882a593Smuzhiyun fi 127*4882a593Smuzhiyun elif [ -L "$f" ]; then 128*4882a593Smuzhiyun __runcmd cp -P "$f" $destpath/ 129*4882a593Smuzhiyun elif [ ! -L "$f" ]; then 130*4882a593Smuzhiyun libfile="$f" 131*4882a593Smuzhiyun rm -f $destpath/$libfile 132*4882a593Smuzhiyun __runcmd install -m 0755 $libfile $destpath/ 133*4882a593Smuzhiyun fi 134*4882a593Smuzhiyun done 135*4882a593Smuzhiyun done 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun if [ -z "$libfile" ]; then 138*4882a593Smuzhiyun if [ -n "$require_shared" ]; then 139*4882a593Smuzhiyun bbfatal "oe_libinstall: unable to locate shared library" 140*4882a593Smuzhiyun fi 141*4882a593Smuzhiyun elif [ -z "$libtool" ]; then 142*4882a593Smuzhiyun # special case hack for non-libtool .so.#.#.# links 143*4882a593Smuzhiyun baselibfile=`basename "$libfile"` 144*4882a593Smuzhiyun if (echo $baselibfile | grep -qE '^lib.*\.so\.[0-9.]*$'); then 145*4882a593Smuzhiyun sonamelink=`${HOST_PREFIX}readelf -d $libfile |grep 'Library soname:' |sed -e 's/.*\[\(.*\)\].*/\1/'` 146*4882a593Smuzhiyun solink=`echo $baselibfile | sed -e 's/\.so\..*/.so/'` 147*4882a593Smuzhiyun if [ -n "$sonamelink" -a x"$baselibfile" != x"$sonamelink" ]; then 148*4882a593Smuzhiyun __runcmd ln -sf $baselibfile $destpath/$sonamelink 149*4882a593Smuzhiyun fi 150*4882a593Smuzhiyun __runcmd ln -sf $baselibfile $destpath/$solink 151*4882a593Smuzhiyun fi 152*4882a593Smuzhiyun fi 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun __runcmd cd "$olddir" 155*4882a593Smuzhiyun} 156*4882a593Smuzhiyun 157*4882a593Smuzhiyuncreate_cmdline_wrapper () { 158*4882a593Smuzhiyun # Create a wrapper script where commandline options are needed 159*4882a593Smuzhiyun # 160*4882a593Smuzhiyun # These are useful to work around relocation issues, by passing extra options 161*4882a593Smuzhiyun # to a program 162*4882a593Smuzhiyun # 163*4882a593Smuzhiyun # Usage: create_cmdline_wrapper FILENAME <extra-options> 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun cmd=$1 166*4882a593Smuzhiyun shift 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun echo "Generating wrapper script for $cmd" 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun mv $cmd $cmd.real 171*4882a593Smuzhiyun cmdname=`basename $cmd` 172*4882a593Smuzhiyun dirname=`dirname $cmd` 173*4882a593Smuzhiyun cmdoptions=$@ 174*4882a593Smuzhiyun if [ "${base_prefix}" != "" ]; then 175*4882a593Smuzhiyun relpath=`python3 -c "import os; print(os.path.relpath('${D}${base_prefix}', '$dirname'))"` 176*4882a593Smuzhiyun cmdoptions=`echo $@ | sed -e "s:${base_prefix}:\\$realdir/$relpath:g"` 177*4882a593Smuzhiyun fi 178*4882a593Smuzhiyun cat <<END >$cmd 179*4882a593Smuzhiyun#!/bin/bash 180*4882a593Smuzhiyunrealpath=\`readlink -fn \$0\` 181*4882a593Smuzhiyunrealdir=\`dirname \$realpath\` 182*4882a593Smuzhiyunexec -a \$realdir/$cmdname \$realdir/$cmdname.real $cmdoptions "\$@" 183*4882a593SmuzhiyunEND 184*4882a593Smuzhiyun chmod +x $cmd 185*4882a593Smuzhiyun} 186*4882a593Smuzhiyun 187*4882a593Smuzhiyuncreate_wrapper () { 188*4882a593Smuzhiyun # Create a wrapper script where extra environment variables are needed 189*4882a593Smuzhiyun # 190*4882a593Smuzhiyun # These are useful to work around relocation issues, by setting environment 191*4882a593Smuzhiyun # variables which point to paths in the filesystem. 192*4882a593Smuzhiyun # 193*4882a593Smuzhiyun # Usage: create_wrapper FILENAME [[VAR=VALUE]..] 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun cmd=$1 196*4882a593Smuzhiyun shift 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun echo "Generating wrapper script for $cmd" 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun mv $cmd $cmd.real 201*4882a593Smuzhiyun cmdname=`basename $cmd` 202*4882a593Smuzhiyun dirname=`dirname $cmd` 203*4882a593Smuzhiyun exportstring=$@ 204*4882a593Smuzhiyun if [ "${base_prefix}" != "" ]; then 205*4882a593Smuzhiyun relpath=`python3 -c "import os; print(os.path.relpath('${D}${base_prefix}', '$dirname'))"` 206*4882a593Smuzhiyun exportstring=`echo $@ | sed -e "s:${base_prefix}:\\$realdir/$relpath:g"` 207*4882a593Smuzhiyun fi 208*4882a593Smuzhiyun cat <<END >$cmd 209*4882a593Smuzhiyun#!/bin/bash 210*4882a593Smuzhiyunrealpath=\`readlink -fn \$0\` 211*4882a593Smuzhiyunrealdir=\`dirname \$realpath\` 212*4882a593Smuzhiyunexport $exportstring 213*4882a593Smuzhiyunexec -a "\$0" \$realdir/$cmdname.real "\$@" 214*4882a593SmuzhiyunEND 215*4882a593Smuzhiyun chmod +x $cmd 216*4882a593Smuzhiyun} 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun# Copy files/directories from $1 to $2 but using hardlinks 219*4882a593Smuzhiyun# (preserve symlinks) 220*4882a593Smuzhiyunhardlinkdir () { 221*4882a593Smuzhiyun from=$1 222*4882a593Smuzhiyun to=$2 223*4882a593Smuzhiyun (cd $from; find . -print0 | cpio --null -pdlu $to) 224*4882a593Smuzhiyun} 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun 227*4882a593Smuzhiyundef check_app_exists(app, d): 228*4882a593Smuzhiyun app = d.expand(app).split()[0].strip() 229*4882a593Smuzhiyun path = d.getVar('PATH') 230*4882a593Smuzhiyun return bool(bb.utils.which(path, app)) 231*4882a593Smuzhiyun 232*4882a593Smuzhiyundef explode_deps(s): 233*4882a593Smuzhiyun return bb.utils.explode_deps(s) 234*4882a593Smuzhiyun 235*4882a593Smuzhiyundef base_set_filespath(path, d): 236*4882a593Smuzhiyun filespath = [] 237*4882a593Smuzhiyun extrapaths = (d.getVar("FILESEXTRAPATHS") or "") 238*4882a593Smuzhiyun # Remove default flag which was used for checking 239*4882a593Smuzhiyun extrapaths = extrapaths.replace("__default:", "") 240*4882a593Smuzhiyun # Don't prepend empty strings to the path list 241*4882a593Smuzhiyun if extrapaths != "": 242*4882a593Smuzhiyun path = extrapaths.split(":") + path 243*4882a593Smuzhiyun # The ":" ensures we have an 'empty' override 244*4882a593Smuzhiyun overrides = (":" + (d.getVar("FILESOVERRIDES") or "")).split(":") 245*4882a593Smuzhiyun overrides.reverse() 246*4882a593Smuzhiyun for o in overrides: 247*4882a593Smuzhiyun for p in path: 248*4882a593Smuzhiyun if p != "": 249*4882a593Smuzhiyun filespath.append(os.path.join(p, o)) 250*4882a593Smuzhiyun return ":".join(filespath) 251*4882a593Smuzhiyun 252*4882a593Smuzhiyundef extend_variants(d, var, extend, delim=':'): 253*4882a593Smuzhiyun """Return a string of all bb class extend variants for the given extend""" 254*4882a593Smuzhiyun variants = [] 255*4882a593Smuzhiyun whole = d.getVar(var) or "" 256*4882a593Smuzhiyun for ext in whole.split(): 257*4882a593Smuzhiyun eext = ext.split(delim) 258*4882a593Smuzhiyun if len(eext) > 1 and eext[0] == extend: 259*4882a593Smuzhiyun variants.append(eext[1]) 260*4882a593Smuzhiyun return " ".join(variants) 261*4882a593Smuzhiyun 262*4882a593Smuzhiyundef multilib_pkg_extend(d, pkg): 263*4882a593Smuzhiyun variants = (d.getVar("MULTILIB_VARIANTS") or "").split() 264*4882a593Smuzhiyun if not variants: 265*4882a593Smuzhiyun return pkg 266*4882a593Smuzhiyun pkgs = pkg 267*4882a593Smuzhiyun for v in variants: 268*4882a593Smuzhiyun pkgs = pkgs + " " + v + "-" + pkg 269*4882a593Smuzhiyun return pkgs 270*4882a593Smuzhiyun 271*4882a593Smuzhiyundef get_multilib_datastore(variant, d): 272*4882a593Smuzhiyun return oe.utils.get_multilib_datastore(variant, d) 273*4882a593Smuzhiyun 274*4882a593Smuzhiyundef all_multilib_tune_values(d, var, unique = True, need_split = True, delim = ' '): 275*4882a593Smuzhiyun """Return a string of all ${var} in all multilib tune configuration""" 276*4882a593Smuzhiyun values = [] 277*4882a593Smuzhiyun variants = (d.getVar("MULTILIB_VARIANTS") or "").split() + [''] 278*4882a593Smuzhiyun for item in variants: 279*4882a593Smuzhiyun localdata = get_multilib_datastore(item, d) 280*4882a593Smuzhiyun # We need WORKDIR to be consistent with the original datastore 281*4882a593Smuzhiyun localdata.setVar("WORKDIR", d.getVar("WORKDIR")) 282*4882a593Smuzhiyun value = localdata.getVar(var) or "" 283*4882a593Smuzhiyun if value != "": 284*4882a593Smuzhiyun if need_split: 285*4882a593Smuzhiyun for item in value.split(delim): 286*4882a593Smuzhiyun values.append(item) 287*4882a593Smuzhiyun else: 288*4882a593Smuzhiyun values.append(value) 289*4882a593Smuzhiyun if unique: 290*4882a593Smuzhiyun #we do this to keep order as much as possible 291*4882a593Smuzhiyun ret = [] 292*4882a593Smuzhiyun for value in values: 293*4882a593Smuzhiyun if not value in ret: 294*4882a593Smuzhiyun ret.append(value) 295*4882a593Smuzhiyun else: 296*4882a593Smuzhiyun ret = values 297*4882a593Smuzhiyun return " ".join(ret) 298*4882a593Smuzhiyun 299*4882a593Smuzhiyundef all_multilib_tune_list(vars, d): 300*4882a593Smuzhiyun """ 301*4882a593Smuzhiyun Return a list of ${VAR} for each variable VAR in vars from each 302*4882a593Smuzhiyun multilib tune configuration. 303*4882a593Smuzhiyun Is safe to be called from a multilib recipe/context as it can 304*4882a593Smuzhiyun figure out the original tune and remove the multilib overrides. 305*4882a593Smuzhiyun """ 306*4882a593Smuzhiyun values = {} 307*4882a593Smuzhiyun for v in vars: 308*4882a593Smuzhiyun values[v] = [] 309*4882a593Smuzhiyun values['ml'] = [''] 310*4882a593Smuzhiyun 311*4882a593Smuzhiyun variants = (d.getVar("MULTILIB_VARIANTS") or "").split() + [''] 312*4882a593Smuzhiyun for item in variants: 313*4882a593Smuzhiyun localdata = get_multilib_datastore(item, d) 314*4882a593Smuzhiyun values[v].append(localdata.getVar(v)) 315*4882a593Smuzhiyun values['ml'].append(item) 316*4882a593Smuzhiyun return values 317*4882a593Smuzhiyunall_multilib_tune_list[vardepsexclude] = "OVERRIDES" 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun# If the user hasn't set up their name/email, set some defaults 320*4882a593Smuzhiyuncheck_git_config() { 321*4882a593Smuzhiyun if ! git config user.email > /dev/null ; then 322*4882a593Smuzhiyun git config --local user.email "${PATCH_GIT_USER_EMAIL}" 323*4882a593Smuzhiyun fi 324*4882a593Smuzhiyun if ! git config user.name > /dev/null ; then 325*4882a593Smuzhiyun git config --local user.name "${PATCH_GIT_USER_NAME}" 326*4882a593Smuzhiyun fi 327*4882a593Smuzhiyun} 328