mirror of
git://git.yoctoproject.org/poky.git
synced 2025-08-22 00:42:05 +02:00

This function does something similar to the bitbake fetcher file search paths and is an old remnant of how this could have once been handled. There are no users in OE-Core and we'd always prefer the fetcher to handle this now as it handles signatures correctly. The direct OVERRIDES reference would likely break any user of the function. Remove it to be safe and ensure it isn't being used anywhere. (From OE-Core rev: d49ba0243e3d28672d16cd02753eb7e85d91bbab) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
328 lines
8.6 KiB
Plaintext
328 lines
8.6 KiB
Plaintext
|
|
oe_soinstall() {
|
|
# Purpose: Install shared library file and
|
|
# create the necessary links
|
|
# Example: oe_soinstall libfoo.so.1.2.3 ${D}${libdir}
|
|
libname=`basename $1`
|
|
case "$libname" in
|
|
*.so)
|
|
bbfatal "oe_soinstall: Shared library must haved versioned filename (e.g. libfoo.so.1.2.3)"
|
|
;;
|
|
esac
|
|
install -m 755 $1 $2/$libname
|
|
sonamelink=`${HOST_PREFIX}readelf -d $1 |grep 'Library soname:' |sed -e 's/.*\[\(.*\)\].*/\1/'`
|
|
if [ -z $sonamelink ]; then
|
|
bbfatal "oe_soinstall: $libname is missing ELF tag 'SONAME'."
|
|
fi
|
|
solink=`echo $libname | sed -e 's/\.so\..*/.so/'`
|
|
ln -sf $libname $2/$sonamelink
|
|
ln -sf $libname $2/$solink
|
|
}
|
|
|
|
oe_libinstall() {
|
|
# Purpose: Install a library, in all its forms
|
|
# Example
|
|
#
|
|
# oe_libinstall libltdl ${STAGING_LIBDIR}/
|
|
# oe_libinstall -C src/libblah libblah ${D}/${libdir}/
|
|
dir=""
|
|
libtool=""
|
|
silent=""
|
|
require_static=""
|
|
require_shared=""
|
|
while [ "$#" -gt 0 ]; do
|
|
case "$1" in
|
|
-C)
|
|
shift
|
|
dir="$1"
|
|
;;
|
|
-s)
|
|
silent=1
|
|
;;
|
|
-a)
|
|
require_static=1
|
|
;;
|
|
-so)
|
|
require_shared=1
|
|
;;
|
|
-*)
|
|
bbfatal "oe_libinstall: unknown option: $1"
|
|
;;
|
|
*)
|
|
break;
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
libname="$1"
|
|
shift
|
|
destpath="$1"
|
|
if [ -z "$destpath" ]; then
|
|
bbfatal "oe_libinstall: no destination path specified"
|
|
fi
|
|
|
|
__runcmd () {
|
|
if [ -z "$silent" ]; then
|
|
echo >&2 "oe_libinstall: $*"
|
|
fi
|
|
$*
|
|
}
|
|
|
|
if [ -z "$dir" ]; then
|
|
dir=`pwd`
|
|
fi
|
|
|
|
dotlai=$libname.lai
|
|
|
|
# Sanity check that the libname.lai is unique
|
|
number_of_files=`(cd $dir; find . -name "$dotlai") | wc -l`
|
|
if [ $number_of_files -gt 1 ]; then
|
|
bbfatal "oe_libinstall: $dotlai is not unique in $dir"
|
|
fi
|
|
|
|
|
|
dir=$dir`(cd $dir;find . -name "$dotlai") | sed "s/^\.//;s/\/$dotlai\$//;q"`
|
|
olddir=`pwd`
|
|
__runcmd cd $dir
|
|
|
|
lafile=$libname.la
|
|
|
|
# If such file doesn't exist, try to cut version suffix
|
|
if [ ! -f "$lafile" ]; then
|
|
libname1=`echo "$libname" | sed 's/-[0-9.]*$//'`
|
|
lafile1=$libname.la
|
|
if [ -f "$lafile1" ]; then
|
|
libname=$libname1
|
|
lafile=$lafile1
|
|
fi
|
|
fi
|
|
|
|
if [ -f "$lafile" ]; then
|
|
# libtool archive
|
|
eval `cat $lafile|grep "^library_names="`
|
|
libtool=1
|
|
else
|
|
library_names="$libname.so* $libname.dll.a $libname.*.dylib"
|
|
fi
|
|
|
|
__runcmd install -d $destpath/
|
|
dota=$libname.a
|
|
if [ -f "$dota" -o -n "$require_static" ]; then
|
|
rm -f $destpath/$dota
|
|
__runcmd install -m 0644 $dota $destpath/
|
|
fi
|
|
if [ -f "$dotlai" -a -n "$libtool" ]; then
|
|
rm -f $destpath/$libname.la
|
|
__runcmd install -m 0644 $dotlai $destpath/$libname.la
|
|
fi
|
|
|
|
for name in $library_names; do
|
|
files=`eval echo $name`
|
|
for f in $files; do
|
|
if [ ! -e "$f" ]; then
|
|
if [ -n "$libtool" ]; then
|
|
bbfatal "oe_libinstall: $dir/$f not found."
|
|
fi
|
|
elif [ -L "$f" ]; then
|
|
__runcmd cp -P "$f" $destpath/
|
|
elif [ ! -L "$f" ]; then
|
|
libfile="$f"
|
|
rm -f $destpath/$libfile
|
|
__runcmd install -m 0755 $libfile $destpath/
|
|
fi
|
|
done
|
|
done
|
|
|
|
if [ -z "$libfile" ]; then
|
|
if [ -n "$require_shared" ]; then
|
|
bbfatal "oe_libinstall: unable to locate shared library"
|
|
fi
|
|
elif [ -z "$libtool" ]; then
|
|
# special case hack for non-libtool .so.#.#.# links
|
|
baselibfile=`basename "$libfile"`
|
|
if (echo $baselibfile | grep -qE '^lib.*\.so\.[0-9.]*$'); then
|
|
sonamelink=`${HOST_PREFIX}readelf -d $libfile |grep 'Library soname:' |sed -e 's/.*\[\(.*\)\].*/\1/'`
|
|
solink=`echo $baselibfile | sed -e 's/\.so\..*/.so/'`
|
|
if [ -n "$sonamelink" -a x"$baselibfile" != x"$sonamelink" ]; then
|
|
__runcmd ln -sf $baselibfile $destpath/$sonamelink
|
|
fi
|
|
__runcmd ln -sf $baselibfile $destpath/$solink
|
|
fi
|
|
fi
|
|
|
|
__runcmd cd "$olddir"
|
|
}
|
|
|
|
create_cmdline_wrapper () {
|
|
# Create a wrapper script where commandline options are needed
|
|
#
|
|
# These are useful to work around relocation issues, by passing extra options
|
|
# to a program
|
|
#
|
|
# Usage: create_cmdline_wrapper FILENAME <extra-options>
|
|
|
|
cmd=$1
|
|
shift
|
|
|
|
echo "Generating wrapper script for $cmd"
|
|
|
|
mv $cmd $cmd.real
|
|
cmdname=`basename $cmd`
|
|
dirname=`dirname $cmd`
|
|
cmdoptions=$@
|
|
if [ "${base_prefix}" != "" ]; then
|
|
relpath=`python3 -c "import os; print(os.path.relpath('${D}${base_prefix}', '$dirname'))"`
|
|
cmdoptions=`echo $@ | sed -e "s:${base_prefix}:\\$realdir/$relpath:g"`
|
|
fi
|
|
cat <<END >$cmd
|
|
#!/bin/bash
|
|
realpath=\`readlink -fn \$0\`
|
|
realdir=\`dirname \$realpath\`
|
|
exec -a \$realdir/$cmdname \$realdir/$cmdname.real $cmdoptions "\$@"
|
|
END
|
|
chmod +x $cmd
|
|
}
|
|
|
|
create_wrapper () {
|
|
# Create a wrapper script where extra environment variables are needed
|
|
#
|
|
# These are useful to work around relocation issues, by setting environment
|
|
# variables which point to paths in the filesystem.
|
|
#
|
|
# Usage: create_wrapper FILENAME [[VAR=VALUE]..]
|
|
|
|
cmd=$1
|
|
shift
|
|
|
|
echo "Generating wrapper script for $cmd"
|
|
|
|
mv $cmd $cmd.real
|
|
cmdname=`basename $cmd`
|
|
dirname=`dirname $cmd`
|
|
exportstring=$@
|
|
if [ "${base_prefix}" != "" ]; then
|
|
relpath=`python3 -c "import os; print(os.path.relpath('${D}${base_prefix}', '$dirname'))"`
|
|
exportstring=`echo $@ | sed -e "s:${base_prefix}:\\$realdir/$relpath:g"`
|
|
fi
|
|
cat <<END >$cmd
|
|
#!/bin/bash
|
|
realpath=\`readlink -fn \$0\`
|
|
realdir=\`dirname \$realpath\`
|
|
export $exportstring
|
|
exec -a "\$0" \$realdir/$cmdname.real "\$@"
|
|
END
|
|
chmod +x $cmd
|
|
}
|
|
|
|
# Copy files/directories from $1 to $2 but using hardlinks
|
|
# (preserve symlinks)
|
|
hardlinkdir () {
|
|
from=$1
|
|
to=$2
|
|
(cd $from; find . -print0 | cpio --null -pdlu $to)
|
|
}
|
|
|
|
|
|
def check_app_exists(app, d):
|
|
app = d.expand(app).split()[0].strip()
|
|
path = d.getVar('PATH')
|
|
return bool(bb.utils.which(path, app))
|
|
|
|
def explode_deps(s):
|
|
return bb.utils.explode_deps(s)
|
|
|
|
def base_set_filespath(path, d):
|
|
filespath = []
|
|
extrapaths = (d.getVar("FILESEXTRAPATHS") or "")
|
|
# Remove default flag which was used for checking
|
|
extrapaths = extrapaths.replace("__default:", "")
|
|
# Don't prepend empty strings to the path list
|
|
if extrapaths != "":
|
|
path = extrapaths.split(":") + path
|
|
# The ":" ensures we have an 'empty' override
|
|
overrides = (":" + (d.getVar("FILESOVERRIDES") or "")).split(":")
|
|
overrides.reverse()
|
|
for o in overrides:
|
|
for p in path:
|
|
if p != "":
|
|
filespath.append(os.path.join(p, o))
|
|
return ":".join(filespath)
|
|
|
|
def extend_variants(d, var, extend, delim=':'):
|
|
"""Return a string of all bb class extend variants for the given extend"""
|
|
variants = []
|
|
whole = d.getVar(var) or ""
|
|
for ext in whole.split():
|
|
eext = ext.split(delim)
|
|
if len(eext) > 1 and eext[0] == extend:
|
|
variants.append(eext[1])
|
|
return " ".join(variants)
|
|
|
|
def multilib_pkg_extend(d, pkg):
|
|
variants = (d.getVar("MULTILIB_VARIANTS") or "").split()
|
|
if not variants:
|
|
return pkg
|
|
pkgs = pkg
|
|
for v in variants:
|
|
pkgs = pkgs + " " + v + "-" + pkg
|
|
return pkgs
|
|
|
|
def get_multilib_datastore(variant, d):
|
|
return oe.utils.get_multilib_datastore(variant, d)
|
|
|
|
def all_multilib_tune_values(d, var, unique = True, need_split = True, delim = ' '):
|
|
"""Return a string of all ${var} in all multilib tune configuration"""
|
|
values = []
|
|
variants = (d.getVar("MULTILIB_VARIANTS") or "").split() + ['']
|
|
for item in variants:
|
|
localdata = get_multilib_datastore(item, d)
|
|
# We need WORKDIR to be consistent with the original datastore
|
|
localdata.setVar("WORKDIR", d.getVar("WORKDIR"))
|
|
value = localdata.getVar(var) or ""
|
|
if value != "":
|
|
if need_split:
|
|
for item in value.split(delim):
|
|
values.append(item)
|
|
else:
|
|
values.append(value)
|
|
if unique:
|
|
#we do this to keep order as much as possible
|
|
ret = []
|
|
for value in values:
|
|
if not value in ret:
|
|
ret.append(value)
|
|
else:
|
|
ret = values
|
|
return " ".join(ret)
|
|
|
|
def all_multilib_tune_list(vars, d):
|
|
"""
|
|
Return a list of ${VAR} for each variable VAR in vars from each
|
|
multilib tune configuration.
|
|
Is safe to be called from a multilib recipe/context as it can
|
|
figure out the original tune and remove the multilib overrides.
|
|
"""
|
|
values = {}
|
|
for v in vars:
|
|
values[v] = []
|
|
values['ml'] = ['']
|
|
|
|
variants = (d.getVar("MULTILIB_VARIANTS") or "").split() + ['']
|
|
for item in variants:
|
|
localdata = get_multilib_datastore(item, d)
|
|
values[v].append(localdata.getVar(v))
|
|
values['ml'].append(item)
|
|
return values
|
|
all_multilib_tune_list[vardepsexclude] = "OVERRIDES"
|
|
|
|
# If the user hasn't set up their name/email, set some defaults
|
|
check_git_config() {
|
|
if ! git config user.email > /dev/null ; then
|
|
git config --local user.email "${PATCH_GIT_USER_EMAIL}"
|
|
fi
|
|
if ! git config user.name > /dev/null ; then
|
|
git config --local user.name "${PATCH_GIT_USER_NAME}"
|
|
fi
|
|
}
|