summaryrefslogtreecommitdiffstats
path: root/meta/classes/package.bbclass
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2014-07-07 18:41:23 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2014-07-10 17:38:31 +0100
commitadb89b15890201843c4e8423d114de90444fde47 (patch)
treea1baca820b9fec8a5dce22faadb4c3b7e9707a7b /meta/classes/package.bbclass
parent6879c3c903ec7d08cf0240281c83d85b4a42b6db (diff)
downloadpoky-adb89b15890201843c4e8423d114de90444fde47.tar.gz
package.bbclass: Improve shlibs needed data structure
Improve the shlibs 'needed' data structure to include the file and any rpath information. This allows various cleanups to the data structure and moves us closer to being able to resolve shlibs providers issues based on path in due course. This commit doesn't change any stored data, just cleans up internal data structures (for example dropping the needed_from dict). (From OE-Core rev: d3aa7668a9f001044d0a0f1ba2de425a36056102) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/classes/package.bbclass')
-rw-r--r--meta/classes/package.bbclass42
1 files changed, 20 insertions, 22 deletions
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index ea7591855e..1ef0c66ca0 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -1382,20 +1382,25 @@ python package_do_shlibs() {
1382 for l in lines: 1382 for l in lines:
1383 shlib_provider[l.rstrip()] = (dep_pkg, lib_ver) 1383 shlib_provider[l.rstrip()] = (dep_pkg, lib_ver)
1384 1384
1385 def linux_so(file): 1385 def linux_so(file, needed, sonames, renames):
1386 needs_ldconfig = False 1386 needs_ldconfig = False
1387 ldir = os.path.dirname(file).replace(pkgdest, '')
1387 cmd = d.getVar('OBJDUMP', True) + " -p " + pipes.quote(file) + " 2>/dev/null" 1388 cmd = d.getVar('OBJDUMP', True) + " -p " + pipes.quote(file) + " 2>/dev/null"
1388 fd = os.popen(cmd) 1389 fd = os.popen(cmd)
1389 lines = fd.readlines() 1390 lines = fd.readlines()
1390 fd.close() 1391 fd.close()
1392 rpath = []
1393 for l in lines:
1394 m = re.match("\s+RPATH\s+([^\s]*)", l)
1395 if m:
1396 rpaths = m.group(1).replace("$ORIGIN", ldir).split(":")
1397 rpath = map(os.path.normpath, rpaths)
1391 for l in lines: 1398 for l in lines:
1392 m = re.match("\s+NEEDED\s+([^\s]*)", l) 1399 m = re.match("\s+NEEDED\s+([^\s]*)", l)
1393 if m: 1400 if m:
1394 if m.group(1) not in needed[pkg]: 1401 dep = m.group(1)
1395 needed[pkg].append(m.group(1)) 1402 if dep not in needed[pkg]:
1396 if m.group(1) not in needed_from: 1403 needed[pkg].append((dep, file, rpath))
1397 needed_from[m.group(1)] = []
1398 needed_from[m.group(1)].append(file)
1399 m = re.match("\s+SONAME\s+([^\s]*)", l) 1404 m = re.match("\s+SONAME\s+([^\s]*)", l)
1400 if m: 1405 if m:
1401 this_soname = m.group(1) 1406 this_soname = m.group(1)
@@ -1409,7 +1414,7 @@ python package_do_shlibs() {
1409 renames.append((file, os.path.join(os.path.dirname(file), this_soname))) 1414 renames.append((file, os.path.join(os.path.dirname(file), this_soname)))
1410 return needs_ldconfig 1415 return needs_ldconfig
1411 1416
1412 def darwin_so(file): 1417 def darwin_so(file, needed, sonames, renames):
1413 if not os.path.exists(file): 1418 if not os.path.exists(file):
1414 return 1419 return
1415 1420
@@ -1464,14 +1469,8 @@ python package_do_shlibs() {
1464 name = os.path.basename(dep).replace(".la", "") 1469 name = os.path.basename(dep).replace(".la", "")
1465 elif dep.startswith("-l"): 1470 elif dep.startswith("-l"):
1466 name = dep.replace("-l", "lib") 1471 name = dep.replace("-l", "lib")
1467 if pkg not in needed:
1468 needed[pkg] = []
1469 if name and name not in needed[pkg]: 1472 if name and name not in needed[pkg]:
1470 needed[pkg].append(name) 1473 needed[pkg].append((name, lafile, []))
1471 if name not in needed_from:
1472 needed_from[name] = []
1473 if lafile and lafile not in needed_from[name]:
1474 needed_from[name].append(lafile)
1475 #bb.note("Adding %s for %s" % (name, pkg)) 1474 #bb.note("Adding %s for %s" % (name, pkg))
1476 1475
1477 if d.getVar('PACKAGE_SNAP_LIB_SYMLINKS', True) == "1": 1476 if d.getVar('PACKAGE_SNAP_LIB_SYMLINKS', True) == "1":
@@ -1485,7 +1484,6 @@ python package_do_shlibs() {
1485 use_ldconfig = False 1484 use_ldconfig = False
1486 1485
1487 needed = {} 1486 needed = {}
1488 needed_from = {}
1489 shlib_provider = {} 1487 shlib_provider = {}
1490 read_shlib_providers() 1488 read_shlib_providers()
1491 1489
@@ -1509,9 +1507,9 @@ python package_do_shlibs() {
1509 if cpath.islink(file): 1507 if cpath.islink(file):
1510 continue 1508 continue
1511 if targetos == "darwin" or targetos == "darwin8": 1509 if targetos == "darwin" or targetos == "darwin8":
1512 darwin_so(file) 1510 darwin_so(file, needed, sonames, renames)
1513 elif os.access(file, os.X_OK) or lib_re.match(file): 1511 elif os.access(file, os.X_OK) or lib_re.match(file):
1514 ldconfig = linux_so(file) 1512 ldconfig = linux_so(file, needed, sonames, renames)
1515 needs_ldconfig = needs_ldconfig or ldconfig 1513 needs_ldconfig = needs_ldconfig or ldconfig
1516 for (old, new) in renames: 1514 for (old, new) in renames:
1517 bb.note("Renaming %s to %s" % (old, new)) 1515 bb.note("Renaming %s to %s" % (old, new))
@@ -1567,12 +1565,12 @@ python package_do_shlibs() {
1567 # but skipping it is still better alternative than providing own 1565 # but skipping it is still better alternative than providing own
1568 # version and then adding runtime dependency for the same system library 1566 # version and then adding runtime dependency for the same system library
1569 if private_libs and n in private_libs: 1567 if private_libs and n in private_libs:
1570 bb.debug(2, '%s: Dependency %s covered by PRIVATE_LIBS' % (pkg, n)) 1568 bb.debug(2, '%s: Dependency %s covered by PRIVATE_LIBS' % (pkg, n[0]))
1571 continue 1569 continue
1572 if n in shlib_provider.keys(): 1570 if n[0] in shlib_provider.keys():
1573 (dep_pkg, ver_needed) = shlib_provider[n] 1571 (dep_pkg, ver_needed) = shlib_provider[n[0]]
1574 1572
1575 bb.debug(2, '%s: Dependency %s requires package %s (used by files: %s)' % (pkg, n, dep_pkg, needed_from[n])) 1573 bb.debug(2, '%s: Dependency %s requires package %s (used by files: %s)' % (pkg, n[0], dep_pkg, n[1]))
1576 1574
1577 if dep_pkg == pkg: 1575 if dep_pkg == pkg:
1578 continue 1576 continue
@@ -1584,7 +1582,7 @@ python package_do_shlibs() {
1584 if not dep in deps: 1582 if not dep in deps:
1585 deps.append(dep) 1583 deps.append(dep)
1586 else: 1584 else:
1587 bb.note("Couldn't find shared library provider for %s, used by files: %s" % (n, needed_from[n])) 1585 bb.note("Couldn't find shared library provider for %s, used by files: %s" % (n[0], n[1]))
1588 1586
1589 deps_file = os.path.join(pkgdest, pkg + ".shlibdeps") 1587 deps_file = os.path.join(pkgdest, pkg + ".shlibdeps")
1590 if os.path.exists(deps_file): 1588 if os.path.exists(deps_file):