diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-07-07 18:41:23 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-07-10 17:38:31 +0100 |
commit | adb89b15890201843c4e8423d114de90444fde47 (patch) | |
tree | a1baca820b9fec8a5dce22faadb4c3b7e9707a7b /meta/classes/package.bbclass | |
parent | 6879c3c903ec7d08cf0240281c83d85b4a42b6db (diff) | |
download | poky-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.bbclass | 42 |
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): |