Forum Programmation.shell help : script bash qui trouve les dépendances

Posté par (page perso) .
Tags : aucun
0
14
juin
2005
Je voudrais connaître les dépendances de mon programmes (pour en faire un deb facilement). Et n'ayant rien trouver pour cela, j'ai décider de faire un petit script qui m'afficherai les librairies nécessaires.
Or, je voudrais que les libs qui sont demander par d'autres libs ne soit pas affiché. (Ex : grace au script je trouve libqt3c102-mt et libx11-6, mais comme libx11-6 est nécessaire pour libqt3c102-mt, il ne doit pas s'afficher)

Mais je fais face à de nombreux problèmes : notamment à cause de deux variables (n2 et dependsLibs) qui perdent leur valeurs en sortant d'une boucle.

Si une âme charitable pourrait m'aider, ca ne serait pas de refus (^_^)
Merci d'avance.



#!/bin/bash

libs[0]=""
dependsLibs[0]=""
n=0
n2=0
preexistant=0

# On lit les .so necessaire à l'exe un par un
ldd $1 | awk '{ print $3 }' | while read so
do
# On trouve le paquet de chaque .so et le rajoute au tableau
libs[n]=`dpkg -S $so | awk -F: '{ print $1 }'`

############Expérimentale#################
###########(ne marche pas)################
if [ $n = 0 ]
then apt-cache depends ${libs[0]} | while read lib
do
dependsLibs[n2]=`echo $lib | awk '{ print $2 }'`
let "n2 += 1"
# ici n2 augmente logiquement
done
fi
##########################################
##########################################

# ici, n2 == 0, pourquoi ????

# On cherche si la lib a déjà été trouver, si oui on ne la rajoute pas
for (( tmp = 0; tmp < n; tmp++ ))
do
if [ "${libs[n]}" = "${libs[tmp]}" ]
then let "preexistant = 1"
fi
done

if [ $preexistant = 0 ]
then echo ${libs[n]}
fi

# On remet preexistant sur "non" et change dans le tableau
let "preexistant = 0"
let "n += 1"
done
  • # ldd puxor

    Posté par . Évalué à 2.

    Bon enfin non, mais pour disons qu'il n'est pas vraiment adapté à ce que tu veux faire. Typiquement, les bibliothèques que tu dois lister en tant que dépendances sont celles qui sont directement requises par tes binaires, alors que ldd fait une résolution récursive.

    Essaye plutôt ça :
    # objdump -p ton_fichier_binaire | sed -n 's:^NEEDED::p'

    Et tu peux aussi jeter un oeil sur ces bouts de code là, qui pourraient t'inspirer. Y'a des trucs spécifiques à Gentoo dedans, mais c'est adaptable je pense :
    http://www.gentoo.org/cgi-bin/viewcvs.cgi/users/spider/depreverse/?(...)
    http://tdegreni.free.fr/gentoo/dotfinder.py(...)
    • [^] # Re: ldd puxor

      Posté par . Évalué à 2.

      > Et tu peux aussi jeter un oeil sur ces bouts de code là, qui
      > pourraient t'inspirer.

      Plus précisement, le premier lien pointe sur "depreverse", un petit script du genre du tiens (qui fait aussi les dépendances des modules perl ou python, mais bon là on s'en fout). Lui doit être distro-agnostique je pense.
      Le deuxième, c'est une surcouche autour pour faire des jolis dessins avec "dot", dans ce genre là :
      http://tdegreni.free.fr/gentoo/freeciv-gtk2.ps(...)
      Lui est spécifique à Gentoo, mais probablement adaptable si ça t'amuse (en gros, réécrire les bouts de code qui font des correspondances fichier/paquet).
      • [^] # Re: ldd puxor

        Posté par (page perso) . Évalué à 1.

        Je te remercie beaucoup, ce n'est pas parfait, mais j'ai reussi ce que je voulais ^^


        #!/bin/bash

        echo ""

        tour=0

        # On lit les .so necessaire à l'exe un par un
        objdump -p $1 | awk '/NEEDED/ { print $2 }' | while read so
        do
        # On trouve le paquet de chaque .so et le rajoute au tableau
        dpkg -S $so | awk -F: '{ print $1 }' | while read result
        do
        if [ $tour = 0 ]
        then echo $result
        let "tour += 1"
        fi
        done
        done
  • # Euh,

    Posté par (page perso) . Évalué à 2.

    Ce que tu veux, c'est pas tout simplement ce que te donneras dh_shlibdep quand tu vas faire ton package?
    • [^] # Re: Euh,

      Posté par (page perso) . Évalué à 1.

      Sauf que j'utilise pas dh_shlibdep puisque je fait mes paquetage à la main. Pour des petits programmes tel que les miens c'est largements suffisant.

      Et de tte facon j'avais déjà essayer de faire un paquet "en bonne et due forme" comme dit sur le guide de developpeur debian (il me semble) mais je n'arrivai à rien... et je ne pense pas que dh_shlibdep peut s'utiliser betement et facilement sur un executable
      • [^] # Re: Euh,

        Posté par . Évalué à 2.

        je ne pense pas que dh_shlibdep peut s'utiliser betement et facilement sur un executable
        En l'occurence si, probablement. Enfin j'ai pas de Debian pour tester, mais je viens de voir que sous Gentoo le paquet 'dpkg' installe, parmi d'autres utilitaires, un /usr/bin/dpkg-shlibdeps (peut-être que le préfixe "dpkg-" est ajouté par le paquet Gentoo, je sais pas), qui a l'air très bien :
        % dpkg-shlibdeps -h
        Debian dpkg-shlibdeps 1.10.28.
        Copyright (C) 1996 Ian Jackson.
        Copyright (C) 2000 Wichert Akkerman.
        This is free software; see the GNU General Public Licence version 2 or
        later for copying conditions.  There is NO warranty.
        
        Usage:
          dpkg-shlibdeps [<option> ...] <executable>|-e<executable> [<option>] ...
        Positional arguments/options (order is significant):
               <executable>           } include dependencies for <executable>
               -e<executable>         }  (use -e if <executable> starts with `-')
               -d<dependencyfield>    next executable(s) set shlibs:<dependencyfield>
        Overall options (have global effect no matter where placed):
               -p<varnameprefix>      set <varnameprefix>:* instead of shlibs:*.
               -O                     print variable settings to stdout
               -L<localshlibsfile>    shlibs override file, not debian/shlibs.local
               -T<varlistfile>        update variables here, not debian/substvars
        Dependency fields recognised are Suggests/Recommends/Depends/Pre-Depends
        J'ai regardé rapidement les sources (script perl), et il fait justement un "objdump -p ...", avec tout ce qu'il faut autour :)
        • [^] # Re: Euh,

          Posté par (page perso) . Évalué à 1.

          oui mais non :
          "dpkg-shlibdeps ./mon_exe

          failure: open new substvars file `debian/substvars.new': Aucun fichier ou répertoire de ce type"

          et je n'ai aucune idée de ce que peut etre ce fichier et de ce qu'il peut y avoir dedans

          De plus (ca m'est revenu subitement), j'avais arrété d'essayer de faire des paquets avec les outils debian puisque ceux ci était principalement fait pour les progs utilisant autotools, ce qui n'était pas mon cas. Enfin je dis peut-être une connerie, je ne m'y connais pas énorméments dans ce domaine.
          • [^] # Re: Euh,

            Posté par . Évalué à 2.

            De plus (ca m'est revenu subitement), j'avais arrété d'essayer de faire des paquets avec les outils debian puisque ceux ci était principalement fait pour les progs utilisant autotools, ce qui n'était pas mon cas. Enfin je dis peut-être une connerie, je ne m'y connais pas énorméments dans ce domaine.

            Tu mets ce que tu veux dans le ./debian/rules, c'est un simple makefile.
            Sinon essaie avec dh_make :
            # apt-get install dh-make
            Voilà à quoi ressemble le makefile généré :
            http://lists.debian.org/debian-user-french/2004/11/msg02119.html(...)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.