[pacman-dev] [PATCH 4/5] makepkg: add soprovides support
Dan McGee
dpmcgee at gmail.com
Wed Jan 19 13:54:45 EST 2011
On Wed, Jan 19, 2011 at 11:13 AM, Florian Pritz <bluewind at xssn.at> wrote:
<Descriptive commit message usually goes here>
What does this do? Why? What is the generated format? This stuff needs
to be here in permanent history so someone patching bugs 2 years from
now can figure out the what and why.
> Support-by: brain0 <thomas at archlinux.org>
> Support-by: GNU\caustic <Christoph.Schied at uni-ulm.de>
Since the real names of these guys are so obvious, I'd prefer those
are there rather than nicks.
>
> Signed-off-by: Florian Pritz <bluewind at xssn.at>
> ---
> scripts/makepkg.sh.in | 38 +++++++++++++++++++++++++++++++++++++-
> 1 files changed, 37 insertions(+), 1 deletions(-)
>
> diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
> index 6ebfac0..cf7dbb9 100644
> --- a/scripts/makepkg.sh.in
> +++ b/scripts/makepkg.sh.in
> @@ -917,6 +917,28 @@ tidy_install() {
> fi
> }
>
> +find_soprovides() {
> + local soprovides
> + find $pkgdir -type f -name \*.so\* | while read filename
$pkgdir needs quotes, just like everywhere else it is used.
> + do
> + if readelf -h "$filename" 2>/dev/null | grep -q '.*Type:.*DYN (Shared object file).*'; then
> + soarch="$(objdump -a "$filename" 2>/dev/null | \
> + sed -rn 's/.* file format elf[0-9]+-(.*)$/\1/p' | tr - _)_$(uname -s)"
> + sofile=$(readelf -d "$filename" 2>/dev/null | sed -nr 's/.*Library soname: \[(.*)\].*/\1/p')
> + [ -z "$sofile" ] && sofile="$(basename "$filename")"
> +
> + soname=$(sed -rn 's/(.*)\.so.*/\1.so/p' <<< "$sofile")
> + soversion=$(sed -rn 's/.*\.so\.(.*)/\1/p' <<< "$sofile")
Please give examples in a resubmit of what is coming out of here- this
is not super easy to follow. I'm also a bit concerned about:
* the uses of sed (is -r portable? We use -n already, but not -r)
* the inconsistencies between `sed -rn` and `sed -nr`
* running this in any non-C, non-en locale
* introducing dependencies on readelf and objdump. At least elsewhere
in the strip code, we use `file` to locate shared libraries. And you
can get the SONAME bit out of objdump -p, which would at least limit
this to one tool.
> + if in_array "${soname}" ${provides[@]}; then
> + if ! in_array "${soname}=${soversion}-${soarch}" ${soprovides[@]}; then
> + echo "${soname}=${soversion}-${soarch}"
> + soprovides=(${soprovides[@]} "${soname}=${soversion}-${soarch}")
What's the reasoning behind the ${soarch} append? I suppose it might
help with multilib, but something about this just doesn't seem right.
It is most definitely not a valid pkgver (dash) or pkgrel (not a
number).
> + fi
> + fi
> + fi
> + done
> +}
> +
> write_pkginfo() {
> local builddate=$(date -u "+%s")
> if [[ -n $PACKAGER ]]; then
> @@ -950,10 +972,24 @@ write_pkginfo() {
> [[ $depends ]] && printf "depend = %s\n" "${depends[@]}"
> [[ $optdepends ]] && printf "optdepend = %s\n" "${optdepends[@]}"
> [[ $conflicts ]] && printf "conflict = %s\n" "${conflicts[@]}"
> - [[ $provides ]] && printf "provides = %s\n" "${provides[@]}"
> [[ $backup ]] && printf "backup = %s\n" "${backup[@]}"
>
> local it
> +
> + soprovides=$(find_soprovides)
> + provides=("${provides[@]}" ${soprovides})
> +
> + for it in "${provides[@]}"; do
> + if grep -q ".*\.so$" <<< "$it"; then
> + if ! grep -q "\(^\|\s\)${it}=.*" <<< $soprovides; then
> + error "$(gettext "Can't find library listed in \$provides: %s")" "$it"
Do we really need to add 18 more forks to makepkg and use grep here?
Bash has regexes, so it would prevent the cryptic use of <<<.
I don't even know why we are doing this check, can you elaborate?
> + return 1
> + fi
> + else
> + echo "provides = $it"
> + fi
> + done
> +
> for it in "${packaging_options[@]}"; do
> local ret="$(check_option $it)"
> if [[ $ret != "?" ]]; then
> --
> 1.7.3.5
More information about the pacman-dev
mailing list