ot Nick Angelow(31-10-2004)

reiting (10)   [ dobre ]  [ zle ]

Printer Friendly Variant za otpechatvane

UNIVERSALNIQT IZHODEN KOD

ili zashto kompilirame programi(te)

http://unix.ginras.ru/linux/base012.html

Aleksei Fedorchuk


Kolkoto goliama i vseobhvatna da e distributsiiata na Linux, izbrana ot krainiia potrebitel, pred nego rano ili kusno iznikva zadachata za instalirane na dopulnitelni paketi ili osuvremeniavane na veche sushtestvuvashtite. Kakvi varianti za izbor vuznikvat pred nego?

Za potrebitelia na paketna distributsiia ot tipa na Red Hat (ili vsiaka druga, osnovana na rpm), natrapvashtoto se reshenie e namirane na neobhodimiia paket v prekompiliran vid i suotveten format (ima i suotvetni uslugi ot tipa na rpm-find, no za suzhalenie, veche sum gi zabravil), sled koeto se izpulniava slednata prosta komanda

$ rpm -ihv ime_na_paketa.rpm

ili neshto podobno. Sled koeto paketa ili se instalira, ili ne se instalira. Ako paketa se instalira – dobre, a ako ne se instalira – ima dva izhoda – da se otkazhem ili da zapochnem vnimatelno da izuchavame poluchenoto suobshtenie za greshka.

Da me izviniat privurzhenitsite na Red Hat i poznavachite na rpm, no tova suobshtenie za greshka, spored men niama da bude osobeno razbiraemo. Po-skoro, smisula mu shte e, che pri instaliraneto na nashiiat paket ne e nameren fail ot tipa ime_rek.so.6 ili neshto podobno. Intuitivno e iasno, che ne e namerena niakakva biblioteka, no da opredelim v koi paket da tursim tozi fail, ot poluchenoto suobshtenie ne e tolkova lesno – imeto na faila v obshtiia sluchai ne suvpada (ili korelira po niakakuv nachin) s imeto na paketa, v koito vliza, toest veroiatnostta potrebitelia da se sbluska s problema za zavisimostite i tiahnoto razreshavane e goliama.

I pak, kolegi rpm-isti, ne hvurliaite po men ertefemiti1. Teoretichno znam, che sushtestvuva standarten nachin za reshavane na tozi problem, dazhe niakolko nachina (vklyuchitelno i nai-radikalniiat – izpolzvane na optsiiata --nodepens). No sega, pochti dve godini sled poslednoto plutno obshtuvane s rpm-bazirani distributsii, mi e trudno da posocha po pamet tezi nachini. I vuv vseki sluchai, nachinite za reshavane na vuzniknali problemi sus zavisimostite, shte budat spetsifichni za vsiaka otdelna distributsiia (po tochno, za prietiiat v neia format na paketite). I navitsite, pridobiti pri rabotata s Red Hat malko shte pomognat pri rabota s Debian ili Slackware.

Za izbiagvane na nedorazumeniia, shte otbelezha, che znam za metoda apt, predvizhdasht avtomatichno poluchavane na paketite i tiahnoto instalirane, s osiguriavane na kontrol vurhu zavisimostite. Neshto poveche, az znam, che tozi metod ima shansa da stane universalen za paketnite distributsii, nezavisimo ot formata na samite paketi. No pri izpolzvaneto na apt vuznikva drug problem – problemut s izlishnite zavisimosti. Kakvo tochno predstavliava tozi problem shte bude podrobno razgledano malko po-kusno. Zasega samo shte otbelezha, che potrebitelia se okazva zavisim ot zavisimostite2, opredeleni ot razrabotchitsite ili ot suzdatelite na distributsiiata, koeto se izraziava v tova, che instalatsiiata na konzolen failov menidzhur ili brauzur vodi sled sebe si instalatsiia na X-survur, Gnome i kakvo li ne oshte. Pri tova instalatsiia ot Mrezhata, po modem ili naeta liniia s progresivno uvelichavashta se tarifa za trafika. Nai-glavnoto e, che potrebitelia e lishen ot vuzmozhnostta da vliiae vurhu instalatsionniiat protses. Poradi koeto, ako negovite nuzhdi ne popadat v ramkite, ustanoveni ot suzdatelite na distributsiiata ili razrabotchitsite na samite paketi, pred nego ima edna edinstvena vuzmozhnost – ruchno kompilirane na programata ot izhodniia kod.

Niakoi mozhe da vuzrazi, che v sustava na vseki klon na Red Hat, zaedno s dvoichnite paketi vlizat i paketi s izhodniia kod na programata vuv format rpm (*.src.rpm), rabotata s koito e vuzmozhna sus sredstvata na programata za upravlenie na paketite. No tova ne vinagi e prilozhimo vuv vsichki vuzmozhni situatsii. Suzdavaneto na programata ot *.src.rpm se izvurshva po pravila, opisani v suotvetniiat .spec fail toest pak po usmotrenie na razrabotchika, a ne na konkretniiat potrebitel. Razbira se, posledniiat e svoboden da promenia tozi .spec fail spored svoite nuzhdi, no kazhete dali tova e po-lesno i prosto ot ruchnoto kompilirane po universalnata shema

$ ./configure && make && make install

I oshte neshto – ne sum silen v suzdavaneto na rpm-paketi, no (imho) nadali postignata po posledniiat nachin guvkavost na nastroikite shte bude nadminata ot i nai-umelo konstruiraniiat spec-fail.

Po drug nachin shte postupi potrebiteliat na niakoia source based distributsiia na Linux ili na niakoia ot versiite na BSD. Vuv vsiaka edna ot tezi sistemi, na negovo razpolozhenie ima tsial kompleks za upravlenie na paketite, izvesten pod imeto portove (v BSD kloningite ili CRUX Linux), portage (v Gentoo Linux), sorcery (v Sorceror Linux i potomtsite mu). Razbira se, i tuk izhodniiat kod se izteglia ot mrezhata, a avtomatichnata sistema za kontrol na zavisimostite sushto e na suvestta na razrabotchika na porta (portage). No a) tazi sistema za kontrol mozhe da bude poveche (v Gentoo Linux) ili po-malko (vuv vsichki ostanali sluchai) nastroena globalno i b) vinagi mozhe da se otkazhem ot avtomatichnata sistema za kontrol v polza na poluruchnoto opredeliane na promenlivite i optsiite na kompilatsiia ili prosto ruchno da konfigurirame vsichko.

Vupreki vsichko, i na potrebitelia na portirani sistemi mozhe da se nalozhi da kompilira ruchno nai-malkoto otdelni paketi,naprimer na tezi, koito vse oshte ne sa obhvanati ot sistemata na portovete na negovata distributsiia ili prosto na nai-novite versii. A v kraina smetka, guvkavostta na ruchnoto kompilirane vse edno ostava nenadminata. Pokazatelni sa dumite na Andrei Lavrentiev otnosno FreeBSD – „vseki uvazhavasht sebe si sistemen administrator, rano ili kusno prekompilira sus svoi nastroiki vsichki kritichni za nego paketi“, koeto na praktika oznachava ruchno kompilirane – vuv port-sistemata na FreeBSD niama sredstva, analogichni na globalnata promenliva USE ot Gentoo). I tui kato na nastolna mashina, vseki potrebitel e i sistemen administrator, to gornoto mozhe da se razprostrani i vurhu vseki (uvazhavasht sebe si) potrebitel.

Kakvo e neobhodimo na potrebitelia za kompilirane na paket ot izhoden kod? Purvo, tova e nabora ot programi, narichani obiknoveno instrumentarium na razrabotchika3 (makar,che v sluchaia te da se iaviavat instrument za kompilirane, nie niama da razglezhdame sluchaite na vnasiane na promeni v izhodniiat kod, s izklyuchenie na nai-ochevidnite). Takiva instrumenti ima vuv vsiaka normalna distributsiia (s izklyuchenie na nai-spetsializiranite, no puk tam te obiknoveno lesno se dobaviat). Vuprosut e v tova. Dali sa bili instalirani pri purvonachalnata instalatsiia ili potrebitelia gi e propusnal, strahuvaiki se ot tiahnata slozhnost ili prosto e reshil, che sa nenuzhni.

Po-natatuk sa neobhodimi osnovnite sistemni biblioteki, takiva kato glibc. No te se namirat vinagi vuv vsiaka pulnofunktsionalna distributsiia – bez tiah niama da e vuzmozhna rabotata na nito edna programa.

I nakraia, bez da kazvam niakakva velika mudrost, shte otbelezha, che za kompilatsiiata na paketite ot izhoden kod e neobhodim samiiat izhoden kod. A tuk veche zapochvat uslozhneniiata. Razbira se, svezhiiat tarball s izhodniiat kod lesno mozhe da se iztegli ot Mrezhata, vupreki, che ne vinagi tova shte e tolkova lesno – za takiva chudovishta kato Xfree86, OpenOffice, KDE ili GNOME mozhe da se nalozhi da se iztegliat stotitsi megabaitove, koeto e po silite ne na vsiaka vruzka (i ne na vseki dzhob).

No shte priemem, che tova sa trudnosti na prakticheskata realizatsiia. No ima i printsipno uslozhnenie – tova sa tezi proslovuti zavisimosti na paketite. Ako sistemi ot tipa apt, portove ili portage, osvobozhdavat potrebitelia ot tozi problemi to pri napulno ruchnoto kompilirane toi ostava s nego litse v litse. Niama da spomenavam i tova, che za smetka na zavisimostite, nuzhdata ot iztegliane po Mrezhata sushtestveno narastva: dostatuchno e da poglednem na debian.org (koeto e edno ot nai-dobrite mesta za izuchavane na zavisimostite na paketite) spisuka na softuera, neobhodim za kompilatsiiata i rabotata na niakakuv ne osobeno slozhen paket, naprimer ot tipa na Midnight Commander.

A ako zapochnem da govorim za Xfree86 ... Izpulniavaiki v Gentoo Linux komandata

$ emerge --pretend xfree

nie shte namerim v spisuka na neobhodimoto i moduli za poddurzhane na plansheti wacom, i draiveri za videokarti 3Dfx, i niakakvi shriftovi failove, i mnogo, mnogo drugi neshta, pri tova nezavisimo ot fakta dali nie imame v sistema grafichen planshet, videokarta 3Dfx i dali imame naistina nuzhda ot dopulnitelni shriftove).

No tozi diavol ne e tolkova strashen, kolkoto go opisvat. I v roliata na svetena voda vliza razbiraneto na prostata istina: zavisimostta za zavisimostta lupus est4. Kazano po drug nachin, ima paketi, absolyutno neobhodimi za kompiliraneto i rabotata na dadena programa, ima i paketi, koito pridavat na nashata programa samo niakoi dopulnitelni svoistva.

Pochti vuv vsichki opisaniia na zavisimosti, koito sum vizhdal, razlika mezhdu absolyutnite (ili tvurdi) zavisimosti i „optsionalni“ zavisimosti (mozhe da gi narechem meki) v iaven vid ne se pravi. Nemnogobroinite izklyucheniia sa sushtiiat tozi debian.org i dokumentatsiiata na Gentoo.org po rabotata s portages. Razbira se, na posochenite saitove ne triabva da se tursi universalni retsepti za vsichki vuzmozhni sluchai, no razbiraneto na printsipnite razliki mezhdu absolyutnite i optsionalnite zavisimosti mnogo shte pomogne – i v dvata sluchaia, tezi razliki se posochvat tvurde posledovatelno.

Ochevidno e, che bez absolyutnite zavisimosti niama da mozhem nito da kompilirame, nito da startirame daden paket. Vsiaka programa za Linux iziskva niakakvi funktsii ot glavnata sistemna biblioteka glibc, prakticheski vsichki konzolni prilozheniia izpolzvat niakakva terminalna biblioteka ot tipa na ncurses, za prilozheniiata, raboteshti pod X e neobhodima bibliotekata xlib, KDE prilozheniiata ne mogat da sushtestvuvat bez bibliotekata Qt i taka natatuk.

Tova sa ochevidni primeri. Pochti tolkova iasno e, che programite za rabota s grafika, ot prostata fbgrab do GIMP sa nemislimi bez bibliotekite na grafichnite formati (png, gif, tiff, jpeg), a programite za rabota sus zvuk – bez multimediinite biblioteki za suotvetnite formati (mpeg ili ogg-vorbis). Po-malko ochevidno e, zashto za kompilatsiiata (i rabotata) na Mozilla, niamashta nikakvo otnoshenie kum GNOME, e neobhodima bibliotekata Gtk – no zasega podobnite sluchai mozhe samo da gi otbeliazvame, che sushtestvuvat.

Lesno se vizhda, che v roliata na absolyutni zavisimosti obiknoveno se iaviavat niakakvi biblioteki. I osnovnata (i edva li ne edinstvena) trudnost tuk e v suotvetstvieto na versiite. Naprimer, edni ot prilozheniiata, izpolzvashti bibliotekata Gtk, iziskvat nepremenno neinata vtora versiia, dokato drugi prilozheniia se zadovoliavat s purvata (a s vtorata, mezhdu drugoto ne mogat da se kompilirat). No v mnogo sluchai, tvurdata zavisimost sushtestvuva samo za versiite v niakakuv interval (ili kazano po drug nachin – za daden paket e neobhodima versiia na bibliotekata glibc, ne po-niska ot ##).

No bez sushtestvuvaneto na absolyutnite zavisimosti, ne mozhe da kompilirame uspeshno daden paket, kato e bez znachenie dali vruzkata mu s bibliotekata (ili niakakvo prilozhenie) lezhi na povurhnostta ili e oposredstvena po niakakuv drug nachin. Eto obache, che optsionalnite zavisimosti, kazano strogo, ne sa neobhodimi za kompiliraneto i funktsioniraneto na sushtiiat tozi paket. I makar, che mnogo ot tiah se opredeliat po podrazbirane ot razrabotchitsite ili kompilirashtite paketa, e vuzmozhno da se oturvem ot tiah, i to po razlichni nachini.

Prakticheski vsiaka programa pod abstraktniiat Unix, v svoia spisuk sus zavisimosti shte nameri groff, a programite ot proekta GNU - i Texinfo. Ne poradi prichinata, che tezi programi za obrabotka na tekst sa neobhodimi za rabotata primerno na audiopleiur, a samo zaradi izpolzvaneto na tezi programi v sistemite za ekranna dokumentatsiia man i info. A bez tezi sistemi za ekranna dokumentatsiia, nito edna uvazhavashta sebe si programa ne mozhe da mine. I zatova lipsata v sistemata, primerno, na Texinfo shte predizvika greshka pri kompilatsiiata ili instaliraneto prakticheski na vsiako edno GNU prilozhenie.

Razbira se, bez ekranna dokumentatsiia ne e mnogo interesno da se zhivee. No az prakticheski ne izpolzvam info-stranitsi i zatova na moiata domashna samodelna sistema Texinfo ne e instaliran. A za da predotvratia poiavata na greshki na stadiia make ili make install, sled izpulnenieto na konfiguratsiiata prosto otstraniavam ruchno direktoriiata sus suotvetnata dokumentatsiia.

No tozi primer na deistvie dazhe ne e pila, a po-skoro topor, zashtoto skripta za konfigurirane e prednaznachen imenno za izklyuchvane na optsionalnite zavisimosti. I estestveno da gi vklyuchi, ako se poiavi takava nuzhda. Samo deto ne moga da si spomnia niakoga da mi se e nalagalo neshto da vklyuchvam ...

V niakoi sluchai, tova izklyuchvane se izvurshva ot samosebe si – konfiguratsionniia skript, izpulniavaiki proverka na sistemata, namira nalichieto ili otsustvieto na niakakva biblioteka i prosto ignorira suotvetnata funktsiia v kompiliraniia paket. V drugi sluchai, tova se nalaga da se napravi v iaven vid s pomoshtta na optsiite --disable ili --without v komandniiat red ./configure.

Triabva da otbelezha, che premahvaneto na nenuzhnite zavisimosti ne samo vodi do namaliavane na vhodiashtiia trafik (i do ikonomiia na miasto, makar, che pri dneshnite razmeri na tvurdite diskove, tova ne e tolkova aktualno – po-vazhno, spored men, e tova, che sistemata se osvobozhdava bez izklyuchenie ot komponentite s neiasen proizhod, koito sushtestvuvat vuv pochti vsichki paketni distributsii). Vodi i do povishavane na udobstvoto na izpolzvane pri niakoi programi. Kato primer shte priveda moia lyubim gmp – spored men i mc i osobenno links, kompilirani bez neia, sa mnogo po-izpolzvaemi, makar che niamam namerenie da se otkazvam izobshto ot konzolnata mishka – niama po-udobno sredstvo da premestish URL ot konzola s links v konzola s tekstov redaktor.

I nakraia, izklyuchvaneto na nenuzhnite zavisimosti v niakoi sluchai okazva blagotvorno vliianie i vurhu burzodeistvieto na programite. No tuk veche plavno preminavame ot problemite na zavisimostite kum vuprosite za optimizatsiia, koeto veche e druga istoriia.

Zashtoto glavnata optimizatsiia se izvurshva po vreme na samata kompilatsiia, v hoda na izpulnenieto na programata make i se zadava sus spetsialni flagove za kompilatora. Nai-vazhnite ot tiah sa – flaga za zadavane na nivoto na optimizatsiia (ot -O0, toest bez optimizatsiia vuobshte, do -O3) i flaga za optimizatsiia za daden tip protsesor ( -mcpu=type i -march=type, kato argumenti se izpolzvat imenata na protsesorite, poddurzhani ot tekushtata versiia na gcc, a ot versiia 3.3.x nagore se poddurzha tseliiat zoopark ot h-86 suvmestimi protsesori). Vodeni ot obshti suobrazheniia, mozhe da predpolozhim, che za grafichni i multimediini prilozheniia polezna shte se okazhe optimizatsiiata za klasicheski koprotsesor ili za spetsialnite nabori ot instruktsii ot vida SSE ili 3DNow (flag -mfpmath s argumenti 387 ili sse, i edin ot flagovete -msse, -msse2 ili -m3dnow, v zavisimost ot tipa protsessora), no na praktika neshtata ne sa tolkova ednoznachni (za spravka – tsikula na testvane).

V kompilatora gcc ne sa malko i se izpolzvat ne samo za optimizatsiia, no i za suhraniavane na dopulnitelna informatsiia, polezna za nastroivaneto na sistemata (ili za izchistvaneto na tazi informatsiia), za povishavane na burzodeistvieto na samiia protses5, kakto i za oshte mnogo drugi tseli6. V kraina smetka, redut na komandata make mozhe da stane mnogo dulug i da se vuvezhda vseki put na ruka burzo mozhe da omruzne. Tova mozhe da se izbegne sravnitelno lesno – dostatuchno e da opishem v profilniia fail (na sistemata ili na otdelniiat potrebitel) slednata promenliva

CFLAGS="flagove i stoinosti, razdeleni s interval"

za programi na S, i promenlivata

CXXFLAGS="$CFLAGS"

za programite na S++, kato ne zabraviame da gi eksportirame (za lyubitelite na tcsh – da gi opredelim s komandata setenv). Samo triabva da se ima predvid, che niakoi otdelni programi mozhe da otkazhat da se kompilirat s flagove ot tipa -O3 i -march, makar, che pri Linux takiva sum sreshtal mnogo riadko ( s gcc versiia 3.1 i nagore).

Triabva da spomenem i tova, che mozhe da prekompilirame i samiiat kompilator gcc, koeto bi uskorilo protsesa na kompilatsiia. Osobeno efektiven v tova otnoshenie e taka narecheniiat bootstraping – prekompilirane na gcc ot samiia nego, koeto se izpulniava s komandata

$ make bootstrap

a flagovete za optimizatsiia se opredeliat ot promenliva ot tipa

BOOT_CFLAGS="-O3 -march=pentium4"

(neobhodimoto da se dobavi). Po sushtestvuvashti otsenki, tova mozhe da dovede do 30% uvelichavane na skorostta na kompilatsiia, naprimer, na iadroto na sistemata, koeto se doblizhava do istinata.

Drug nachin za uvelichavane na skorostta na kompilatsiia (koito za paketi ot tipa na Xfree86, da ne spomenavame OpenOffice, mozhe da otneme poveche ot edin chas dazhe na mnogo moshtni mashini) mozhe da se realizira pri nalichie na goliamo kolichestvo operativna pamet. Za tazi tsel e neobhodimo da se poddurzha virtualnata failova sistema tmpfs, koeto se zadava pri konfiguratsiiata na iadroto i montiraneto i kum niakakva direktoriia ot vida /tmp, /dev/shm (standartnoto za neia miasto)

Pretsenkata na uvelichavaneto na burzodeistvieto na kompiliranite paketi sushto taka e silno subektivna, kakto mezhdu drugoto i otsenkata na burzodeistvieto na Linux kato tsialo. Ponezhe „Linux po podrazbirane po opredelenie e glupost (za razlika ot „Windows po podrazbirane“), potrebitelia, koito ne nastroiva Linux kakto mu haresva, e za drugarskiia sud na Linch, s prinuditelno preminavane kum izpolzvane na prozortsite (© Vladimir Ignatov). A kakvi nastroiki sa okazali nai-goliamo vliianie za krainoto burzodeistvie e mnogo trudno da se opredeli tochno.

Malko sobstven opit – sled kato svurshih s tezhkiia trud po kompilatsiiata na sobstvena sistema (po metoda Pure Linux s niakoi modifikatsii, komplektovane na paketite – s goleminata na silno olekoten CRUX), az biah prosto potresen ot skorostta na neinata rabota. No koe se okaza s po-goliama tezhest – dali optimizatsiiata pod Pentium-4 (s posochenite po-gore flagove), prevuzhodstvoto na tekushtiia togava gcc (versiia 3.3) nad negovite predshestvenitsi, namaliavaneto na uslugite i demonite, puskani pri startirane na sistemata ili optimizatsiiata na iadroto – ne moga da tvurdia sus sigurnost. A da povtariam protsesa poetapno s kolichestveni izmervaniia – niamam zhelanie, koeto mezhdu drugoto, mozhe da se razglezhda kato argument v polza na kompleksniiat podhod pri samostoiatelnoto izgrazhdane na sistemata.

No az zapochnah tozi razgovor ne v konteksta na samostoiatelnoto izgrazhdane, a s malko po-drugi tseli. Purvo, da nasocha vnimanieto na potrebitelite na paketni distributsii (za potrebitelite na distributsii, osnovani na izhoden kod, nai-veroiatno ne sum kazal nishto novo) kum realnata alternativa na tehnite sistemi za upravlenie na paketi – ruchnoto kompilirane, pone za kritichno vazhni prilozheniia.

Vtorata tsel e da podchertaia, che kakvato i distributsiia na Linux da izpolzvate (ili dazhe kakvato i da e BSD sistema), osnovata na prilozheniiata v tiah e obshta. I sa porodeni ot dvizhenieto za svoboden softuer v shirokiiat smisul na dumata. A izhozhdaiki ot imeto e iasno, che vsiako edno ot tezi prilozheniia vinagi e dostupno kato izhoden kod, i mogat da budat kompilirani samostoiatelno po universalnata za vsichki tiah shema.

Kato zaklyuchenie ne moga da ne izrazia svoiata priznatelnost kum Vladimir Popov – vsichko, izlozheno po-gore beshe okonchatelno osmisleno v protsesa na korespondentsiiata i lichnoto obshtuvane s nego.



prevod: Nikolai Angelov

1sobakit – planinska poroda kamuni, koiato se hvurlia po kucheta, dokato ertefemitite (imeto im proizliza ot sukrashtenieto RTFM) se hvurliat po neshtastnite potrebiteli (A.F.).

2izviniavaite za tavtologiiata (A.F.)

3development tools – taka sa narecheni pone v distributsiiata Fedora Core 2.

4perifraza na latinskata sententsiia 'homo hominem lupus est – chovek za choveka e vulk'

5iavno na protsesa na kompilirane

6za poveche detaili e neobhodimo da se oburnem kum suotvetnata stranitsa man gcc za tekushtata versiia na gcc (A.F.)



<< Slackware i Promise FastTrak 378 RAID kontroler | PPPoE i HomeLan nastroika >>