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 -