summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--meta/classes/package.bbclass100
1 files changed, 82 insertions, 18 deletions
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index eb43856c5..74c6b53a4 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -547,6 +547,7 @@ python package_do_shlibs() {
libdir_re = re.compile(".*/lib$")
packages = bb.data.getVar('PACKAGES', d, 1)
+ targetos = bb.data.getVar('TARGET_OS', d, 1)
workdir = bb.data.getVar('WORKDIR', d, 1)
if not workdir:
@@ -567,6 +568,83 @@ python package_do_shlibs() {
if pstageactive == "1":
lf = bb.utils.lockfile(bb.data.expand("${STAGING_DIR}/staging.lock", d))
+ def linux_so(root, path, file):
+ cmd = bb.data.getVar('OBJDUMP', d, 1) + " -p " + os.path.join(root, file) + " 2>/dev/null"
+ cmd = "PATH=\"%s\" %s" % (bb.data.getVar('PATH', d, 1), cmd)
+ fd = os.popen(cmd)
+ lines = fd.readlines()
+ fd.close()
+ for l in lines:
+ m = re.match("\s+NEEDED\s+([^\s]*)", l)
+ if m:
+ needed[pkg].append(m.group(1))
+ m = re.match("\s+SONAME\s+([^\s]*)", l)
+ if m and not m.group(1) in sonames:
+ # if library is private (only used by package) then do not build shlib for it
+ if not private_libs or -1 == private_libs.find(m.group(1)):
+ sonames.append(m.group(1))
+ if m and libdir_re.match(root):
+ needs_ldconfig = True
+ def darwin_so(root, path, file):
+ fullpath = os.path.join(root, file)
+ if not os.path.exists(fullpath):
+ return
+
+ def get_combinations(base):
+ #
+ # Given a base library name, find all combinations of this split by "." and "-"
+ #
+ combos = []
+ options = base.split(".")
+ for i in range(1, len(options) + 1):
+ combos.append(".".join(options[0:i]))
+ options = base.split("-")
+ for i in range(1, len(options) + 1):
+ combos.append("-".join(options[0:i]))
+ return combos
+
+ if (file.endswith('.dylib') or file.endswith('.so')) and not pkg.endswith('-dev') and not pkg.endswith('-dbg'):
+ # Drop suffix
+ name = file.rsplit(".",1)[0]
+ # Find all combinations
+ combos = get_combinations(name)
+ for combo in combos:
+ if not combo in sonames:
+ sonames.append(combo)
+ if file.endswith('.dylib') or file.endswith('.so'):
+ lafile = fullpath.replace(os.path.join(pkgdest, pkg), bb.data.getVar('D', d, 1))
+ # Drop suffix
+ lafile = lafile.rsplit(".",1)[0]
+ lapath = os.path.dirname(lafile)
+ lafile = os.path.basename(lafile)
+ # Find all combinations
+ combos = get_combinations(lafile)
+ for combo in combos:
+ if os.path.exists(lapath + '/' + combo + '.la'):
+ break
+ lafile = lapath + '/' + combo + '.la'
+
+ #bb.note("Foo2: %s" % lafile)
+ #bb.note("Foo %s %s" % (file, fullpath))
+ fd = open(lafile, 'r')
+ lines = fd.readlines()
+ fd.close()
+ for l in lines:
+ m = re.match("\s*dependency_libs=\s*'(.*)'", l)
+ if m:
+ deps = m.group(1).split(" ")
+ for dep in deps:
+ #bb.note("Trying %s for %s" % (dep, pkg))
+ name = None
+ if dep.endswith(".la"):
+ name = os.path.basename(dep).replace(".la", "")
+ elif dep.startswith("-l"):
+ name = dep.replace("-l", "lib")
+ if pkg not in needed:
+ needed[pkg] = []
+ if name:
+ needed[pkg].append(name)
+ #bb.note("Adding %s for %s" % (name, pkg))
needed = {}
private_libs = bb.data.getVar('PRIVATE_LIBS', d, 1)
for pkg in packages.split():
@@ -579,24 +657,10 @@ python package_do_shlibs() {
for root, dirs, files in os.walk(top):
for file in files:
soname = None
- path = os.path.join(root, file)
- if os.access(path, os.X_OK) or lib_re.match(file):
- cmd = bb.data.getVar('OBJDUMP', d, 1) + " -p " + path + " 2>/dev/null"
- cmd = "PATH=\"%s\" %s" % (bb.data.getVar('PATH', d, 1), cmd)
- fd = os.popen(cmd)
- lines = fd.readlines()
- fd.close()
- for l in lines:
- m = re.match("\s+NEEDED\s+([^\s]*)", l)
- if m:
- needed[pkg].append(m.group(1))
- m = re.match("\s+SONAME\s+([^\s]*)", l)
- if m and not m.group(1) in sonames:
- # if library is private (only used by package) then do not build shlib for it
- if not private_libs or -1 == private_libs.find(m.group(1)):
- sonames.append(m.group(1))
- if m and libdir_re.match(root):
- needs_ldconfig = True
+ if targetos == "darwin":
+ darwin_so(root, dirs, file)
+ elif os.access(path, os.X_OK) or lib_re.match(file):
+ linux_so(root, dirs, file)
shlibs_file = os.path.join(shlibs_dir, pkg + ".list")
if os.path.exists(shlibs_file):
os.remove(shlibs_file)