Proizvodstvenno-vnedrencheskij kooperativ
"I N T E R F E J S"
Dialogovaya Edinaya Mobil'naya
Operacionnaya Sistema
Demos/P 2.1
Interpretator
make
Moskva
1988
ANNOTACIYA
Opisan interpretator make, ispol'zuemyj dlya sborki
paketov programm, minimiziruyushchij chislo vyzovov translyatora.
1. Vvedenie
Interpretator make [1], naibolee chasto ispol'zuemyj
programmistami DEMOS, predostavlyaet unikal'nye vozmozhnosti
po upravleniyu lyubymi vidami rabot v operacionnoj sisteme.
Vsyudu, gde imeetsya neobhodimost' uchityvat' zavisimosti faj-
lov i vremena ih sozdaniya (modifikacii), make okazyvaetsya
nezamenimym instrumentom. Interpretator realizuet neproce-
durnyj yazyk, kotoryj pozvolyaet upravlyat' gruppami komandnyh
strok sistemy. V osnovu takogo upravleniya polozheny zavisi-
mosti mezhdu fajlami s ishodnymi dannymi i fajlami, v kotoryh
soderzhatsya rezul'taty. Pri etom predpolagaetsya lyuboj vozmozh-
nyj spisok dejstvij nad ishodnymi fajlami: kompilyaciya, mak-
roobrabotka, redaktirovanie, pechat', upakovka ili shifrovanie
i t.d. Ishodnoj informaciej dlya interpretatora yavlyaetsya
Make-programma, predstavlyashchaya spisok opredelenij makropere-
mennyh i spisok pravil. Kazhdoe pravilo vklyuchaet formulirovku
celi i spisok dejstvij dlya interpretatora shell. Pri vypol-
nenii Make-programmy interpretator make ispol'zuet informa-
ciyu o svyazyah mezhdu celyami i rezul'tatami i peredaet na
vypolnenie shell spiski dejstvij, kotorye v dannyj moment
neobhodimo vypolnit' dlya polucheniya zadannogo rezul'tata.
Takim obrazom, interpretator make pozvolyaet zapisyvat' lyuboj
nabor dejstvij nad ishodnymi dannymi, blagodarya chemu on
shiroko ispol'zuetsya pri reshenii prikladnyh i obshchesistemnyh
zadach. Ochen' vazhno i to, chto Make-programma stanovitsya
obshchesistemnym standartnym opisaniem struktury zadachi, algo-
ritma sborki i ustanovki programmnogo kompleksa. Program-
mist, vladeyushchij sredstvami interpretatora make, ispol'zuet
sleduyushchuyu tehnologiyu razrabotki programmnogo kompleksa,
nezavisimo ot ego slozhnosti:
redaktor -> make -> proverka -> redaktor
Pri takoj tehnologii sushchestvenno povyshaetsya proizvoditel'-
nost' truda programmista,tak kak on osvobozhdaetsya ot ruchnoj
sborki programm, sokrashchaetsya zagruzka |VM - make "sledit" za
tem, chtoby pri mnogokratnyh kompilyaciyah i otladkah programm
"ne delalols' to, chto mozhno ne delat'".
Vazhno otmetit', chto make yavlyaetsya sredstvom avtomatiza-
cii procedur ustanovki komponent DEMOS. Naprimer, komponenta
sistemy cat mozhet vklyuchat' sleduyushchie fajly:
vypolnyaemyj kod - fajl /bin/cat
tekst programmy - fajl ./src/cmd/cat/cat.c
dokumentaciyu - fajl ./man/man1/cat.1
programmu sborki - fajl ./src/cmd/cat/Makefile
Fajl ./src/cmd/cat/Makefile soderzhit vsyu neobhodimuyu dlya
pravil'noj kompilyacii i ustanovki v OS komponenty cat infor-
maciyu. Osobenno effektiven make dlya vypolneniya rabot v
programmnyh proektah maloj i srednej (do 200 fajlov)
- 3 -
velichin.
2. Principy vypolneniya Make-programmy
Interpretator make vypolnyaet programmu, kotoruyu budem
nazyvat' Make-programmoj. Make-programma soderzhit strukturu
zavisimostej fajlov i dejstvij nad nimi, oformlennyh v vide
spiska pravil. Vypolnenie dejstvij privodit k sozdaniyu tre-
buemyh fajlov. Dopustim, imeyutsya fajly
a b c d e f
iz kotoryh opredelennym obrazom neobhodimo poluchit' fajl E.
Pust' dalee izvestno, chto nad razlichnymi kombinaciyami ishod-
nyh fajlov vypolnyayutsya nekotorye dejstviya, a rezul'taty
budut razmeshcheny v promezhutochnyh fajlah A, B, C i D. Rass-
motrim graf, uzly kotorogo - imena fajlov. Dugi grafa otra-
zhayut zavisimosti fajlov, strelka ukazyvaet napravlenie pre-
obrazovanij ot ishodnyh fajlov k fajlam, kotorye neobhodimo
poluchit'.
V Make-programme kazhdoj pare (x,y) incidentnyh uzlov
etogo grafa stavitsya v sootvetstvie spisok dejstvij, vypol-
nenie kotoryh privedet k sozdaniyu x. Kogda fajl x sushchest-
vuet, spisok dejstvij ne vypolnyaetsya, no tol'ko v tom slu-
chae, esli fajl y sozdan (modificirovan) ran'she po vremeni,
chem fajl x. Kazhdoj duge grafa mozhno postavit' v sootvetsvie
znachenie funkcii t(x,y). Funkciya t(x,y) vozvrashchaet rezul'tat
v vide
/\
cel' E / \
| /----\
| ||
t(E,D ) | t(E,C) ||
----------------------- ||
| | ||
cel' D cel' C ||
t(D,A) | t(D,B) | ||
---------------- | ||
| | | ||
cel' A cel' B | ||
| | t(C,e)| ||
t(A,a)| t(A,b) t(B,c)| t(B,d) t(C,d)| ||
------------ ------------ ------- ||
| | | | | | ||
| | | | | | ||
a b c d e f ||
- 4 -
x MOLOZHE y - spisok dejstvij ne vypolnyaetsya;
x STAREE y - spisok dejstvij vypolnyaetsya.
Mnozhestvo znachenij funkcii t(x,y) obrazuet strukturu dinami-
cheskih (zavisyashchih ot vremeni) svyazej mezhdu fajlami. Na etoj
osnove interpretator make vydelyaet te razdely Make-
programmy, kotorye mozhno ne vypolnyat'.
Vyshe predpolagalos', chto kazhdyj uzel grafa - eto fajl.
Sushchestvuet vozmozhnost' zapisat' v Make-programme spisok
dejstvij, vypolnenie kotoryh ne svyazano s sozdaniem fajla.
Poetomu v obshchem sluchae uzel grafa pravil'nee nazyvat' cel'yu.
Para incidentnyh uzlov grafa obrazuet cel' i podcel'. V pri-
mere uzel E - cel', uzly D i C - podceli celi E. Analogichno
uzel D - cel', uzly A i B - podceli celi D. Nakonec, uzel A
- cel', uzly a i b - podceli uzla A. Perechislenie vida CELX
- PODCELI otrazhaet obobshchennuyu strukturu algoritma dostizheniya
celej.
Vvedem ponyatie rekonstrukciya fajla-celi. Esli fajl-cel'
sushchestvuet i "MOLOZHE" vseh fajlov, ot kotoryh zavisit, to on
ostaetsya bez izmenenij, inache, esli fajl-cel' sushchestvuet i
"STAREE" kakogo-libo fajla, ot kotorogo zavisit, on rekonst-
ruiruetsya (izgotavlivaetsya zanovo).
Privedem primer Make-programmy, sootvetstvuyushchej prive-
dennomu vyshe grafu. Programma vyglyadit kak ego linejnaya
zapis':
E : D C # E zavisit ot D i C
cat D C > E # dejstvie pravila 1
D : A B # D zavisit ot A i B
cat A B > D # dejstvie pravila 2
A : a b # A zavisit ot a, b
cat a b > A # dejstvie pravila 3
B : c d # B zavisit ot c, d
cat c d > B # dejstvie pravila 4
C : e f # C zavisit ot e, f
cat e f > C # dejstvie pravila 5
clean clear:
-rm -f A B C D E
Zdes' soderzhitsya 6 pravil. Kazhdoe pravilo vklyuchaet stroku
zavisimostej fajlov i komandnuyu stroku sistemy. Pravilo
opisyvaetsya prosto: snachala ukazyvaetsya imya fajla, kotoryj
- 5 -
neobhodimo sozdat' (cel'), zatem dvoetochie, zatem imena faj-
lov, ot kotoryh zavisit sozdavaemyj fajl (podceli), zatem
stroki dejstvij. Pervuyu stroku pravila nazovem strokoj
zavisimostej. Sleduet obratit' vnimanie na shestoe pravilo:
v nem pustoj spisok podcelej v stroke zavisimostej. Sintak-
sis strok dejstvij sootvetstvuet sintaksisu komandnyh strok
shell. Pervym simvolom stroki dejstviya v Make-programme dol-
zhen byt' simvol tabulyacii (ili 8 probelov) - eto obyazatel'-
noe uslovie.
Vse posledovatel'nosti simvolov, nachinaya ot simvola # i
do konca stroki, yavlyayutsya kommentariem. Pustye stroki i lish-
nie probely ignoriruyutsya. Esli Make-programma razmeshchena v
fajle Makefile, to imya fajla s Make-programmoj v komandnoj
stroke mozhno ne ukazyvat'. Dopustim, fajl s Make-programmoj
nazyvaetsya Makefile, v rabochem kataloge imeyutsya fajly a, b,
c i d. Fajly A, B, C i D otsutstvuyut, togda po komande make
my poluchim rezul'tat - fajl E i fajly A, B, C i D. Rassmot-
rim poryadok vypolneniya Make-programmy, kogda eti fajly uzhe
sushchestvuyut, t.e. pri povtornom vypolnenii komandy make.
Pervyj shag vypolneniya Make-programmy:
E : D C
cat D C > E
Esli fajly D i C sushchestvuyut i ne trebuetsya ih rekonstrukciya,
a fajl E "MOLOZHE", chem fajly D i C, to make prekratit vypol-
nenie programmy - fajl E gotov. Esli trebuetsya rekonstruk-
ciya fajlov D i/ili C, to osushchestvlyaetsya perehod k vypolneniyu
podcelej D i/ili C, zatem vozvrat k etomu pravilu. Inache,
esli trebuetsya rekonstrukciya fajla E, to vypolnyaetsya dejst-
vie etogo pravila i make prekrashchaet vypolnenie programmy -
gotov rekonstruirovannyj fajl E. Inache, esli otsutstvuyut
fajly D i/ili C, budut vypolneny podceli D i/ili C v tom
poryadke, v kotorom oni ukazany v spiske zavisimostej, zatem
vypolnyaetsya dejstvie etogo pravila i make prekratit vypolne-
nie programmy - gotov fajl E.
Vtoroj shag vypolneniya Make-programmy:
D : A B
cat A B > D
Esli fajly A, B i D sushchestvuyut i ne trebuetsya ih rekonst-
rukciya, to vypolnyaetsya perehod k sleduyushchemu shagu Make-
programmy (fajl D uzhe gotov). Esli trebuetsya rekonstrukciya
fajlov A i/ili B, proishodit perehod k vypolneniyu podcelej A
i/ili C, zatem vozvrat k etomu pravilu. Inache, esli trebu-
etsya rekonstrukciya fajla D, vypolnyaetsya dejstvie etogo pra-
vila i perehod k sleduyushchemu shagu vypolneniya Make-programmy.
Inache, esli otsutstvuyut fajly A i/ili B, budut vypolneny
podceli A i/ili B v tom poryadke, v kotorom oni ukazany v
- 6 -
spiske zavisimostej, zatem dejstvie etogo pravila i perehod
k vypolneniyu pervogo pravila Make-programmy.
Tretij shag vypolneniya Make-programmy:
A : a b
cat a b > A
Proveryaetsya nalichie fajlov a i b v rabochem kataloge. Pri
otsutstvii hotya by odnogo iz nih vypolnenie programmy prek-
rashchaetsya. Zatem proveryaetsya nalichie fajla A, esli ego net
ili trebuetsya ego rekonstrukciya, vypolnyaetsya dejstvie etogo
pravila. Inache osushchestvlyaetsya perehod k vypolneniyu vtorogo
pravila.
CHetvertyj shag vypolneniya Make-programmy:
B : c d
cat c d > B
Dejstviya analogichny opisannym v tret'em shage, perehod osu-
shchestvlyaetsya k vypolneniyu vtorogo pravila.
Pyatyj shag vypolneniya Make-programm:
C : e f
cat e f > C
Proveryaetsya nalichie fajlov e i f v rabochem kataloge. Pri
otsutstvii hotya by odnogo iz nih vypolnenie programmy prek-
rashchaetsya. Zatem proveryaetsya nalichie fajla C, esli ego net
ili trebuetsya ego rekonstrukciya, vypolnyaetsya dejstvie etogo
pravila. Inache osushchestvlyaetsya perehod k vypolneniyu pervogo
pravila.
Pri vyzove interpretatora make v komandnoj stroke mozhno
ukazat' imya celi. Esli, naprimer, neobhodimo poluchit' fajl
D, to komandnaya stroka vyglyadela by tak
% make D
ili esli neobhodimo poluchit' fajly C i D, to komandnaya
stroka vyglyadela by
% make C D
Takim obrazom, imya fajla-celi v komandnoj stroke opredelyaet
vhod v Make-programmu. Esli zadano neskol'ko vhodov, to make
vypolnit v ukazannom poryadke vse neobhodimye razdely Make-
programmy. Esli zhe vhod ne ukazan, vypolnyaetsya pervoe pra-
vilo Make-programmy.
- 7 -
V shestom pravile primera cel' ne yavlyaetsya fajlom, eto
vazhnaya osobennost' make. Programmistu predostavlyaetsya voz-
mozhnost' zapisat' pravilo, cel' i/ili podceli kotorogo ne
yavlyayutsya fajlami. V takom sluchae cel' - eto imya vhoda v
Make-programmu (ili metka pravila). SHestoe pravilo ispol'-
zuetsya v programme dlya udaleniya fajlov. Sleduet obratit'
vnimanie na to, chto v etom pravile dva imeni celi (clean i
clear), poetomu v komandnoj stroke mozhno ukazyvat' lyuboe imya
vhoda, naprimer:
% make clean
ili
% make clear
V rezul'tate vypolneniya budut udaleny fajly A, B, C, D i E.
Vse stroki dejstvij v pravilah peredayutsya na vypolnenie
shell sleduyushchim obrazom:
sh -c stroka_dejstviya
i dolzhny normal'no vypolnyat'sya interpretatorom sh (kod vozv-
rata 0), inache (po poluchenii drugogo koda zaversheniya
komandnoj stroki) make prekratit vypolnenie programmy.
Sushchestvuet sposob obojti eto uslovie. Obratite vnimanie na
dejstvie v 6-m pravile: stroka dejstvij nachinaetsya s simvola
"-", chto oznachaet ne prekrashchat' rabotu pri neudachnom vypol-
nenii komandy rm.
V Make-programme mozhno ispol'zovat' makroperemennye.
Mehanizm makroopredelenij i podstanovok makroperemennyh v
Make-programme po smyslu analogichen mehanizmu podstanovok v
shell, hotya po sintaksisu neskol'ko otlichaetsya. Rassmotrim
privedennyj vyshe primer s ispol'zovaniem makroperemennyh.
Teper' Makefile budet vyglyadet' tak:
- 8 -
SRC1 = a b # makroopredeleniya
SRC2 = c d
SRC3 = e f
SRC4 = A B C D
E : D C
cat D C > E
D : A B
cat A B > D
A : $(SRC1) # A zavisit ot SRC1
cat $(SRC1) > A
B : $(SRC2) # B zavisit ot SRC2
cat $(SRC2) > B
C : $(SRC3) # C zavisit ot SRC3
cat $(SRC3) > C
clean clear:
-rm -f $(SRC4)
Pervye stroki Make-programmy - stroki s makroopredeleniyami,
gde kazhdoj peremennoj SRC prisvaivayutsya znacheniya. V pravilah
vypolnyaetsya operaciya podstanovki znacheniya makroperemennoj,
naprimer $(SRC1). Makroperemennye pozvolyayut manipulirovat'
spiskami imen fajlov pri minimal'nyh izmeneniyah v tekste
Make-programmy.
Interpretator make realizuet mehanizm obrabotki umolcha-
nij zavisimostej fajlov so standartnymi suffiksami imen.
Naprimer, fajl s suffiksom imeni .o mozhno poluchit' iz fajlov
s suffiksami imen .c (yazyk programmirovaniya Si) i .s (yazyk
assembler). Rassmotrim primer. Dopustim, imeyutsya fajly a.c,
b.c, c.c i d.s, obrazuyushchie programmu, kotoruyu nazovem pro-
gram. Fajly a.c, b.c i c.c soderzhat stroku
# include program.h
t.e. zavisyat ot fajla program.h. Make-programma dlya raboty s
etimi fajlami budet soderzhat' 3 stroki
program: a.o b.o c.o d.o
cc a.o b.o c.o d.o -o program
a.o b.o c.o: program.h
Po komande make budet sozdan fajl program. Pri pervom
vypolnenii poluchim na ekrane displeya:
- 9 -
cc -c a.c
cc -c b.c
cc -c c.c
as - -o d.o d.s
cc a.o b.o c.o d.o -o program
Obratite vnimanie na to, chto interpretator opredelil neobho-
dimye dejstviya nad ishodnymi fajlami s suffiksami imen .c i
.s, hotya imena etih fajlov v Make-programme ne ukazany, i
pravil'no osushchestvil sborku programmy. Teper', dopustim, my
vyzyvaem make na vypolnenie vtoroj raz posle redaktirovaniya
fajla program.h, pri etom poluchim:
cc -c a.c
cc -c b.c
cc -c c.c
cc a.o b.o c.o d.o -o program
Esli vypolnit' Make-programmu posle redaktirovaniya fajla
b.c, to poluchim:
cc -c b.c
cc a.o b.o c.o d.o -o program
Nakonec, esli, dopustim, neobhodimo poluchit' fajl c.o, to
mozhno vypolnit' komandu
make c.o
Mehanizm umolchanij i obrabotki suffiksov sproektirovan dlya
avtomatizacii programmirovaniya Make-programm; on sushchestvenno
sokrashchaet razmery programm i kolichestvo oshibok v nih.
3. Soglasheniya yazyka Make
Nizhe v kompaktnoj forme privodyatsya osnovnye sintaksi-
cheskie konstrukcii yazyka Make. V sleduyushchih paragrafah po
kazhdoj konstrukcii budut dany opisaniya i primery.
identifikator
posledovatel'nost' bukv, cifr i simvola "_", soderzhashchaya
shablony imen fajlov ([...], ?, *), simvoly / i "."
identifikator = znachenie
opredelenie makroperemennoj. V pravoj chasti mogut byt'
makropodstanovki, a takzhe vsya pravaya chast' mozhet byt'
pustoj strokoj.
$(identifikator)
${identifikator}
$simvol
- 10 -
podstanovka znacheniya makroperemennoj. Special'noe zna-
chenie simvola $ mozhno otmenit', ukazyvaya $$.
kommentarij
tekst, sleduyushchij za simvolom # i do konca stroki. Spe-
cial'noe znachenie simvola # otmenyaetsya, esli on ukazan
v kavychkah.
obratnaya naklonnaya cherta
simvol prodolzheniya stroki. Special'noe znachenie sim-
vola \ otmenyaetsya, esli on ukazan dvazhdy.
pustaya stroka, probely
probely sluzhat razdelitelyami slov v komandnoj stroke,
lishnie probely i tabulyacii ignoriruyutsya. Pustaya stroka
vsyudu ignoriruetsya.
spisok_zavisimostej
pravilo v obshchem vide. Spisok_dejstvij mozhet byt' pus-
tym.
.pervyj_suffiks.vtoroj_suffiks:
pravilo s ukazaniem zavisimostej suffiksov. Esli v
Make-programme soderzhitsya hotya by odno pravilo s suf-
fiksami, otlichnymi ot predopredelennyh, v nee neobho-
dimo vklyuchit' pravilo:
.SUFFIXES: spisok_suffiksov
spisok_celej :[:] spisok_podcelej
spisok_zavisimostej. Spisok_podcelej mozhet byt' pus-
tym. Pravila s odnim i dvumya simvolami dvoetochiya v
spiske_zavisimostej otlichayutsya poryadkom vypolneniya
spiska_podcelej i spiska_dejstvij.
imya_celi [imya_celi]
spisok_celej. Imya_celi - identifikator. Mozhno ispol'-
zovat' simvol / i tochku. Imya_celi mozhet byt' imenem
fajla ili kataloga, togda vklyuchaetsya vypolnenie meha-
nizma rekonstrukcii. Imya_celi mozhet ne byt' imenem
fajla, togda mehanizm rekonstrukcii ne vklyuchaetsya, a
imya_celi yavlyaetsya metkoj (imenem pravila, vhoda v
Make-programmu).
imya_podceli [imya_podceli] [#kommentarij]
spisok_podcelej. Imya_podceli - identifikator. Mozhno
- 11 -
ispol'zovat' shablony imen fajlov "*", "?", [...], sim-
vol / i tochku. Imya_podceli mozhet byt' imenem fajla,
dlya kotorogo zapisano ili ne zapisano pravilo v Make-
programme, v etih sluchayah vklyuchaetsya mehanizm rekonst-
rukcii. Imya_podceli mozhet ne byt' imenem fajla, v etom
sluchae mehanizm rekonstrukcii ne vklyuchaetsya, a imya_celi
yavlyaetsya metkoj (imenem pravila, vhoda v Make-
programmu).
stroka_dejstviya [#kommentarij]
...............
stroka_dejstviya [#kommentarij]
spisok_dejstvij. Lyubye komandnye stroki DEMOS i uprav-
lyayushchie konstrukcii Shell.
'tabulyaciya'komandnaya_stroka_shell
stroka_dejstviya.
Stroka_dejstviya mozhet byt' ukazana v stroke zavisimos-
tej cherez simvol ";". Stroku_dejstviya mozhno ukazyvat' v
sleduyushchih formatah:
'tabulyaciya'komandnaya__stroka__shell 1
'tabulyaciya'@komandnaya_stroka__shell 2
'tabulyaciya'-komandnaya_stroka__shell 3
'tabulyaciya'-@komandnaya_stroka_shell 4
V pervom formate komandnaya stroka vyvoditsya na pechat';
esli kod vozvrata posle ee vypolneniya ne 0, make prek-
rashchaet vypolnenie programmy po oshibke. Vo vtorom for-
mate komandnaya stroka ne vyvoditsya na pechat'; esli kod
vozvrata posle ee vypolneniya ne 0, make prekrashchaet
vypolnenie programmy po oshibke. V tret'em formate
komandnaya stroka vyvoditsya na pechat'; esli kod vozvrata
posle ee vypolneniya ne 0, make ignoriruet oshibku i
vypolnenie programmy prodolzhaetsya. V chetvertom formate
komandnaya stroka ne vyvoditsya na pechat'; esli kod vozv-
rata posle ee vypolneniya ne 0, make ignoriruet oshibku
i vypolnenie programmy prodolzhaetsya. Prostaya komandnaya
stroka (odna komanda DEMOS s argumentami) vypolnyaetsya
bez porozhdeniya obolochki. Drugie komandnye stroki
vypolnyayutsya sh sleduyushchim obrazom: sh -c
komandnaya_stroka_shell
Dlya sokrashcheniya oboznachenij predusmotreny makroperemen-
nye s predopredelennymi imenami. V pravile bez suffiksov
- 12 -
stroka_dejstviya mozhet vklyuchat' sleduyushchie predopredelennye
makroperemennye:
@ imya celi;
? imena fajlov iz spiska podcelej, kotorye MOLOZHE
fajla_celi. |ti fajly uchastvuyut v rekonstrukcii celi.
V pravile s suffiksami stroka_dejstviya mozhet vklyuchat'
sleduyushchie predopredelennye makroperemennye:
* osnova_imeni_celi;
@ osnova_imeni_celi.vtoroj_suffiks;
<< osnova_imeni_celi.pervyj_suffiks.
4. Ispol'zovanie makroperemennyh
Pri vypolnenii Make-programmy znacheniya makroperemennyh
ustanavlivayutsya v strokah makroopredelenij i/ili v komandnoj
stroke pri zapuske make na ispolnenie. Krome togo, sushchest-
vuyut makroperemennye s predopredelennymi imenami, znacheniya
kotoryh ustanavlivayutsya pri vypolnenii Make-programmy. K nim
otnosyatsya: makroperemennaya @, ee znachenie - imya_celi; makro-
peremennaya ?, ee znachenie - imena teh fajlov_podcelej, koto-
rye MOLOZHE fajla_celi.
Predopredelennye makroperemennye "@" i "?" ispol'zuyutsya
tol'ko v spiske dejstvij pravila i v kazhdom pravile imeyut
svoi znacheniya. Opredelyat' znacheniya makroperemennyh mozhno v
lyubom meste Make-programmy, no ne vnutri pravila. Interpre-
tator make sostavlyaet spisok imen makroperemennyh i prisvai-
vaet im znacheniya v processe chteniya Make-programmy. Esli zna-
chenie makroperemennoj pereopredelyaetsya, to ej prisvaivaetsya
novoe znachenie; esli ispol'zuyutsya makroopredeleniya s vlozhen-
nymi makropodstanovkami, to znacheniya ustanavlivayutsya s uche-
tom vseh prisvoenij v Make-programme. Esli znachenie makro-
peremennoj zadaetsya v komandnoj stroke pri zapuske Make-
programmy na ispolnenie, to vse opredeleniya etoj makropere-
mennoj v Make-programme ignoriruyutsya i ispol'zuetsya znache-
nie, vzyatoe iz komandnoj stroki. Sostoyanie oshibki porozhda-
etsya, esli ispol'zuetsya rekursiya pri prisvoenii znacheniya
makroperemennym. Naprimer,
A = $B
B = $A
privedet k avarijnomu zaversheniyu vypolneniya Make-programmy.
V makroopredeleniyah mozhno ispol'zovat' metasimvoly shab-
lonov imen fajlov shell. Dopustim, rabochij katalog imeet
- 13 -
vid:
-rw-r--r-- 1 user 15658 Avg 6 16:03 1.m
-rw-r--r-- 1 user 2158 Avg 8 16:38 2.m
-rw-r--r-- 1 user 5185 Avg 9 17:38 3.m
-rw-r--r-- 1 user 4068 Iyul 28 20:56 6.m
-rw-r--r-- 1 user 100 Avg 9 14:30 f2
-rw-r--r-- 1 user 66 Avg 9 17:42 f3
Primer Make-programmy v Makefile :
A = *
B = f?
C = [0-9].*
aaa :
echo $A
echo $B
echo $C
Posle vypolneniya komandy make -s poluchim na ekrane displeya:
1.m 2.m 3.m 6.m f2 f3
f2 f3
1.m 2.m 3.m 6.m
V Make-programme chasto byvaet neobhodimo manipulirovat' ime-
nami katalogov i fajlov. Mehanizm makropodstanovok predla-
gaet udobnye sredstva dlya etogo. Primer:
A = *
B = [pg]*
C = f?r*
DIR1 = .
DIR2 = /etc
DIR3 = /usr/bin
aaa :
echo ${DIR1}/$A
echo ${DIR2}/$B
echo ${DIR3}/$C
Posle vypolneniya poluchim:
./1.m ./2.m ./3.m ./6.m ./f2 ./f3
/etc/getty /etc/group /etc/passwd
/usr/bin/fgrep
Rassmotrim primer, v kotorom demonstriruyutsya vsevozmozh-
nye sposoby ispol'zovaniya makroperemennyh. Dopustim, imeetsya
Makefile
- 14 -
BIBLIOTEKA = POLKA ${DRUGOE}
DRUGOE = Dokumenty
SHkaf = POLKA
papka = spravki, kopii.
SPRAVOCHNIKI =
ZHURNALY =
Slovari = tolkovye, inostrannyh yazykov.
TEHNICHESKAYA = $(SPRAVOCHNIKI) $(Slovari)
HUDOZHESTVENNAYA = proza, poeziya, dramaturgiya.
t = Spravka s mesta zhitel'stva.
x = Kopiya svidetel'stva o rozhdenii.
fajly = d e
biblioteka : ${BIBLIOTEKA}
echo 'Dejstviya pravila' $@
echo '$$? - spisok podcelej :' $?
echo '$$@ - imya celi :' $@
echo 'Tehnicheskaya : ' $(TEHNICHESKAYA)
echo 'Hud. : ' $(HUDOZHESTVENNAYA)
echo ' '
${SHkaf} : b c
echo 'Dejstviya pravila' $@
echo '$$? - spisok podcelej :' $?
echo '$$@ - imya celi :' $@
echo ' '
${DRUGOE}: ${fajly}
echo 'Dejstviya pravila' $@
echo '$$? - spisok podcelej :' $?
echo '$$@ - imya celi :' $@
echo 'Papka : ' ${papka}
echo $t
echo $x
echo ' '
b:
c:
d:
e:
Sleduet obratit' vnimanie na to, chto $bukva ispol'zuetsya dlya
podstanovki znacheniya makroperemennoj, imya kotoroj sostoit iz
odnoj bukvy, a $(identifikator) i ${identifikator} ravno-
cenny. Pravila b, c, d i e vklyucheny isklyuchitel'no dlya
demonstracii znachenij makroperemennoj "?". Teper', esli
vypolnit' komandu make -s, poluchim na ekrane displeya:
- 15 -
Dejstviya pravila POLKA
$? - spisok podcelej : b c
$@ - imya celi : POLKA
Dejstviya pravila Dokumenty
$? - spisok podcelej : d e
$@ - imya celi : Dokumenty
Papka : spravki, kopii.
Spravka s mesta zhitel'stva.
Kopiya svidetel'stva o rozhdenii.
Dejstviya pravila biblioteka
$? - spisok podcelej : POLKA Dokumenty
$@ - imya celi : biblioteka
Tehnicheskaya :tolkovye, inostrannyh yazykov.
Hud. : proza, poeziya, dramaturgiya.
V komandnoj stroke mozhno prisvoit' znachenie makroperemennoj.
Posle komandy
make -s Slovari = anglijskij, nemeckij.
poluchim na ekrane displeya:
Dejstviya pravila POLKA
$? - spisok podcelej : b c
$@ - imya celi : POLKA
Dejstviya pravila Dokumenty
$? - spisok podcelej : d e
$@ - imya celi : Dokumenty
Papka : spravki, kopii.
Spravka s mesta zhitel'stva.
Kopiya svidetel'stva o rozhdenii.
Dejstviya pravila biblioteka
$? - spisok podcelej : POLKA Dokumenty
$@ - imya celi : biblioteka
Tehnicheskaya : anglijskij, nemeckij.
Hud. : proza, poeziya, dramaturgiya.
5. Vypolnenie pravil v Make-programme
Sushchestvuet neskol'ko raznovidnostej pravil:
s odnim i dvumya dvoetochiyami;
s odinakovymi imenami celej;
ne soderzhashchie spiska dejstvij;
- 16 -
ne soderzhashchie spiska podcelej i/ili spiska dejstvij;
pravila, predopredelennye v interpretatore make, koto-
rye programmist mozhet vklyuchat' v Make-programmu.
Krome togo, imeyutsya nekotorye razlichiya v vypolnenii
Make-programmy, kogda imya celi ne yavlyaetsya fajlom. V obshchem
sluchae pravilo mozhet soderzhat' odno ili dva dvoetochiya v
kachestve razdelitelej spiskov celej i podcelej. Poryadok
vypolneniya v etih pravilah odinakov, esli v nih ukazany raz-
lichnye imena celej.
Pravilo vypolnyaetsya sleduyushchim obrazom: snachala vypolnya-
yutsya pravila s imenami celej iz spiska podcelej, zatem spi-
sok dejstvij. Esli v spiske podcelej ukazano imya fajla, dlya
kotorogo pravilo ne opredeleno, to vremya sozdaniya (modifika-
cii) fajla ispol'zuetsya dlya opredeleniya neobhodimosti
rekonstrukcii celi. Esli imya podceli ne yavlyaetsya fajlom,
ono dolzhno byt' metkoj pravila, inache porozhdaetsya sostoyanie
oshibki. Dopustim, v Make-programme zapisano pravilo
monitor.c : monitor.h
|to oznachaet, chto fajl monitor.c zavisit ot fajla monitor.h.
Esli monitor.h dejstvitel'no imeetsya v rabochem kataloge, to
lyubye izmeneniya v nem privedut k rekonstrukcii fajla
monitor.o, esli fajl monitor.h otstutstvuet, make prekrashchaet
vypolnyat' programmu po oshibke. V Make-programme mogut
vstrechat'sya sluchai, kogda neobhodimo dlya odnoj celi zapisat'
neskol'ko pravil, togda sushchestvenno vazhno, skol'ko dvoetochij
ukazano v pravile. Nizhe privedeny shemy, v kotoryh ciframi
pokazan poryadok vypolneniya etih pravil.
Poryadok vypolneniya neskol'kih pravil s odinakovym
imenem_celi i odnim dvoetochiem: snachala vypolnyayutsya pravila,
svyazannye so spiskami podcelej, zatem spisok_dejstvij odnogo
iz pravil. Spisok dejstvij razreshaetsya ukazyvat' tol'ko v
odnom iz takih pravil:
imya_celi_A : spisok_podcelej <---| 1 |
imya_celi_A : spisok_podcelej <---| 2 |
spisok_dejstvij <---| 4 |
imya_celi_A : spisok_podcelej <---| 3 |
Poryadok vypolneniya neskol'kih pravil s odinakovym
imenem_celi i dvumya dvoetochiyami. Spisok dejstvij mozhet byt'
v kazhdom pravile:
- 17 -
imya_celi_A :: spisok_podcelej <---| 1 |
spisok_dejstvij <---| 2 |
imya_celi_A :: spisok_podcelej <---| 3 |
spisok_dejstvij <---| 4 |
imya_celi_A :: spisok_podcelej <---| 5 |
spisok_dejstvij <---| 6 |
6. Rezhimy vypolneniya Make-programmy
Interpretator make predostavlyaet ryad vozmozhnostej dlya
upravleniya vypolneniem Make-programmy. Dlya etoj celi ispol'-
zuyutsya sleduyushchie direktivy:
.SILENT - ne pechatat' stroki dejstvij;
.IGNORE - ignorirovat' oshibki dejstvij;
.DEFAULT - vypolnit' al'ternativnoe dejstvie;
.PRECIOUS - udalit' nedostroennyj fajl.
Direktivy .SILENT i .IGNORE mozhno ukazyvat' kak v Make-
programme, tak i v komandnoj stroke klyuchami -s i -i, DEFAULT
i PRECIOUS tol'ko v Make-programme. Dopustim imeetsya sledu-
yushchaya Make-programma:
aa: bb
echo Dejstviya pravila $@
bb:
echo Dejstviya pravila $@
ppp # Nesushchestvuyushchaya komanda
sort e # Net fajla e
Posle vypolneniya poluchim soobshcheniya:
echo Dejstviya pravila bb
Dejstviya pravila bb
ppp # Nesushchestvuyushchaya komanda
sh: ppp: ne najden
*** Kod oshibki 1
Konec.
Interpretator make prekratil rabotu po pervoj oshibke. Krome
togo, na ekran displeya vyvodyatsya stroki dejstvij. Otmenit'
vyvod strok dejstvij mozhno sleduyushchimi sposobami:
ukazat' klyuch -s v komandnoj stroke pri zapuske make;
ukazat' v Make-programme direktivu SILENT;
- 18 -
nachinat' kazhduyu stroku dejstvij simvolom @.
V pervyh dvuh sluchayah rezul'tat odinakov - ne budut
vyvodit'sya stroki dejstvij. V tret'em sluchae ne budut vyvo-
dit'sya stroki dejstvij vida
'tabulyaciya'@stroka_dejstvij
Primer ispol'zovaniya direktivy SILENT.
aa: bb
echo Dejstviya pravila $@
bb:
echo Dejstviya pravila $@
ppp # Nesushchestvuyushchaya komanda
sort e # Net fajla e
.SILENT:
Posle vypolneniya programmy poluchim:
Dejstviya pravila bb
sh: ppp: ne najden
*** Kod oshibki 1
Konec.
Po lyuboj oshibke make prekratit vypolnenie programmy. Sushchest-
vuyut sleduyushchie sposoby ignorirovaniya oshibok (Make-programma
prodolzhaet vypolnyat'sya):
ukazat' klyuch -i pri zapuske make na vypolnenie;
ukazat' v Make-programme direktivu IGNORE;
posle simvola tabulyaciya ukazat' simvol "-".
V pervom i vtorom sluchayah budut proignorirovany vse
oshibki pri vypolnenii strok dejstvij, v tret'em ignoriruyutsya
oshibki v teh strokah dejstviya, kotorye ukazany sleduyushchim
obrazom:
'tabulyaciya'-stroka_dejstvij
Primer ispol'zovaniya direktiv SILENT i IGNORE. Obrabotka
oshibok pri vypolnenii dejstvij v pravilah
- 19 -
aa: bb
echo Dejstviya pravila $@
bb:
echo Dejstviya pravila $@
ppp # Nesushchestvuyushchaya komanda
sort e # Net fajla e
.SILENT:
.IGNORE:
Posle vypolneniya programmy poluchim:
Dejstviya pravila bb
sh: ppp: ne najden
*** Kod oshibki 1 (ignorirovan)
sort: ne mogu otkryt' e
*** Kod oshibki 1 (ignorirovan)
Dejstviya pravila aa
Pravilo DEFAULT ispol'zuetsya dlya ukazaniya al'ternativnyh
dejstvij po otsutstvuyushchemu v dannyj moment fajlu. Pravilo
DEFAULT pozvolyaet zapisat' spisok dejstvij, kotorye budut
vypolnyat'sya dlya vseh otsutstvuyushchih fajlov, poetomu trebuetsya
opredelennaya ostorozhnost', naprimer:
- 20 -
aa: bb
echo Dejstviya pravila $@
bb: a b c d
echo Dejstviya pravila $@
ppp # Nesushchestvuyushchaya komanda
sort e # Net fajla e
.SILENT:
.IGNORE:
.DEFAULT:
echo Dejstviya pravila .DEFAULT dlya $@
Posle vypolneniya programmy poluchim:
Dejstviya pravila .DEFAULT dlya a
Dejstviya pravila .DEFAULT dlya b
Dejstviya pravila .DEFAULT dlya c
Dejstviya pravila .DEFAULT dlya d
Dejstviya pravila bb
sh: ppp: ne najden
*** Kod oshibki 1 (ignorirovan)
sort: ne mogu otkryt' e
*** Kod oshibki 1 (ignorirovan)
Dejstviya pravila aa
CHasto byvaet neobhodimo prekratit' vypolnenie Make-
programmy. |to ne privedet k fatal'nym posledstviyam, tak
kak sohranyaetsya struktura dinamicheskih (zavisyashchih ot vre-
meni) svyazej fajlov. Odnako, esli sozdanie nekotorogo fajla
ne zavershilos' i on tem ne menee obrazovalsya, ego zhelatel'no
udalit' pered povtornym zapuskom interpretatora. |to mozhno
sdelat' avtomaticheski, ispol'zuya direktivu PRECIOUS, napri-
mer:
aaa: file
sort file > $@
.PRECIOUS:
Esli v moment sinhronnogo ispolneniya Make-programmy vvesti
signal CTRL/C, fajl $@ budet udalen.
7. Pravila s suffiksami
V Make-programme mozhno zapisat' odno pravilo dlya obra-
botki razlichnyh fajlov. V etom sluchae eto odno pravilo mno-
gokratno vypolnyaetsya dlya razlichnyh fajlov, chto sushchestvenno
sokrashchaet razmery Make-programm, uproshchaet ih razrabotku. Vse
poleznye svojstva make pri etom sohranyayutsya. Mehanizm
- 21 -
vypolneniya takih pravil stroitsya na suffiksah imen fajlov.
Dopustim, iz fajla s imenem osnova.suffiks_1 neobhodimo
poluchit' fajl s imenem osnova.suffiks_2, togda obychnoe pra-
vilo budet vyglyadet' tak:
osnova.suffiks_2 : osnova.suffiks_1
spisok dejstvij
Ponyatno, chto dlya gruppy fajlov, osnovy imen kotoryh raz-
lichny, a pervyj i vtoroj suffiksy imen odinakovy, zhelatel'no
bylo by zapisat' odno pravilo obrabotki. Naprimer, fajly *.c
obychno preobrazuyutsya v fajly *.o odnim spiskom dejstvij, i,
sledovatel'no, eti pravila zhelatel'no zapisyvat' v vide
odnogo pravila. Interpretator make predlagaet etu vozmozh-
nost' v pravilah vida
.suffiks_1.suffiks_2:
spisok_dejstvij
.SUFFIXES: .suffiks_1 .suffiks_2
Esli v Make-programme zapisany eti pravila, interpretator,
poluchiv v kachestve argumenta imya fajla s imenem
osnova.suffiks_1, vypolnit ukazannoe vyshe pravilo, i my
poluchim rezul'tat - fajl s imenem osnova.suffiks_2. Porya-
dok vypolneniya pravila s suffiksami takoj zhe, kak i v obych-
nom pravile. Predopredelennoe pravilo SUFFIXES ispol'zuetsya
dlya ukazaniya spiska suffiksov, kotoryj mozhet soderzhat' bolee
dvuh suffiksov. Poryadok suffiksov v spiske roli ne igraet.
Estestvenno, dlya kazhdoj pary suffiksov v Make-programme
dolzhny byt' zapisany sootvetstvuyushchie pravila. V pravilah s
suffiksami ispol'zuyutsya predopredelennye makroperemennye:
@ - imya_rezul'tata (osnova.suffiks_2);
<< - imya_argumenta (osnova.suffiks_1);
* - osnova.
Rassmotrim primer. Dopustim, imeyutsya ishodnye fajly *.c
i *.k. Neobhodimo iz nih poluchit' fajly *.t, a iz nih -
fajl result. Dopustim takzhe, chto fajly *.c zavisyat ot fajla
file.h (soderzhat stroku #include file.h). Graf preobrazova-
nij fajlov v etom sluchae vyglyadit tak:
- 22 -
result
|
.t
|
--------
| |
.c .k
Programma, realizuyushchaya etot graf, mozhet byt' sleduyushchej:
- 23 -
result: d.t a.t b.t c.t
echo 'Dejstviya pravila' $@
echo ' Znachenie $$@ - ' $@
echo ' Znachenie $$? - ' $?
touch $@
.k.t :
echo 'Dejstviya pravila .k.t :'
echo ' Znachenie $$* - ' $*
echo ' Znachenie $$@ - ' $@
echo ' Znachenie $$? - ' $?
echo ' Znachenie $$< - ' $<
touch $@
.c.t :
echo 'Dejstviya pravila .c.t :'
echo ' Znachenie $$* - ' $*
echo ' Znachenie $$@ - ' $@
echo ' Znachenie $$? - ' $?
echo ' Znachenie $$< - ' $<
touch $@
a.c b.c c.c : file.h
.SUFFIXES: .t .c .k
Posle vypolneniya komandy make -rs poluchim:
Dejstviya pravila .k.t :
Znachenie $* - d
Znachenie $@ - d.t
Znachenie $? - d.k
Znachenie $< - d.k
Dejstviya pravila .c.t :
Znachenie $* - a
Znachenie $@ - a.t
Znachenie $? - file.h a.c
Znachenie $< - a.c
Dejstviya pravila .c.t :
Znachenie $* - b
Znachenie $@ - b.t
Znachenie $? - file.h b.c
Znachenie $< - b.c
Dejstviya pravila .c.t :
Znachenie $* - c
Znachenie $@ - c.t
Znachenie $? - file.h c.c
Znachenie $< - c.c
Dejstviya pravila result
- 24 -
Znachenie $@ - result
Znachenie $? - d.t a.t b.t c.t
Zametim, chto pravilo .k.t vypolnyaetsya tol'ko odin raz, pra-
vilo .c.t - tri raza, kak i trebovalos' dlya spiska ishodnyh
fajlov, ukazannyh v spiske podcelej pravila result. Smysl
makroperemennoj "?" v pravile s suffiksom tot zhe, chto i v
obychnom fajle - spisok podcelej. Makroperemennaya "@" v obych-
nom pravile - imya celi, a zdes' imya rezul'tata - fajl s ime-
nem osnova.suffiks_2.
Interpretator make soderzhit spisok pravil dlya standart-
nyh suffiksov imen fajlov i opredeleniya samih suffiksov.
|tot spisok podklyuchaetsya k Make-programme pol'zovatelya, esli
make zapuskaetsya na vypolnenie bez klyucha -r. Programmist
polnost'yu osvobozhdaetsya ot ukazaniya pravil preobrazovanij
fajlov so standartnymi suffiksami imen. Obrabatyvayutsya
fajly, imena kotoryh vklyuchayut sleduyushchie suffiksy:
.out - fajl v zagruzochnom formate;
.o - ob容ktnyj fajl;
.c - fajl na yazyke Si;
.f - fajl na yazyke Fortran;
.p - fajl na yazyke Paskal';
.s - fajl na assemblere;
.l - fajl na lex;
.y - fajl na yacc;
Krome togo, v Make-programmu vklyuchayutsya predopredelennye
makroperemennye:
LOADLIBES = # imena bibliotek
AS = as - # imya assemblera
CC = cc # imya Si-kompilyatora
CFLAGS = # klyuchi Si-kompilyatora
PC = pc # imya Paskal'-kompilyatora
PFLAGS = # klyuchi Paskal'-kompilyatora
FF = f77 # imya f77-kompilyatora
FFLAGS = # klyuchi f77-kompilyatora
LEX = lex # imya generatora
LFLAGS = # klyuchi lex
YACC = yacc # imya generatora
YFLAGS = # klyuchi yacc
Znacheniya predopredelennyh makroperemennyh mozhno menyat' v
Make-programme, naprimer, esli vvesti stroku CFLAGS = -O,
to predopredelennaya makroperemennaya CFLAGS budet imet' novoe
znachenie v Make-programme. Nizhe privodyatsya graf zavisimos-
tej celej i spisok pravil Make-programmy, realizuyushchej obra-
botku fajlov po suffiksam imen.
- 25 -
.c .f .p .s .l .y
| | | | | |
|-------------------------
|
|
---> .out <--- .o ---
|
|
--------------------------
| | | | | |
.p .f .c .s .l .y
|
---
| |
.l .y
- 26 -
.l.out:
$(LEX) $<
$(CC) $(CFLAGS) lex.yy.c $(LOADLIBES) -ll -o $@
rm lex.yy.c
.y.out:
$(YACC) $(YFLAGS) $<
$(CC) $(CFLAGS) y.tab.c $(LOADLIBES) -ly -o $@
rm y.tab.c
.f.out:
$(FF) $(FFLAGS) $< $(LOADLIBES) -o $@
-rm $*.o
.o.out:
$(CC) $(CFLAGS) $< $(LOADLIBES) -o $@
.c.out:
$(CC) $(CFLAGS) $< $(LOADLIBES) -o $@
.p.out:
$(PC) $(PFLAGS) $< $(LOADLIBES) -o $@
.s.out:
$(CC) $(CFLAGS) $< $(LOADLIBES) -o $@
.l.c:
$(LEX) $<
mv lex.yy.c $@
.y.c:
$(YACC) $(YFLAGS) $<
mv y.tab.c $@
.l.o:
$(LEX) $(LFLAGS) $<
$(CC) $(CFLAGS) -c lex.yy.c
rm lex.yy.c; mv lex.yy.o $@
.y.o:
$(YACC) $(YFLAGS) $<
$(CC) $(CFLAGS) -c y.tab.c
rm y.tab.c; mv y.tab.o $@
.s.o:
$(AS) -o $@ $<
.f.o:
$(FF) $(FFLAGS) -c $<
.c.o:
$(CC) $(CFLAGS) -c $<
- 27 -
.p.o:
$(PC) $(PFLAGS) -c $<
.SUFFIXES: .out .o .c .f .p .y .l .s
Dopustim, imeyutsya fajly f[1-6].c s ishodnymi tekstami prog-
rammy result. Fajly f[1-3].c soderzhat stroki
# include file1.h
# include file2.h
i fajly f[4-6].c soderzhat stroku
# include file3.h
Sleduyushchaya programma upravlyaet sozdaniem programmy result:
CFLAGS = -O
LDFLAGS = -s -n -o
OBJS = f1.o f2.o f3.o f4.o f5.o f6.o
result: ${OBJS}
${CC} ${OBJS} ${LDFLAGS} $@
f1.o f2.o f3.o : file1.h file2.h
f4.o f5.o f6.o : file3.h
Tak vyglyadit protokol vypolneniya:
cc -O -c f1.c
cc -O -c f2.c
cc -O -c f3.c
cc -O -c f4.c
cc -O -c f5.c
cc -O -c f6.c
cc f1.o f2.o f3.o f4.o f5.o f6.o -s -n -o result
Teper' izmenim vremya modifikacii fajla komandoj
touch file3.h
i snova vypolnim programmu, v rezul'tate poluchim:
cc -O -c f4.c
cc -O -c f5.c
cc -O -c f6.c
cc f1.o f2.o f3.o f4.o f5.o f6.o -s -n -o result
Teper' izmenim vremya modifikacii fajla komandoj touch f3.c i
snova vypolnim programmu
- 28 -
cc -O -c f3.c
cc f1.o f2.o f3.o f4.o f5.o f6.o -s -n -o result
Programmist mozhet otklyuchit' standartnye opredeleniya i spisok
pravil s suffiksami (klyuch -r), mozhet ih ispol'zovat' naryadu
s temi, chto opredeleny v Make-programme. Dopustim, k imeyu-
shchimsya fajlam predydushchego primera dobavlyayutsya fajly a1.t,
a2.t i a3.t, ih neobhodimo obrabotat' programmoj sed, vyho-
dom kotoroj budut fajly a1.c a2.c a3.c. Teper' Make-
programma vyglyadit tak:
CFLAGS = -O
LDFLAGS = -o
OBJS = a1.o a2.o a3.o f1.o f2.o f3.o f4.o f5.o f6.o
result: ${OBJS}
${CC} ${OBJS} ${LDFLAGS} $@
f1.o f2.o f3.o : file1.h file2.h
f4.o f5.o f6.o : file3.h
a1.c: a1.t
a2.c: a2.t
a3.c: a3.t
.t.c:
sed s/aaa/bbb/ < $< > $*.c
.SUFFIXES: .t
Protokol vypolneniya programmy:
sed s/aaa/bbb/ < a1.t > a1.c
cc -O -c a1.c
sed s/aaa/bbb/ < a2.t > a2.c
cc -O -c a2.c
sed s/aaa/bbb/ < a3.t > a3.c
cc -O -c a3.c
cc -O -c f1.c
cc -O -c f2.c
cc -O -c f3.c
cc -O -c f4.c
cc -O -c f5.c
cc -O -c f6.c
cc a1.o a2.o a3.o f1.o f2.o f3.o f4.o f5.o f6.o -o result
Make dopuskaet obrabotku suffiksov tol'ko odnogo urovnya vlo-
zhennosti. V pravile SUFFIXES ukazan tol'ko suffiks t, suf-
fiks c opredelen v podklyuchaemom spiske suffiksov.
- 29 -
8. Upravlenie arhivom v Make-programme
V DEMOS sushchestvuyut dva tipa arhivov: arhiv tekstovyh
fajlov i arhiv ob容ktnyh fajlov (imeyushchij strukturu biblio-
teki ob容ktnyh modulej). Sozdannyj arhiv yavlyaetsya odnim
fajlom, a fajly, iz kotoryh on sobran, obrazuyut ego chasti.
Upravlenie arhivom vklyuchaet dve zadachi: sozdanie
fajla_arhiva opredelennoj struktury i ego modifikaciya
(dobavlenie, udalenie i zamena chastej, izmenenie struktury,
dekompoziciya arhiva na fajly, iz kotoryh on byl obrazovan).
Dlya resheniya takih zadach Make-programma dolzhna obespechivat'
rabotu s celyami dvuh tipov: fajl_arhiv i fajl dlya vklyucheniya
v arhiv. Pri etom ocenivaetsya vremya poslednej modifikacii
vklyuchaemogo v arhiv fajla (a ne vremya sozdaniya arhiva ili
zapisi fajla_chasti v arhiv). Imya fajla_arhiva mozhet ukazy-
vat'sya v spiske zavisimostej pravil kak obychnaya cel':
imya_arhivnogo_fajla(imya_fajla_dlya_vklyucheniya_v_arhiv)
Krome imen fajlov, pri rabote s bibliotekoj ob容ktnyh modu-
lej mozhno ukazyvat' imena funkcij
imya_fajla_biblioteki((_vneshnee_imya_bibl_funkcii))
Rassmotrim fragment Make-programmy dlya postroeniya biblioteki
s imenem libP.a:
L = libP.a
CFLAGS = -O
$(L)::
ar r $(L)
$(L):: $(L)(Ia.o) $(L)(La.o) $(L)(Da.o)
# Iabs, Labs, Dabs - imena funkcij
$(L)(Iabs.o): lib/Ia.c
$(CC) $(CFLAGS) lib/Ia.c
ar r $(L) Ia.o
-rm -f Ia.o
$(L)(Labs.o): lib/La.c
$(CC) $(CFLAGS) lib/La.c
ar r $(L) La.o
-rm -f La.o
$(L)(Dabs.o): lib/Da.c
$(CC) $(CFLAGS) lib/Da.c
ar r $(L) Da.o
-rm -f Da.o
U takogo sposoba raboty s bibliotekoj est' nedostatok -
- 30 -
Make-programma dolzhna soderzhat' strukturu biblioteki. Spisok
imen bibliotechnyh modulej vo vtorom pravile "$(L)::" soot-
vetstvuet poryadku ih razmeshcheniya v biblioteke. Eshche odno neu-
dobstvo zaklyuchaetsya v tom, chto esli by biblioteka soderzhala
bol'shoe kolichestvo modulej, naprimer 100, to potrebovalas'
by zapis' 100 pravil v programme. Dlya postroeniya odnopro-
hodnyh bibliotek takoj sposob ukazaniya struktury imeet
sushchestvennyj nedostatok, tak kak izmenenie ishodnogo teksta
ob容ktnogo modulya mozhet privesti k neobhodimosti izmenit'
strukturu biblioteki, a eto, v svoyu ochered', privedet k
neobhodimosti rekonstruirovat' Make-programmu. Krome togo,
pri postroenii biblioteki neobhodimo, chtoby vse ob容ktnye
fajly byli v rabochem kataloge.
Rassmotrim Make-programmu, v kotoroj eti nedostatki
ustraneny. Voz'mem v kachestve primera fajly s ishodnymi
tekstami modulej ob容ktnoj biblioteki mylib
m1.c m2.c m3.c m4.s m5.c m6.c m7.s
Dopustim, struktura odnoprohodnoj biblioteki s uchetom vyzo-
vov modulej dolzhna byt' takoj:
m4.o m2.o m1.o m5.o m6.o m7.o m3.o
Tekst Make-programmy:
- 31 -
CFLAGS = -O
SRC = m1.c m2.c m3.c m4.s m5.c m6.c m7.s
LIB = mylib
${LIB}: ${SRC}
echo $? | sed s/\\.[cs]/\\.o/g > list
make `cat list`
ar cr $@ `cat list`
lorder $@ | tsort > list
-@if cmp list topology ; \
then \
rm -f `cat list` list;\
else \
ar x ${LIB}; rm $@;\
mv list topology;\
ar cr $@ `cat topology`;\
rm -f `cat topology`;\
echo Struktura $@ izmenilas'.;\
fi
ranlib ${LIB}
echo Biblioteka $@ gotova.
m1.c : x.h
touch m1.c
m2.c : x.h y.h
touch m2.c
m3.c : x.h
touch m3.c
m5.c : y.h
touch m5.c
m6.c : x.h
touch m6.c
Rassmotrim prostye sluchai rekonstrukcii uzhe sushchestvuyushchej
biblioteki. Dopustim, izmenilsya ishodnyj tekst odnogo iz
modulej. V etom sluchae dostatochno na ego mesto v biblioteke
vklyuchit' novuyu versiyu ob容ktnogo fajla etogo modulya. CHtoby
ne kompilirovat' drugie fajly biblioteki, mozhno ispol'zovat'
predopredelennuyu makroperemennuyu "?" - spisok fajlov, koto-
rye stali MOLOZHE fajla mylib. Kak uzhe govorilos' vyshe, v
kataloge net ob容ktnyh fajlov. Sledovatel'no, v Make-
programmu neobhodimo vklyuchit' predopredelennye sredstva
obrabotki suffiksov, a v kachestve argumenta formirovat' imya
celi s suffiksom o, togda make avtomaticheski postroit novyj
ob容ktnyj fajl etogo modulya. V primere fajl list ispol'zu-
etsya v kachestve vremennogo rabochego fajla. Stroka vida
echo $? | sed s/\\.[cs]/\\.o/g > list
- 32 -
zapisyvaet v fajl list spisok celej s suffiksom o. Redaktor
sed ispol'zuetsya v etoj komandnoj stroke dlya zameny suffik-
sov c i s na o. Takim obrazom, fajl list soderzhit imena
fajlov-celej, kotorye neobhodimo sozdat' i na etoj osnove
rekonstruirovat' biblioteku. |to mozhno sdelat', naprimer,
tak:
make `cat list`
V rezul'tate vypolneniya budut sozdany nuzhnye ob容ktnye
fajly. Posle etogo mozhno vklyuchit' ob容ktnye moduli na svoi
mesta v biblioteke mylib
ar rc mylib `cat list`
Esli zhe biblioteka mylib otsutstvuet,to ona sozdaetsya, esli
modul' v biblioteke ishodno otsutstvoval, on zapisyvaetsya v
konec biblioteki (tak rabotaet komanda ar s klyuchami cr).
Po komande "make `cat list`" vypolnyat'sya budet Makefile
(zdes' srabatyvaet mehanizm umolchaniya imeni fajla s Make-
programmoj). Takim obrazom, imeet mesto rekursivnyj vyzov
Make-programmy. Pri rekursivnom vyzove v kachestve imen
celej peredayutsya imena ob容ktnyh fajlov, kotorye neobhodimo
poluchit' i vklyuchit' v biblioteku. V interpretatore make net
sredstv, pozvolyayushchih menyat' spisok celej v processe vypolne-
niya Make-programmy. Kogda eto neobhodimo, spisok celej soz-
daetsya v Make-programme i peredaetsya na vypolnenie kak spi-
sok argumentov pri vyzove podprogrammy. Rekursiya v primere
ponadobilas' dlya togo, chtoby ne zapisyvat' polnyj spisok
pravil dlya vseh fajlov-celej, a vyzvat' make s aktual'nym
spiskom argumentov.
Vozmozhna takaya rekonstrukciya biblioteki, kogda menyaetsya
ee struktura. Dlya etogo v Make-programme ispol'zuyutsya
komandy lorder i tsort. Lorder vyvodit spisok vyzovov modu-
lej sushchestvuyushchej biblioteki, a tsort sortiruet etot spisok
takim obrazom, chtoby struktura biblioteki byla neprotivore-
chivoj, t.e. odnoprohodnyj redaktor svyazej mog by za odno
chtenie bibliotechnogo fajla najti vse neobhodimye moduli. V
Make-programmu vklyuchayutsya dejstviya, v kotoryh stroitsya
struktura biblioteki vo vremennom fajle list i zapominaetsya
v sohranyaemom fajle topology. Vozmozhny sleduyushchie sluchai
rekonstrukcii biblioteki:
Rekonstrukciya biblioteki ne izmenila ee struktury, v
etom sluchae fajl topology ne otlichaetsya ot fajla list.
Rekonstrukciya izmenila strukturu biblioteki. V etom
sluchae fajl topology otlichaetsya ot fajla list i trebuetsya,
vo-pervyh, poluchit' vernuyu strukturu i zapomnit' ee v fajle
topology, vo-vtoryh, izvlech' iz biblioteki vse ob容ktnye
moduli (razobrat' biblioteku i udalit' fajl s bibliotekoj),
- 33 -
zatem sobrat' ee v sootvetstvii s novoj strukturoj. Razob-
rat' biblioteku mozhno komandoj
ar x mylib
V rabochem kataloge budut sozdany kopii ob容ktnyh modulej iz
bibliotechnogo fajla. Bibliotechnyj fajl pri etom sohranyaetsya.
Razobrannuyu biblioteku mozhno sobrat' zanovo, ispol'zuya
informaciyu o strukture biblioteki v fajle topology i
komandu:
ar rc mylib `cat topology`
V shell dopuskaetsya zapisat' if odnoj strokoj sleduyushchim
obrazom:
if spisok_komand;\
then \
spisok_komand;\
else \
spisok_komand;\
fi
V Makefile eta konstrukciya zapisana:
-@if cmp list topology ; \
then \
rm -f `cat list` list;\
else \
ar x $(LIB); rm $@;\
mv list topology;\
ar cr $@ `cat topology`;\
rm -f `cat topology`;\
echo Struktura $@ izmenilas'.;\
fi
Pervaya stroka v nej vyglyadit tak:
'tabulyaciya'-@if cmp list topology ; \
Ostal'nye stroki imeyut bolee 8 vedushchih probelov. Simvol "-"
ukazan, tak kak v otdel'nyh versiyah shell operator if pri
normal'nom zavershenii vozvrashchaet ne 0. Simvol "@" otmenyaet
vyvod etoj stroki pered vypolneniem.
Privedennaya Make-programma pozvolyaet rabotat' s lyubymi
ob容ktnymi bibliotekami. Dlya konkretnoj biblioteki (ili
arhiva) nuzhno izmenit' makroperemennye LIB, SRC i zapisat'
zavisimosti ot fajlov vklyuchenij. Esli neobhodimo rabotat' s
tekstovymi arhivami, to dostatochno udalit' stroku ranlib
$@. Rassmotrim na primerah rabotu programmy pri razlichnyh
ishodnyh usloviyah.
- 34 -
Biblioteki net, struktura neizvestna
make -s
cc -c m1.c
cc -c m2.c
cc -c m3.c
as - -o m4.o m4.s
cc -c m5.c
cc -c m6.c
as - -o m7.o m7.s
cmp: ne mogu otkryt' topology
Struktura mylib izmenilas'.
Biblioteka mylib gotova.
Biblioteka mylib imeetsya, struktura ostaetsya bez izme-
nenij, modificiruetsya fajl x.h
touch x.h
make -s
cc -c m1.c
cc -c m2.c
cc -c m3.c
cc -c m6.c
Biblioteka mylib gotova.
Menyaetsya soderzhimoe bibliotechnogo modulya m5.c. Menya-
etsya struktura biblioteki: modul' m5 vyzyvaet teper' modul'
m1
make -s
cc -c m5.c
Struktura mylib izmenilas'.
Biblioteka mylib gotova.
V fajle topology teper' novaya struktura biblioteki
m4.o m2.o m5.o m1.o m6.o m7.o m3.o
Dobavlyaetsya novyj modul' v biblioteku. Pridetsya izme-
nit' stroku SRC v Make-programme. Imya modulya m8.c , vyzy-
vaet on modul' m5.c
cc -c m8.c
list topology razlichny: char 12, line 3
Struktura mylib izmenilas'.
Biblioteka mylib gotova.
V fajle topology teper' novaya struktura biblioteki
m4.o m2.o m8.o m5.o m1.o m6.o m7.o m3.o
- 35 -
Izmenim modul' m1.c tak, chtoby on vyzyval modul' m2.c,
a modul' m2.c vyzyval m1.c, t.e. poluchaetsya zaciklennaya vza-
imnaya zavisimost' bibliotechnyh modulej m1 i m2
make -s
cc -c m1.c
tsort: zaciklennaya zavisimost'
tsort: m2.o
tsort: m1.o
Struktura mylib izmenilas'.
Biblioteka mylib gotova.
Komanda tsort vyvela soobshchenie ob oshibke v strukture biblio-
teki. Biblioteka sobrana, no pol'zovat'sya eyu nel'zya, neob-
hodimo ispravit' strukturu modulya. Udalyat' fajl mylib ne
nuzhno, tak kak on soderzhit vse ob容ktnye moduli, kotorye
ponadobyatsya dlya novoj sborki.
9. Osobennosti programmirovaniya na yazyke Make
Vsyudu v primerah Make-programma razmeshchalas' v odnom
Makefile. Sushchestvuet vozmozhnost' razmestit' ee v fajle s
drugim imenem i pri vyzove interpretatora make ukazat' eto
imya
make -f imya_fajla
Inogda voznikaet neobhodimost' ispol'zovat' neskol'ko Make-
fajlov, obrazuyushchih odnu Make-programmu, togda pri vyzove
make mozhno ukazat'
make -f imya_fajla1 -f imya_fajla2 i t.d.
Ukazannye fajly sostavyat tekst odnoj Make-programmy v tom
poryadke, v kotorom oni ukazany v komandnoj stroke.
Vnutri odnoj Make-programmy mozhno vyzyvat' make na
vypolnenie drugoj Make-programmy, naprimer:
LLL: a b c d
make -k -f imya_Make-fajla $?
V tom sluchae, esli eta komandnaya stroka ne mozhet byt' nor-
mal'no vypolnena, klyuch -k ukazyvaet na neobhodimost' prodol-
zhit' vypolnenie drugih razdelov Make-programmy, kotorye ne
zavisyat ot celi dannogo pravila. Esli v etom primere ne
ukazat' imya fajla, v kotorom razmeshchena Make-programma, to
avtomaticheski budet vypolnyat'sya Makefile i budet imet' mesto
rekursivnyj vyzov na vypolnenie odnoj programmy.
Est' nekotorye osobennosti pri ispol'zovanii makropere-
mennyh. Dopustim, v Make-programme ukazana stroka
- 36 -
SRC = a1.c a2.c a3.c # kommentarij
Mezhdu a3.c i simvolom # 9 probelov, oni budut peredavat'sya
vsyudu, gde budet ispol'zovano znachenie makroperemennoj SRC.
Predopredelennye makroperemennye "<" i "*" v pravilah
bez suffiksov ne opredeleny, i ih ispol'zovanie mozhet pri-
vesti k nepredskazuemym rezul'tatam.
Vse, chto ukazano za simvolom tabulyaciya v stroke dejst-
vij peredaetsya na vypolnenie shell. Odnako idushchie za simvo-
lom tabulyaciya simvoly "-" i "@" obrabatyvayutsya make.
Interpretator make optimiziruet skorost' vypolneniya dejst-
vij. Esli stroka dejstvij - prostaya komanda sistemy, ona
vypolnyaetsya bez porozhdeniya processa shell. Po etoj prichine,
naprimer, takaya stroka vyzovet sostoyanie oshibki
'tabulyaciya'#cat file
Dejstvitel'no, kak by vypolnyalas' stroka "exec(# cat
file);" v Si-programme?
Esli v spiske zavisimostej otsutstvuyut imena podcelej,
mozhno ispol'zovat' sokrashchennuyu formu zapisi pravila s odnim
dejstviem. Ono imeet vid:
imya_celi:[:]; odna_stroka_dejstviya [# kommentarij]
simvol ";" obyazatelen.
Osobuyu ostorozhnost' neobhodimo soblyudat' pri ukazanii v
Make-programme imeni celi, kotoraya ne yavlyaetsya fajlom. V
etom sluchae programmist dolzhen uchityvat', chto on soznatel'no
isklyuchaet vozmozhnost' ispol'zovaniya etoj celi pri rekonst-
rukciyah, tak kak ona ne svyazana sootnosheniyami vremen sozda-
niya (modifikacii) s drugimi ob容ktami Make-programmy. |to
prepyatstvie mozhno obojti, sozdavaya LOZHNYJ fajl-cel', napri-
mer:
print: f1 f2 f3
print $?
touch print
.DEFAULT:
touch print
V rabochem kataloge sozdan pustoj fajl s imenem print. Teper'
vyvodit'sya na pechat' budut tol'ko te fajly, kotorye trebu-
etsya raspechatat' kak izmenivshiesya. Pravilo DEFAULT zapisano
na tot sluchaj, kogda fajl print otsutstvuet.
Komandu touch mozhno ispol'zovat', kogda neobhodimo raz-
rushit' dinamicheskuyu strukturu svyazej mezhdu fajlami. Nado
- 37 -
uchityvat', chto pri etom make budet rekonstruirovat' vse
fajly zanovo.
Nizhe perechisleny vse klyuchi interpretatora make i ih
dejstvie:
-d otladochnyj rezhim, v kotorom vyvoditsya dopolnitel'naya
informaciya o vypolnenii Make-programmy.
-f sleduyushchij parametr yavlyaetsya imenem Make-fajla. Po umol-
chaniyu ishchetsya Makefile ili makefile. Esli imeyutsya oba,
to vypolnyaetsya Makefile. V komandnoj stroke mozhno uka-
zat' neskol'ko klyuchej -f i parametrov.
-i rezhim ignorirovaniya kodov zaversheniya komand ne ravnyh
nulyu. |kvivalentno direktive IGNORE.
-k esli kod zaversheniya komandy ne raven nulyu, prekratit'
vypolnenie tekushchego pravila i perejti k vypolneniyu dru-
gih razdelov, ne zavisyashchih ot fajla-celi etogo pravila.
-n vyvesti, no ne vypolnyat' stroki dejstvij Make-
programmy.
-p vyvesti polnuyu informaciyu o strukture Make-programmy.
-q poluchit' informaciyu o neobhodimosti rekonstrukcii celi.
Esli rekonstrukciya ukazannoj celi ne trebuetsya, vozvra-
shchaetsya -1, inache 0.
-r otmenyaet predopredelennuyu obrabotku pravil s suffik-
sami, predopredelennye makroperemennye i suffiksy.
-s otmenit' vyvod vypolnyaemyh strok. |kvivalentno direk-
tive SILENT.
-S prervat' vypolnenie Make-programmy pri oshibochnom zaver-
shenii kakoj-libo komandy.
-t unichtozhit' slozhivshuyusya strukturu dinamicheskih (zavisya-
shchih ot vremeni) svyazej mezhdu fajlami.
10. Avtomatizaciya programmirovaniya Make-programm
Dlya sozdaniya novoj Make-programmy mozhno imet' fajl-
shablon, dobavlyaya v nego neobhodimye stroki my poluchim goto-
vuyu k ispol'zovaniyu programmu. Takoj princip realizovan v
programme mkmf. Rassmotrim ee rabotu na primere. Pust' ime-
yutsya ishodnye fajly f.h, f1.c, f2.c i f3.c, iz kotoryh neob-
hodimo poluchit' fajl a.out:
- 38 -
/*
** fajl f.h
*/
# include <stdio.h>
# include <ctype.h>
# include <time.h>
/*
** fajl f1.c
*/
# include f.h
main(ac, av)
int ac;
char **av;
{
f1(); f2(); f3();
printf("Rezul'tat vypolneniya programmy example.\n");
}
f1(){
return;
}
/*
** fajl f2.c
*/
# include f.h
int f2(){
return( a2());
}
# include <stat.h>
char *a2(){
return;
}
/*
** fajl f3.c
*/
# include f.h
int f3(){
return( nn());
}
char *nn(){
return;
}
Pust' vse eti fajly razmeshcheny v odnom kataloge. Vypolnim
komandu mkmf. V rezul'tate ee vypolneniya budet sozdan
Makefile s programmoj sborki fajla a.out:
- 39 -
DEST = .
EXTHDRS = /usr/include/ctype.h \
/usr/include/stat.h \
/usr/include/stdio.h \
/usr/include/time.h
HDRS = f.h
LDFLAGS =
LIBS =
LINKER = cc
MAKEFILE = Makefile
OBJS = f1.o f2.o f3.o
PRINT = pr
PROGRAM = a.out
SRCS = f1.c f2.c f3.c
all: $(PROGRAM)
$(PROGRAM): $(OBJS) $(LIBS)
@echo -n "Sborka $(PROGRAM) ..."
@$(LINKER) $(LDFLAGS) $(OBJS) \
$(LIBS) -o $(PROGRAM)
@echo "gotovo."
clean:; @rm -f $(OBJS)
depend:; @mkmf -f $(MAKEFILE) \
PROGRAM=$(PROGRAM) DEST=$(DEST)
index:; @ctags -wx $(HDRS) $(SRCS)
install: $(PROGRAM)
@echo Ustanovka $(PROGRAM) v $(DEST)
@install -s $(PROGRAM) $(DEST)
print:; @$(PRINT) $(HDRS) $(SRCS)
program:; $(PROGRAM)
tags: $(HDRS) $(SRCS)
@ctags $(HDRS) $(SRCS)
update: $(DEST)/$(PROGRAM)
- 40 -
$(DEST)/$(PROGRAM): $(SRCS) $(LIBS) \
$(HDRS) $(EXTHDRS)
@make -f $(MAKEFILE) \
DEST=$(DEST) install
###
f1.o: f.h /usr/include/stdio.h \
/usr/include/ctype.h \
/usr/include/time.h
f2.o: f.h /usr/include/stdio.h \
/usr/include/ctype.h \
/usr/include/time.h \
/usr/include/stat.h
f3.o: f.h /usr/include/stdio.h \
/usr/include/ctype.h \
/usr/include/time.h
Programmoj mkmf v kachestve ishodnogo fajla-shablona ispol'zo-
van standartnyj fajl /usr/new/lib/p.Makefile, no mozhno uka-
zat' dlya ispol'zovaniya i lyuboj drugoj.
Programma mkmf rabotaet sleduyushchim obrazom: snachala
vybirayutsya i vnosyatsya v fajl-shablon imena vseh ishodnyh faj-
lov rabochego kataloga, dalee opredelyaetsya ot kakih include-
fajlov zavisyat ishodnye fajly, formiruyutsya pravila i zapisy-
vayutsya v fajl-shablon. Dlya oboznacheniya ishodnyh fajlov
ispol'zuyutsya pravila s suffiksami.
Makefile mozhno redaktirovat', izmenyat' znacheniya makro-
peremennyh. Pri etom, esli povtorit' vyzov programmy mkmf,
v nem poyavyatsya tol'ko te izmeneniya, kotorye neobhodimy dlya
sborki s uchetom izmenenij v ishodnyh tekstah.
V Makefile, poluchennom iz standartnogo fajla-shablona,
opredeleny sleduyushchie makroperemennye:
CFLAGS
klyuchi Si-kompilyatora;
DEST
katalog, v kotorom budet razmeshchen rezul'tat;
EXTHDRS
perechen' polnyh imen include-fajlov;
HDRS
perechen' imen include-fajlov, razmeshchennyh v rabochem
kataloge;
LIBS
spisok ob容ktnyh bibliotek dlya sborki programmy;
- 41 -
MAKEFILE
imya fajla s Make-programmoj;
OBJS
spisok ob容ktnyh fajlov, uchastvuyushchih v sborke prog-
rammy;
PROGRAM
imya programmy, kotoruyu neobhodimo poluchit';
SRCS
spisok imen vseh fajlov s ishodnymi tekstami;
Znacheniya makroperemennyh EXTHDRS, HDRS, OBJS, SRCS
ustanavlivayutsya programmoj mkmf i vsegda imeyut aktual'nye
znacheniya. Ostal'nye makroperemennye poluchayut pri sozdanii
Makefile znacheniya po umolchaniyu, ih mozhno izmenyat' po svoemu
usmotreniyu.
Rassmotrim pravila Make-programmy, kotoroye mozhno
ispol'zovat' kak samostoyatel'nye vhody:
all
translyaciya, sborka i zapusk na vypolnenie poluchennoj
programmy;
clean
udalenie nenuzhnyh fajlov;
depend
izmenenie struktury Make-programmy s uchetom sushchestvuyu-
shchego Makefile;
index
pechat' indeksov funkcij sobiraemoj programmy;
install
translyaciya, sborka i ustanovka programmy v ukazannyj
katalog;
print
pechat' include-fajlov i tekstov programmy;
tags
sozdanie fajla ./tags - ssylok programm, napisannyh na
yazykah Si, Paskal' i Fortran;
update
izmenenie Makefile, peregeneraciya, sborka i ustanovka
programmy v ukazannyj katalog. S uchetom proizoshedshih
izmenenij v tekstah ishodnyh fajlov budet vypolneno
tol'ko to, chto neobhodimo v dannyj moment vremeni.
- 42 -
Pust' imeyutsya fajly f[123].c, f.h i Makefile, zamenim v
nem znachenie makroperemennoj DEST na /usr/tmp i makropere-
mennoj PROGRAM - na example. Vypolnim sleduyushchuyu komandnuyu
stroku:
% make program install clean
poluchim na ekrane soobshchenie
cc -c f1.c
cc -c f2.c
cc -c f3.c
Sborka example ... gotovo.
Rezul'tat vypolneniya programmy example
Ustanovka example v /usr/tmp
Vypolnim komandnuyu stroku
% make index
poluchim imena funkcij i mesta ih opredelenij
a2 5 f2.c char *a2(){
f1 11 f1.c f1(){
f2 2 f2.c int f2(){
f3 2 f3.c int f3(){
main 5 f1.c main(ac, av)
nn 6 f3.c char *nn(){
Programma mkmf pozvolyaet sozdavat' Makefile dlya sborki bib-
lioteki. Dlya etogo ispol'zuetsya fajl-shablon
/usr/new/lib/l.Makefile i dopolnitel'no vvodyatsya makropere-
mennaya LIBRARY (imya biblioteki) i pravila extract (izvleche-
nie iz biblioteki vseh chastej v vide otdel'nyh fajlov),
library (translyaciya i zagruzka biblioteki).
Programmist mozhet otkazat'sya ot standartnyh fajlov-
shablonov /usr/new/lib/[lp].Makefile i sozdat' svoi shablony v
rabochem kataloge. Fajly shablony dolzhny imet' imena
l.Makefile i p.Makefile.
- 43 -
LITERATURA
1. "Banahan M., Ratter |. Vvedenie v operacionnuyu sistemu
UNIX. - M.: Radio i svyaz', 1986." AI
2. "Baurn S. Operacionnaya sistema UNIX.- M.: Mir, 1986." AN
3. "Braun P. Vvedenie v operacionnuyu sistemu UNIX. - M.:
Mir, 1987." AM
4. "Got'e R. Rukovodstvo po operacionnoj sisteme UNIX. -
M.: Finansy i statistika, 1985." AE
5. "Dialogovaya edinaya mobil'naya operacionnaya sistema DEMOS.
- Kalinin: CENTRPROGRAMMSISTEM, 1985." AK
6. "Instrumental'naya mobil'naya operacionnaya sistema INMOS/
M.I. Belyakov, A.YU. Liverovskij, V.P. Semik i dr. - M.:
Finansy i statistika, 1985." AH
7. "Kernigan B., Ritchi D., F'yuer A. YAzyk programmirovaniya
Si. Zadachi po yazyku Si. - M.: Finansy i statistika,
1985." AF
8. "Kristian K. Vvedenie v operacionnuyu sistemu UNIX. - M.:
Finansy i statistika, 1985." AJ
9. "Henkok L., Kriger M. Vvedenie v programmirovanie na
yazyke SI. - M.: Radio i svyaz', 1986." AG
10. "Aho A. V., Kernighan Brian V. W., Weinberger Peter J.
AWK - a pattern scanning and processing language. Second
edition. UNIX Programmers manual, 42 BSD, 1980. Bell
Laboratries: Murray Hill, New Jersey, 1978." AL
11. "Feldman S. I. Make - a program maitaining computer pro-
gramms. Bell Laboratries: Murray Hill, New Jersey,
1978." AB
12. "Joy W. N. An introduction the UNIX C-shell. UNIX Pro-
grammers manual, 42 BSD, 1980. Bell Laboratries: Murray
Hill, New Jersey, 1978." AA
13. "Johnson S. C. YACC - yet another compiler-compiler.
Comp. Sci. tech. rep. N 32. Bell Laboratries: Murray
Hill, New Jersey, 1975." AD
14. "Lesk M. E. Lex - lexical analyzer generator. Comp. Sci.
tech. rep. N 39. Bell Laboratries: Murray Hill, New Jer-
sey, 1975." AC
- 44 -
SODERZHANIE
ANNOTACIYA ......................................... 2
1. Vvedenie .......................................... 3
2. Principy vypolneniya Make-programmy ................ 4
3. Soglasheniya yazyka Make ............................. 10
4. Ispol'zovanie makroperemennyh ..................... 13
5. Vypolnenie pravil v Make-programme ................ 16
6. Rezhimy vypolneniya Make-programmy .................. 18
7. Pravila s suffiksami .............................. 21
8. Upravlenie arhivom v Make-programme ............... 30
9. Osobennosti programmirovaniya na yazyke Make ........ 36
10. Avtomatizaciya programmirovaniya Make-programm ...... 38
LITERATURA ........................................ 44
- 45 -
Last-modified: Mon, 29 Jun 1998 14:13:47 GMT