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 -