xref: /OK3568_Linux_fs/yocto/poky/meta/classes/utils.bbclass (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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