All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCHv3 0/3] shlibs providers improvements
@ 2014-01-28 14:26 Martin Jansa
  2014-01-28 14:26 ` [PATCHv3 1/3] package.bbclass: Don't search for providers of PRIVATE_LIBS Martin Jansa
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Martin Jansa @ 2014-01-28 14:26 UTC (permalink / raw)
  To: openembedded-core

v2->v3
changed the order of commits so that controversial SHLIBSSEARCHDIRS is last
fixed typo prividers -> providrs

The following changes since commit 091d395e43836575587112ee1696a18c401505bb:

  lib/oeqa: sshcontrol: Allow alternate port for SSHControl (2014-01-28 00:48:29 +0000)

are available in the git repository at:

  git://git.openembedded.org/openembedded-core-contrib jansa/shlib-providers
  http://cgit.openembedded.org/cgit.cgi/openembedded-core-contrib/log/?h=jansa/shlib-providers

Martin Jansa (3):
  package.bbclass: Don't search for providers of PRIVATE_LIBS
  package.bbclass: Show which files require given dependency in debug
    output
  package.bbclass: add SHLIBSSEARCHDIRS to define where to search for
    shlib providers

 meta/classes/package.bbclass | 49 ++++++++++++++++++++++++++++++++++++++------
 1 file changed, 43 insertions(+), 6 deletions(-)

-- 
1.8.5.3



^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCHv3 1/3] package.bbclass: Don't search for providers of PRIVATE_LIBS
  2014-01-28 14:26 [PATCHv3 0/3] shlibs providers improvements Martin Jansa
@ 2014-01-28 14:26 ` Martin Jansa
  2014-01-28 14:26 ` [PATCHv3 2/3] package.bbclass: Show which files require given dependency in debug output Martin Jansa
  2014-01-28 14:26 ` [PATCHv3 3/3] package.bbclass: add SHLIBSSEARCHDIRS to define where to search for shlib providers Martin Jansa
  2 siblings, 0 replies; 4+ messages in thread
From: Martin Jansa @ 2014-01-28 14:26 UTC (permalink / raw)
  To: openembedded-core

* split PRIVATE_LIBS and don't use find(), so that libfoo cannot be
  found in PRIVATE_LIBS = "libfoobar"

Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
---
 meta/classes/package.bbclass | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index 70f9aaa..ed88daf 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -1402,7 +1402,7 @@ python package_do_shlibs() {
                 this_soname = m.group(1)
                 if not this_soname 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(this_soname):
+                    if not private_libs or this_soname not in private_libs:
                         sonames.append(this_soname)
                 if libdir_re.match(os.path.dirname(file)):
                     needs_ldconfig = True
@@ -1486,7 +1486,8 @@ python package_do_shlibs() {
     read_shlib_providers()
 
     for pkg in packages.split():
-        private_libs = d.getVar('PRIVATE_LIBS_' + pkg, True) or d.getVar('PRIVATE_LIBS', True)
+        private_libs = d.getVar('PRIVATE_LIBS_' + pkg, True) or d.getVar('PRIVATE_LIBS', True) or ""
+        private_libs = private_libs.split()
         needs_ldconfig = False
         bb.debug(2, "calculating shlib provides for %s" % pkg)
 
@@ -1556,6 +1557,14 @@ python package_do_shlibs() {
 
         deps = list()
         for n in needed[pkg]:
+            # if n is in private libraries, don't try to search provider for it
+            # this could cause problem in case some abc.bb provides private
+            # /opt/abc/lib/libfoo.so.1 and contains /usr/bin/abc depending on system library libfoo.so.1
+            # but skipping it is still better alternative than providing own
+            # version and then adding runtime dependency for the same system library
+            if private_libs and n in private_libs:
+                bb.debug(2, '%s: Dependency %s covered by PRIVATE_LIBS' % (pkg, n))
+                continue
             if n in shlib_provider.keys():
                 (dep_pkg, ver_needed) = shlib_provider[n]
 
-- 
1.8.5.3



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCHv3 2/3] package.bbclass: Show which files require given dependency in debug output
  2014-01-28 14:26 [PATCHv3 0/3] shlibs providers improvements Martin Jansa
  2014-01-28 14:26 ` [PATCHv3 1/3] package.bbclass: Don't search for providers of PRIVATE_LIBS Martin Jansa
@ 2014-01-28 14:26 ` Martin Jansa
  2014-01-28 14:26 ` [PATCHv3 3/3] package.bbclass: add SHLIBSSEARCHDIRS to define where to search for shlib providers Martin Jansa
  2 siblings, 0 replies; 4+ messages in thread
From: Martin Jansa @ 2014-01-28 14:26 UTC (permalink / raw)
  To: openembedded-core

* when log.do_package shows some unexpected dependency, people usually
  need to grep package directory to find which binary was creating that
  dependency, show it directly in the debug output

Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
---
 meta/classes/package.bbclass | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index ed88daf..1f73ad6 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -1397,6 +1397,9 @@ python package_do_shlibs() {
             if m:
                 if m.group(1) not in needed[pkg]:
                     needed[pkg].append(m.group(1))
+                if m.group(1) not in needed_from:
+                    needed_from[m.group(1)] = []
+                needed_from[m.group(1)].append(file)
             m = re.match("\s+SONAME\s+([^\s]*)", l)
             if m:
                 this_soname = m.group(1)
@@ -1469,6 +1472,10 @@ python package_do_shlibs() {
                                 needed[pkg] = []
                             if name and name not in needed[pkg]:
                                 needed[pkg].append(name)
+                            if name not in needed_from:
+                                needed_from[name] = []
+                            if lafile and lafile not in needed_from[name]:
+                                needed_from[name].append(lafile)
                                 #bb.note("Adding %s for %s" % (name, pkg))
 
     if d.getVar('PACKAGE_SNAP_LIB_SYMLINKS', True) == "1":
@@ -1482,6 +1489,7 @@ python package_do_shlibs() {
         use_ldconfig = False
 
     needed = {}
+    needed_from = {}
     shlib_provider = {}
     read_shlib_providers()
 
@@ -1568,7 +1576,7 @@ python package_do_shlibs() {
             if n in shlib_provider.keys():
                 (dep_pkg, ver_needed) = shlib_provider[n]
 
-                bb.debug(2, '%s: Dependency %s requires package %s' % (pkg, n, dep_pkg))
+                bb.debug(2, '%s: Dependency %s requires package %s (used by files: %s)' % (pkg, n, dep_pkg, needed_from[n]))
 
                 if dep_pkg == pkg:
                     continue
@@ -1580,7 +1588,7 @@ python package_do_shlibs() {
                 if not dep in deps:
                     deps.append(dep)
             else:
-                bb.note("Couldn't find shared library provider for %s" % n)
+                bb.note("Couldn't find shared library provider for %s, used by files: %s" % (n, needed_from[n]))
 
         deps_file = os.path.join(pkgdest, pkg + ".shlibdeps")
         if os.path.exists(deps_file):
-- 
1.8.5.3



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCHv3 3/3] package.bbclass: add SHLIBSSEARCHDIRS to define where to search for shlib providers
  2014-01-28 14:26 [PATCHv3 0/3] shlibs providers improvements Martin Jansa
  2014-01-28 14:26 ` [PATCHv3 1/3] package.bbclass: Don't search for providers of PRIVATE_LIBS Martin Jansa
  2014-01-28 14:26 ` [PATCHv3 2/3] package.bbclass: Show which files require given dependency in debug output Martin Jansa
@ 2014-01-28 14:26 ` Martin Jansa
  2 siblings, 0 replies; 4+ messages in thread
From: Martin Jansa @ 2014-01-28 14:26 UTC (permalink / raw)
  To: openembedded-core

* when package contains some files matching "^.*\.so", but in directory
  not default linker search paths (e.g. /opt/package/bundled-lib/libfoo.so)
  don't register it as libfoo provider, because it's possible that there
  is different package providing libfoo.so in ${libdir} and that would
  be better shlib provider for other packages to depend on
* recipes providing libs intentionally in some other directory can
  define own SHLIBSSEARCHDIRS value

[YOCTO #4628]

Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
---
 meta/classes/package.bbclass | 26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index 1f73ad6..f9369b3 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -1333,6 +1333,9 @@ python package_do_filedeps() {
 SHLIBSDIRS = "${PKGDATA_DIR}/${MLPREFIX}shlibs"
 SHLIBSWORKDIR = "${PKGDESTWORK}/${MLPREFIX}shlibs"
 
+# default search path when searching for shlibs provided by package
+SHLIBSSEARCHDIRS ?= "${baselib} ${libdir}"
+
 python package_do_shlibs() {
     import re, pipes
 
@@ -1343,6 +1346,20 @@ python package_do_shlibs() {
 
     lib_re = re.compile("^.*\.so")
     libdir_re = re.compile(".*/%s$" % d.getVar('baselib', True))
+    
+    shlibs_search_dirs = d.getVar('SHLIBSSEARCHDIRS', True)
+    shlibs_search_dirs_re_txt = ""
+    for dir in shlibs_search_dirs.split(' '):
+        # strip leading and trailing slash, it's added in regexp
+        if dir.endswith("/"):
+            dir = dir[:-1]
+        if dir.startswith("/"):
+            dir = dir[1:]
+        if shlibs_search_dirs_re_txt:
+            shlibs_search_dirs_re_txt += "|"
+        shlibs_search_dirs_re_txt += "(^.*/%s/.*$)" % dir
+    shlibs_search_dirs_re = re.compile(shlibs_search_dirs_re_txt)
+    bb.debug(2, "will use following RE to search for provides sonames %s" % shlibs_search_dirs_re_txt)
 
     packages = d.getVar('PACKAGES', True)
     targetos = d.getVar('TARGET_OS', True)
@@ -1404,9 +1421,12 @@ python package_do_shlibs() {
             if m:
                 this_soname = m.group(1)
                 if not this_soname in sonames:
-                    # if library is private (only used by package) then do not build shlib for it
-                    if not private_libs or this_soname not in private_libs:
-                        sonames.append(this_soname)
+                    if shlibs_search_dirs_re.match(file):
+                        # if library is private (only used by package) then do not build shlib for it
+                        if not private_libs or this_soname not in private_libs:
+                            sonames.append(this_soname)
+                    else:
+                        bb.debug(2, "ignoring soname %s from %s, because path doesn't match %s" % (this_soname, file, shlibs_search_dirs_re_txt))
                 if libdir_re.match(os.path.dirname(file)):
                     needs_ldconfig = True
                 if snap_symlinks and (os.path.basename(file) != this_soname):
-- 
1.8.5.3



^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-01-28 14:26 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-01-28 14:26 [PATCHv3 0/3] shlibs providers improvements Martin Jansa
2014-01-28 14:26 ` [PATCHv3 1/3] package.bbclass: Don't search for providers of PRIVATE_LIBS Martin Jansa
2014-01-28 14:26 ` [PATCHv3 2/3] package.bbclass: Show which files require given dependency in debug output Martin Jansa
2014-01-28 14:26 ` [PATCHv3 3/3] package.bbclass: add SHLIBSSEARCHDIRS to define where to search for shlib providers Martin Jansa

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.