First off, this patch creates a syntax error. On 25.12.2011 07:52, Allan McRae wrote: > - Only calculates the version for libraries specifically requested > and not all libraries. This has the disadvantage of running find > over the $pkgdir for as many libraries as needed, but is unlikely > to be an issue due to caching.
Maybe you could create a search string like the following? This won't preserve the order, but it will traverse the file system only once and according to the find manpage it's POSIX compliant. find /usr/lib -type f \( -name libx264.so\* -o -name libc.so\* -o -name libarchive.so\* \) > - The order of the provides array in the PKGBUILD is kept in the > package > - There are more warning messages when things fail and those that > were there are no longer errors (as I do not think failure of > libprovides should result in complete packaging failure) I think it should because libraries hardly move between packages or change their names and the packager might not see the message and push a package with incorrect provides. It might be a good idea not to abort right away though. You could check all entries and abort later, but I think you shouldn't create a package since the packager will have to fix the incorrect entry and rebuild/repackage anyway. > - It is now modular so can be easy extended to other library types > other than ELF *.so. > > Signed-off-by: Allan McRae <[email protected]> > --- > scripts/makepkg.sh.in | 85 > +++++++++++++++++++++++++++---------------------- > 1 files changed, 47 insertions(+), 38 deletions(-) > > diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in > index 64b33c6..08c4384 100644 > --- a/scripts/makepkg.sh.in > +++ b/scripts/makepkg.sh.in > @@ -1076,30 +1076,51 @@ find_libdepends() { > } > > find_libprovides() { > - local libprovides > - find "$pkgdir" -type f -name \*.so\* | while read filename > - do > - # check if we really have a shared object > - if LC_ALL=C readelf -h "$filename" 2>/dev/null | grep -q > '.*Type:.*DYN (Shared object file).*'; then > - # 64 > - soarch=$(LC_ALL=C readelf -h "$filename" | sed -n > 's/.*Class.*ELF\(32\|64\)/\1/p') > - # get the string binaries link to: libfoo.so.1.2 -> > libfoo.so.1 > - sofile=$(LC_ALL=C readelf -d "$filename" 2>/dev/null | > sed -n 's/.*Library soname: \[\(.*\)\].*/\1/p') > - [ -z "$sofile" ] && sofile="${filename##*/}" > + local libprovides missing > + for p in ${provides[@]}; do > + missing=0 > + case "$p" in > + *.so) > + local filename=$(find "$pkgdir" -type f -name > $p\*) > + # packages may provide multiple versions of the > same library > + for fn in ${filename[@]}; do > + # check if we really have a shared > object > + if LC_ALL=C readelf -h "$fn" > 2>/dev/null | grep -q '.*Type:.*DYN (Shared object file).*'; then > + # get the string binaries link > to (e.g. libfoo.so.1.2 -> libfoo.so.1) > + local sofile=$(LC_ALL=C readelf > -d "$fn" 2>/dev/null | sed -n 's/.*Library soname: \[\(.*\)\].*/\1/p') > + if [[ -z "$sofile" ]]; then > + warning "$(gettext > "Library listed in %s is not versioned: %s")" "'provides'" "$p" > + > libprovides=(${libprovides[@]} "$p") > + continue > + fi > > - # extract the library name: libfoo.so > - soname="${sofile%%\.so\.*}.so" > - # extract the major version: 1 > - soversion="${sofile##*\.so\.}" > - if in_array "${soname}" ${provides[@]}; then > - if ! in_array > "${soname}=${soversion}-${soarch}" ${libprovides[@]}; then > - # libfoo.so=1-64 > - echo "${soname}=${soversion}-${soarch}" > - libprovides=(${libprovides[@]} > "${soname}=${soversion}-${soarch}") > + # get the library architecture > (32 or 64 bit) > + local soarch=$(LC_ALL=C readelf > -h "$fn" | sed -n 's/.*Class.*ELF\(32\|64\)/\1/p') > + > + # extract the library major > version > + local > soversion="${sofile##*\.so\.}" > + > + libprovides=(${libprovides[@]} > "${p}=${soversion}-${soarch}") > + else > + warning "$(gettext "Library > listed in %s is not a shared object: %s")" "'provides'" "$p" > + libprovides=(${libprovides[@]} > "$p") > + fi > + else > + libprovides=(${libprovides[@]} "$p") > + missing=1 > fi This else block doesn't have any matching if statement. The one with "Library listed in %s is not a shared object" already closes 'if LC_ALL=C readelf -h "$fn" 2>/dev/null | grep -q '.*Type:.*DYN (Shared object file).*'; then' -- Florian Pritz
signature.asc
Description: OpenPGP digital signature
