diff options
Diffstat (limited to 'meta/classes/utils.bbclass')
-rw-r--r-- | meta/classes/utils.bbclass | 164 |
1 files changed, 73 insertions, 91 deletions
diff --git a/meta/classes/utils.bbclass b/meta/classes/utils.bbclass index 81b92cb5eb..120bcc64a6 100644 --- a/meta/classes/utils.bbclass +++ b/meta/classes/utils.bbclass @@ -1,75 +1,19 @@ -# For compatibility -def base_path_join(a, *p): - return oe.path.join(a, *p) - -def base_path_relative(src, dest): - return oe.path.relative(src, dest) - -def base_path_out(path, d): - return oe.path.format_display(path, d) - -def base_read_file(filename): - return oe.utils.read_file(filename) - -def base_ifelse(condition, iftrue = True, iffalse = False): - return oe.utils.ifelse(condition, iftrue, iffalse) - -def base_conditional(variable, checkvalue, truevalue, falsevalue, d): - return oe.utils.conditional(variable, checkvalue, truevalue, falsevalue, d) - -def base_less_or_equal(variable, checkvalue, truevalue, falsevalue, d): - return oe.utils.less_or_equal(variable, checkvalue, truevalue, falsevalue, d) - -def base_version_less_or_equal(variable, checkvalue, truevalue, falsevalue, d): - return oe.utils.version_less_or_equal(variable, checkvalue, truevalue, falsevalue, d) - -def base_contains(variable, checkvalues, truevalue, falsevalue, d): - return bb.utils.contains(variable, checkvalues, truevalue, falsevalue, d) - -def base_both_contain(variable1, variable2, checkvalue, d): - return oe.utils.both_contain(variable1, variable2, checkvalue, d) - -def base_prune_suffix(var, suffixes, d): - return oe.utils.prune_suffix(var, suffixes, d) - -def oe_filter(f, str, d): - return oe.utils.str_filter(f, str, d) - -def oe_filter_out(f, str, d): - return oe.utils.str_filter_out(f, str, d) - -def machine_paths(d): - """List any existing machine specific filespath directories""" - machine = d.getVar("MACHINE", True) - filespathpkg = d.getVar("FILESPATHPKG", True).split(":") - for basepath in d.getVar("FILESPATHBASE", True).split(":"): - for pkgpath in filespathpkg: - machinepath = os.path.join(basepath, pkgpath, machine) - if os.path.isdir(machinepath): - yield machinepath - -def is_machine_specific(d): - """Determine whether the current recipe is machine specific""" - machinepaths = set(machine_paths(d)) - srcuri = d.getVar("SRC_URI", True).split() - for url in srcuri: - fetcher = bb.fetch2.Fetch([srcuri], d) - if url.startswith("file://"): - if any(fetcher.localpath(url).startswith(mp + "/") for mp in machinepaths): - return True oe_soinstall() { # Purpose: Install shared library file and # create the necessary links - # Example: - # - # oe_ - # - #bbnote installing shared library $1 to $2 - # + # 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 @@ -248,7 +192,7 @@ oe_machinstall() { create_cmdline_wrapper () { # Create a wrapper script where commandline options are needed # - # These are useful to work around relocation issues, by passing extra options + # These are useful to work around relocation issues, by passing extra options # to a program # # Usage: create_cmdline_wrapper FILENAME <extra-options> @@ -260,10 +204,17 @@ create_cmdline_wrapper () { 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\` -exec -a \`dirname \$realpath\`/$cmdname \`dirname \$realpath\`/$cmdname.real $@ "\$@" +realdir=\`dirname \$realpath\` +exec -a \`dirname \$realpath\`/$cmdname \`dirname \$realpath\`/$cmdname.real $cmdoptions "\$@" END chmod +x $cmd } @@ -283,11 +234,18 @@ create_wrapper () { 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\` -export $@ -exec -a \`dirname \$realpath\`/$cmdname \`dirname \$realpath\`/$cmdname.real "\$@" +realdir=\`dirname \$realpath\` +export $exportstring +exec -a "\$0" \$realdir/$cmdname.real "\$@" END chmod +x $cmd } @@ -302,8 +260,8 @@ hardlinkdir () { def check_app_exists(app, d): - app = d.expand(app) - path = d.getVar('PATH', d, True) + app = d.expand(app).split()[0].strip() + path = d.getVar('PATH') return bool(bb.utils.which(path, app)) def explode_deps(s): @@ -311,25 +269,25 @@ def explode_deps(s): def base_set_filespath(path, d): filespath = [] - extrapaths = (d.getVar("FILESEXTRAPATHS", True) or "") + 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", True) or "")).split(":") + overrides = (":" + (d.getVar("FILESOVERRIDES") or "")).split(":") overrides.reverse() for o in overrides: for p in path: - if p != "": + 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, True) or "" + whole = d.getVar(var) or "" for ext in whole.split(): eext = ext.split(delim) if len(eext) > 1 and eext[0] == extend: @@ -337,7 +295,7 @@ def extend_variants(d, var, extend, delim=':'): return " ".join(variants) def multilib_pkg_extend(d, pkg): - variants = (d.getVar("MULTILIB_VARIANTS", True) or "").split() + variants = (d.getVar("MULTILIB_VARIANTS") or "").split() if not variants: return pkg pkgs = pkg @@ -345,24 +303,18 @@ def multilib_pkg_extend(d, pkg): 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 = [] - value = d.getVar(var, True) or "" - if value != "": - if need_split: - for item in value.split(delim): - values.append(item) - else: - values.append(value) - variants = d.getVar("MULTILIB_VARIANTS", True) or "" - for item in variants.split(): - localdata = bb.data.createCopy(d) - overrides = localdata.getVar("OVERRIDES", False) + ":virtclass-multilib-" + item - localdata.setVar("OVERRIDES", overrides) - localdata.setVar("MLPREFIX", item + "-") - bb.data.update_data(localdata) - value = localdata.getVar(var, True) or "" + 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): @@ -378,3 +330,33 @@ def all_multilib_tune_values(d, var, unique = True, need_split = True, delim = ' 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 +} |