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; <&lt; 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); <&lt; - 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 :