Interpretator make
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
spisok_dejstvij
pravilo v obshchem vide. Spisok_dejstvij mozhet byt' pus-
tym.
.pervyj_suffiks.vtoroj_suffiks:
spisok_dejstvij
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 :