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