Függőség kinyerése forrásból

Fórumok

Sziasztok.

Érdekelne, van e rá valami mód vagy program, amivel forrásból telepített csomagból ki lehet nyerni milyen függőségekre lesz szükség. Azt tudom, ha lefuttatom a configure -t akkor úgy is jelzi mik hiányoznak. De mondjuk lehet listát csinálni a hiányzó csomagokról?

Hozzászólások

Nyelv fuggo. Vannak nyelvek, ahol szokas a fuggosegeket egy jol parsolhato fileban (requirements.txt, package.json, stb) tarolni. C eseteben ilyen nem nagyon van.

--
|8]

Nem, megbizhatoan nem lehet. Nezhetsz ldd-vel shared library dependencyket, es abbol vissza lehet kovetni, hogy mely csomaghoz tartozik (dpkg-shlibdeps valami ilyesmit csinal), es bar ez sok esetben mukodik, ha dinamikusan, futas idoben tud betolteni modulokat, vagy libeket, akkor nem.

Es ez is csak a dependenciak egy reszet tarja fel. Dependalhat meg egy rakas olyan dologra ami linkelesnel nem latszik.

--
|8]

Nézzük az mc-t, ahhoz több dolog kell.
Itt speciel az INSTALL fájl nyújthat támpontot, ahol a függőségek fel vannak sorolva. Nyilván nincs minden forrás mellé adva egy INSTALL fájl. Lehet, hogy ez egy REQ, README vagy hasonló lesz. De még ha sikerülne is kitalálni, hogy melyik fájlban lesznek a szükséges dolgok, nehéz lenne feldolgozni. Hiszen a legtöbbször angol mondatok között szerepel egy felsorolás-szerűség. De ha még véletlenül ezt is csak sikerülne feldolgozni, akkor se vagyunk nagyon előre, hiszen sok disztróban a -dev csomagok külön vannak (amelyekben pl. a header-fájlok szerepelnek). Honnan tudjuk, hogy elegendő a glib2 vagy van egy glib2-dev (vagy glib2-devel vagy glib2-headers) csomag, ami a fordításhoz kelleni fog? Vagy akár lehet, hogy nem is glib2 néven fut a csomag, hanem glib vagy glib2x. Nekem reménytelennek tűnik egy, legalább néhány esetben működő megoldás találása.
Ami még lehetséges: a forrás feldolgozása. Ha C/C++ nyelven írodott, esetleg a #include sorokkal lehetne valamit kezdeni. De honnan fogod tudni, hogy a foo.h melyik csomagban található? Ehhez kellene egy adatbázis (vagy akár neten is lehet próbálkozni kereséssel). Ha nem C/C++ nyelven írodott, akkor tudni kell, hogy perl/python/php/ruby/go/java/... esetén mit kell keresni.

Ha esetleg létezik hozzá Debian vagy RPM csomag, akkor a Debian forrásból illetve a src.rpm -ből össze lehet mazsolázni.

Nincs. És persze a configure sikeres lefutása sem garantál semmit, azt is emberek csinálták, csak az van benne, amit nem felejtettek ki belőle.

Vagyis ha jól értem, egy linuxos dependency walker kéne neked. Ezen az irányon elindulva hirtelen ezeket találtam:
http://www.purinchu.net/software/elflibviewer.php
https://sourceforge.net/projects/binscan/

egy próbát talán megérnek, sajnos nem tudtam kipróbálni hogy tényleg jól mennek-e, ha esetleg nem akkor ezen az úton lehet tovább keresgélni :)

Edit: Ühm, lehet ezt egy picit félreértettem, ez fordítás előtt nem játszik -.- viszont ha megvan a forrás abból ki lehet vadászni :)

Öööö, az a gond, hogy a #include-ot a configure szépen kikonfigurálja, hiszen nincs meg a lib/include fájl. Viszont a kód később szeretne random függvényt, vagy rosszabb esetben makrót/típusdefiníciót használni - na eleve jöjjél rá, hogy a hibaüzenet miért is van (mondjuk pl. ha egy típusdefiníció hibádzik, akkor azt változónévnek fogja gondolni a C, ergó valami totál random syntax error lesz belőle, amit megérteni is kihívás), aztán találd ki, hogy vajon az az izé, na az melyik lib/csomag include fájljából kellett volna jöjjön.

TL;DR

Az, amit szeretnél, az nem létezik.

forrásból telepített csomagból

Ha a csomag már telepítve van, azaz sikeresen lefordult, az ldd sokszor praktikus lehet:

$ ldd /usr/local/bin/mc                                                                                                                             
/usr/local/bin/mc:                                                                                                                                  
        libslang.so.2 => /usr/local/lib/libslang.so.2 (0x80092b000)                                                                                 
        libncurses.so.8 => /lib/libncurses.so.8 (0x800e14000)                                                                                       
        libssh2.so.1 => /usr/local/lib/libssh2.so.1 (0x801061000)                                                                                   
        libgmodule-2.0.so.0 => /usr/local/lib/libgmodule-2.0.so.0 (0x80128b000)                                                                     
        libglib-2.0.so.0 => /usr/local/lib/libglib-2.0.so.0 (0x80148e000)                                                                           
        libintl.so.8 => /usr/local/lib/libintl.so.8 (0x801799000)                                                                                   
        libthr.so.3 => /lib/libthr.so.3 (0x8019a4000)                                                                                               
        libc.so.7 => /lib/libc.so.7 (0x801bc9000)                                                                                                   
        libm.so.5 => /lib/libm.so.5 (0x801f76000)                                                                                                   
        libz.so.6 => /lib/libz.so.6 (0x80219f000)                                                                                                   
        libssl.so.7 => /usr/lib/libssl.so.7 (0x8023b5000)                                                                                           
        libcrypto.so.7 => /lib/libcrypto.so.7 (0x802621000)                                                                                         
        libiconv.so.2 => /usr/local/lib/libiconv.so.2 (0x802a16000)                                                                                 
        libpcre.so.1 => /usr/local/lib/libpcre.so.1 (0x802d10000)

Esetleg nézd meg az adott program gentoo-féle ebuild-jét, abból könnyen csinálhatsz (opció-függő) listát :)

configure.in vagy a makefile.in fájlokból lehet kinyerni. Ezeket az autotools eszi meg. Nem fehér embernek való meló. Ezért külön szakma a maintainerek.

--
GPLv3-as hozzászólás.