Ocenite etot tekst:









          Proizvodstvenno-vnedrencheskij kooperativ

                    "I N T E R F E J S"













                Dialogovaya Edinaya Mobil'naya

                    Operacionnaya Sistema

                        Demos/P 2.1










                       Interpretator

                            make














                           Moskva

                            1988















                        ANNOTACIYA

     Opisan  interpretator  make,  ispol'zuemyj  dlya  sborki
paketov programm, minimiziruyushchij chislo vyzovov translyatora.






























































1.  Vvedenie

     Interpretator make  [1],  naibolee  chasto  ispol'zuemyj
programmistami  DEMOS,  predostavlyaet unikal'nye vozmozhnosti
po upravleniyu lyubymi vidami rabot  v  operacionnoj  sisteme.
Vsyudu,  gde imeetsya neobhodimost' uchityvat' zavisimosti faj-
lov i vremena ih sozdaniya  (modifikacii),  make  okazyvaetsya
nezamenimym  instrumentom.  Interpretator realizuet neproce-
durnyj yazyk, kotoryj pozvolyaet upravlyat' gruppami  komandnyh
strok  sistemy.  V osnovu takogo upravleniya polozheny zavisi-
mosti mezhdu fajlami s ishodnymi dannymi i fajlami, v kotoryh
soderzhatsya rezul'taty. Pri etom predpolagaetsya lyuboj vozmozh-
nyj spisok dejstvij nad ishodnymi fajlami: kompilyaciya,  mak-
roobrabotka, redaktirovanie, pechat', upakovka ili shifrovanie
i t.d.  Ishodnoj  informaciej  dlya  interpretatora  yavlyaetsya
Make-programma,  predstavlyashchaya spisok opredelenij makropere-
mennyh i spisok pravil. Kazhdoe pravilo vklyuchaet formulirovku
celi  i spisok dejstvij dlya interpretatora shell. Pri vypol-
nenii Make-programmy interpretator make ispol'zuet  informa-
ciyu  o  svyazyah  mezhdu  celyami  i  rezul'tatami i peredaet na
vypolnenie shell spiski dejstvij, kotorye  v  dannyj  moment
neobhodimo  vypolnit'  dlya  polucheniya  zadannogo rezul'tata.
Takim obrazom, interpretator make pozvolyaet zapisyvat' lyuboj
nabor  dejstvij  nad  ishodnymi  dannymi,  blagodarya chemu on
shiroko ispol'zuetsya pri reshenii prikladnyh  i  obshchesistemnyh
zadach.   Ochen'  vazhno  i  to,  chto Make-programma stanovitsya
obshchesistemnym standartnym opisaniem struktury zadachi,  algo-
ritma  sborki  i ustanovki programmnogo kompleksa.  Program-
mist, vladeyushchij sredstvami interpretatora  make,  ispol'zuet
sleduyushchuyu   tehnologiyu  razrabotki  programmnogo  kompleksa,
nezavisimo ot ego slozhnosti:

    redaktor -> make -> proverka -> redaktor

Pri takoj tehnologii sushchestvenno  povyshaetsya  proizvoditel'-
nost'  truda programmista,tak kak on osvobozhdaetsya ot ruchnoj
sborki programm, sokrashchaetsya zagruzka |VM - make "sledit" za
tem,  chtoby pri mnogokratnyh kompilyaciyah i otladkah programm
"ne delalols' to, chto mozhno ne delat'".

     Vazhno otmetit', chto make yavlyaetsya sredstvom avtomatiza-
cii procedur ustanovki komponent DEMOS. Naprimer, komponenta
sistemy cat mozhet vklyuchat' sleduyushchie fajly:

vypolnyaemyj kod  - fajl   /bin/cat
tekst programmy  - fajl  ./src/cmd/cat/cat.c
dokumentaciyu     - fajl  ./man/man1/cat.1
programmu sborki - fajl  ./src/cmd/cat/Makefile

Fajl ./src/cmd/cat/Makefile  soderzhit  vsyu  neobhodimuyu  dlya
pravil'noj kompilyacii i ustanovki v OS komponenty cat infor-
maciyu.  Osobenno effektiven  make  dlya  vypolneniya  rabot  v
programmnyh   proektah  maloj  i  srednej  (do  200  fajlov)


                           - 3 -










velichin.

2.  Principy vypolneniya Make-programmy

     Interpretator make vypolnyaet programmu,  kotoruyu  budem
nazyvat' Make-programmoj.  Make-programma soderzhit strukturu
zavisimostej fajlov i dejstvij nad nimi, oformlennyh v  vide
spiska pravil.  Vypolnenie dejstvij privodit k sozdaniyu tre-
buemyh fajlov. Dopustim, imeyutsya fajly

    a  b  c  d  e  f

iz kotoryh opredelennym obrazom neobhodimo poluchit' fajl  E.
Pust' dalee izvestno, chto nad razlichnymi kombinaciyami ishod-
nyh fajlov  vypolnyayutsya  nekotorye  dejstviya,  a  rezul'taty
budut  razmeshcheny  v promezhutochnyh fajlah A, B, C i D.  Rass-
motrim graf, uzly kotorogo - imena fajlov. Dugi grafa  otra-
zhayut  zavisimosti fajlov, strelka ukazyvaet napravlenie pre-
obrazovanij ot ishodnyh fajlov k fajlam, kotorye  neobhodimo
poluchit'.

     V Make-programme kazhdoj pare  (x,y)  incidentnyh  uzlov
etogo  grafa stavitsya v sootvetstvie spisok dejstvij, vypol-
nenie kotoryh privedet k sozdaniyu x. Kogda  fajl  x  sushchest-
vuet,  spisok  dejstvij ne vypolnyaetsya, no tol'ko v tom slu-
chae, esli fajl y sozdan (modificirovan) ran'she  po  vremeni,
chem fajl x.  Kazhdoj duge grafa mozhno postavit' v sootvetsvie
znachenie funkcii t(x,y). Funkciya t(x,y) vozvrashchaet rezul'tat
v vide




                                        /\
                      cel' E           /  \
                           |          /----\
                           |            ||
                 t(E,D )   |    t(E,C)  ||
                ----------------------- ||
               |                      | ||
          cel' D                 cel' C ||
        t(D,A) | t(D,B)               | ||
       ----------------               | ||
       |              |               | ||
  cel' A         cel' B               | ||
       |              |         t(C,e)| ||
 t(A,a)| t(A,b) t(B,c)| t(B,d)  t(C,d)| ||
  ------------   ------------   ------- ||
 |            | |            | |      | ||
 |            | |            | |      | ||
 a            b c            d e      f ||




                           - 4 -











    x MOLOZHE y - spisok dejstvij ne vypolnyaetsya;

    x STAREE y - spisok dejstvij vypolnyaetsya.


Mnozhestvo znachenij funkcii t(x,y) obrazuet strukturu dinami-
cheskih  (zavisyashchih ot vremeni) svyazej mezhdu fajlami. Na etoj
osnove  interpretator  make  vydelyaet   te   razdely   Make-
programmy, kotorye mozhno ne vypolnyat'.

     Vyshe predpolagalos', chto kazhdyj uzel grafa - eto  fajl.
Sushchestvuet  vozmozhnost'  zapisat'  v  Make-programme  spisok
dejstvij, vypolnenie kotoryh ne svyazano s  sozdaniem  fajla.
Poetomu v obshchem sluchae uzel grafa pravil'nee nazyvat' cel'yu.
Para incidentnyh uzlov grafa obrazuet cel' i podcel'. V pri-
mere uzel E - cel', uzly D i C  - podceli celi E. Analogichno
uzel D - cel', uzly A i B - podceli celi D. Nakonec, uzel  A
- cel', uzly a i b - podceli uzla A.  Perechislenie vida CELX
- PODCELI otrazhaet obobshchennuyu strukturu algoritma dostizheniya
celej.

     Vvedem ponyatie rekonstrukciya fajla-celi. Esli fajl-cel'
sushchestvuet i "MOLOZHE" vseh fajlov, ot kotoryh zavisit, to on
ostaetsya bez izmenenij, inache, esli fajl-cel'  sushchestvuet  i
"STAREE" kakogo-libo fajla, ot kotorogo zavisit, on rekonst-
ruiruetsya (izgotavlivaetsya zanovo).

     Privedem primer Make-programmy, sootvetstvuyushchej  prive-
dennomu  vyshe  grafu.  Programma  vyglyadit  kak ego linejnaya
zapis':

     E : D C              # E zavisit ot D i C
             cat D C > E  # dejstvie pravila 1

     D : A B              # D zavisit ot A i B
             cat A B > D  # dejstvie pravila 2

     A : a b              # A zavisit ot a, b
             cat a b > A  # dejstvie pravila 3

     B : c d              # B zavisit ot c, d
             cat c d > B  # dejstvie pravila 4

     C : e f              # C zavisit ot e, f
             cat e f > C  # dejstvie pravila 5

     clean clear:
             -rm -f A B C D E

Zdes' soderzhitsya 6 pravil. Kazhdoe  pravilo  vklyuchaet  stroku
zavisimostej  fajlov  i   komandnuyu stroku sistemy.  Pravilo
opisyvaetsya prosto: snachala ukazyvaetsya imya  fajla,  kotoryj


                           - 5 -










neobhodimo sozdat' (cel'), zatem dvoetochie, zatem imena faj-
lov, ot kotoryh zavisit sozdavaemyj  fajl  (podceli),  zatem
stroki  dejstvij.   Pervuyu  stroku  pravila nazovem  strokoj
zavisimostej.  Sleduet obratit' vnimanie na shestoe  pravilo:
v nem pustoj spisok podcelej v stroke zavisimostej.  Sintak-
sis strok dejstvij sootvetstvuet sintaksisu komandnyh  strok
shell. Pervym simvolom stroki dejstviya v Make-programme dol-
zhen byt' simvol tabulyacii (ili 8 probelov) - eto  obyazatel'-
noe uslovie.

     Vse posledovatel'nosti simvolov, nachinaya ot simvola # i
do konca stroki, yavlyayutsya kommentariem. Pustye stroki i lish-
nie probely ignoriruyutsya.  Esli Make-programma  razmeshchena  v
fajle  Makefile,  to imya fajla s Make-programmoj v komandnoj
stroke mozhno ne ukazyvat'.  Dopustim, fajl s Make-programmoj
nazyvaetsya  Makefile, v rabochem kataloge imeyutsya fajly a, b,
c i d. Fajly A, B, C i D otsutstvuyut, togda  po komande make
my poluchim rezul'tat - fajl E i fajly A, B, C i D.  Rassmot-
rim poryadok vypolneniya Make-programmy, kogda eti  fajly  uzhe
sushchestvuyut, t.e. pri povtornom vypolnenii komandy make.

     Pervyj shag vypolneniya Make-programmy:

     E : D C
             cat D C > E

Esli fajly D i C sushchestvuyut i ne trebuetsya ih rekonstrukciya,
a fajl E "MOLOZHE", chem fajly D i C, to make prekratit vypol-
nenie programmy - fajl E gotov.  Esli trebuetsya  rekonstruk-
ciya fajlov D i/ili C, to osushchestvlyaetsya perehod k vypolneniyu
podcelej D i/ili C, zatem vozvrat k etomu  pravilu.   Inache,
esli  trebuetsya rekonstrukciya fajla E, to vypolnyaetsya dejst-
vie etogo pravila i make prekrashchaet vypolnenie  programmy  -
gotov  rekonstruirovannyj  fajl  E.  Inache, esli otsutstvuyut
fajly D i/ili C, budut vypolneny podceli D  i/ili  C  v  tom
poryadke,  v kotorom oni ukazany v spiske zavisimostej, zatem
vypolnyaetsya dejstvie etogo pravila i make prekratit vypolne-
nie programmy - gotov fajl E.

      Vtoroj shag vypolneniya Make-programmy:

     D : A B
             cat A B > D

Esli fajly A, B i D sushchestvuyut  i ne trebuetsya  ih  rekonst-
rukciya,  to  vypolnyaetsya  perehod  k  sleduyushchemu  shagu Make-
programmy (fajl D uzhe gotov).  Esli trebuetsya  rekonstrukciya
fajlov A i/ili B, proishodit perehod k vypolneniyu podcelej A
i/ili C, zatem vozvrat k etomu pravilu.  Inache, esli  trebu-
etsya  rekonstrukciya fajla D, vypolnyaetsya dejstvie etogo pra-
vila i perehod k sleduyushchemu shagu vypolneniya  Make-programmy.
Inache,  esli  otsutstvuyut  fajly  A i/ili B, budut vypolneny
podceli A i/ili B v tom poryadke, v  kotorom  oni  ukazany  v


                           - 6 -










spiske  zavisimostej, zatem dejstvie etogo pravila i perehod
k vypolneniyu pervogo pravila Make-programmy.

     Tretij shag vypolneniya Make-programmy:

     A : a b
             cat a b  > A

Proveryaetsya nalichie fajlov a i b v  rabochem  kataloge.   Pri
otsutstvii  hotya by odnogo iz nih vypolnenie programmy prek-
rashchaetsya.  Zatem proveryaetsya nalichie fajla A, esli  ego  net
ili  trebuetsya ego rekonstrukciya, vypolnyaetsya dejstvie etogo
pravila. Inache osushchestvlyaetsya perehod k  vypolneniyu  vtorogo
pravila.

     CHetvertyj shag vypolneniya Make-programmy:

     B : c d
             cat c d  > B

Dejstviya analogichny opisannym v tret'em shage,  perehod  osu-
shchestvlyaetsya k vypolneniyu vtorogo pravila.

     Pyatyj shag vypolneniya Make-programm:

     C : e f
             cat e f > C

Proveryaetsya nalichie fajlov e i f  v rabochem  kataloge.   Pri
otsutstvii  hotya by odnogo iz nih vypolnenie programmy prek-
rashchaetsya.  Zatem proveryaetsya nalichie fajla C, esli  ego  net
ili  trebuetsya ego rekonstrukciya, vypolnyaetsya dejstvie etogo
pravila. Inache osushchestvlyaetsya perehod k  vypolneniyu  pervogo
pravila.

     Pri vyzove interpretatora make v komandnoj stroke mozhno
ukazat'  imya celi.  Esli, naprimer, neobhodimo poluchit' fajl
D, to komandnaya stroka vyglyadela by tak

       % make  D

ili esli neobhodimo poluchit'  fajly  C  i  D,  to  komandnaya
stroka vyglyadela by

       % make  C D

Takim obrazom, imya fajla-celi v komandnoj stroke  opredelyaet
vhod v Make-programmu. Esli zadano neskol'ko vhodov, to make
vypolnit v ukazannom poryadke vse neobhodimye  razdely  Make-
programmy.  Esli  zhe vhod ne ukazan, vypolnyaetsya pervoe pra-
vilo Make-programmy.




                           - 7 -










     V shestom pravile primera cel' ne yavlyaetsya  fajlom,  eto
vazhnaya  osobennost'  make. Programmistu predostavlyaetsya voz-
mozhnost' zapisat' pravilo, cel' i/ili  podceli  kotorogo  ne
yavlyayutsya  fajlami.   V  takom  sluchae cel' - eto imya vhoda v
Make-programmu (ili metka pravila).  SHestoe pravilo  ispol'-
zuetsya  v  programme  dlya  udaleniya fajlov. Sleduet obratit'
vnimanie na to, chto v etom pravile dva imeni celi  (clean  i
clear), poetomu v komandnoj stroke mozhno ukazyvat' lyuboe imya
vhoda, naprimer:

            % make  clean
    ili
            % make  clear

V rezul'tate vypolneniya budut udaleny  fajly A, B, C, D i E.

     Vse stroki dejstvij v pravilah peredayutsya na vypolnenie
shell sleduyushchim obrazom:

    sh -c stroka_dejstviya

i dolzhny normal'no vypolnyat'sya interpretatorom sh (kod vozv-
rata  0),  inache  (po  poluchenii   drugogo  koda  zaversheniya
komandnoj  stroki)  make  prekratit  vypolnenie   programmy.
Sushchestvuet  sposob  obojti eto uslovie. Obratite vnimanie na
dejstvie v 6-m pravile: stroka dejstvij nachinaetsya s simvola
"-",  chto oznachaet ne prekrashchat' rabotu pri neudachnom vypol-
nenii komandy rm.

     V Make-programme  mozhno  ispol'zovat'  makroperemennye.
Mehanizm  makroopredelenij  i  podstanovok makroperemennyh v
Make-programme po smyslu analogichen mehanizmu podstanovok  v
shell,  hotya po sintaksisu neskol'ko otlichaetsya.  Rassmotrim
privedennyj vyshe primer  s  ispol'zovaniem  makroperemennyh.
Teper' Makefile budet vyglyadet' tak:




















                           - 8 -










     SRC1 = a b        # makroopredeleniya
     SRC2 = c d
     SRC3 = e f
     SRC4 = A B C D

     E : D C
             cat D C > E

     D : A B
             cat A B > D

     A : $(SRC1)     # A zavisit ot SRC1
             cat $(SRC1) > A

     B : $(SRC2)     # B zavisit ot SRC2
             cat $(SRC2) > B

     C : $(SRC3)     # C zavisit ot SRC3
             cat $(SRC3) > C

     clean clear:
             -rm -f $(SRC4)

Pervye stroki Make-programmy  - stroki s makroopredeleniyami,
gde kazhdoj peremennoj SRC prisvaivayutsya znacheniya. V pravilah
vypolnyaetsya operaciya podstanovki  znacheniya  makroperemennoj,
naprimer  $(SRC1).  Makroperemennye pozvolyayut manipulirovat'
spiskami imen fajlov pri  minimal'nyh  izmeneniyah  v  tekste
Make-programmy.

     Interpretator make realizuet mehanizm obrabotki umolcha-
nij  zavisimostej  fajlov  so  standartnymi suffiksami imen.
Naprimer, fajl s suffiksom imeni .o mozhno poluchit' iz fajlov
s  suffiksami  imen .c (yazyk programmirovaniya Si) i .s (yazyk
assembler).  Rassmotrim primer. Dopustim, imeyutsya fajly a.c,
b.c,  c.c  i d.s, obrazuyushchie programmu, kotoruyu nazovem pro-
gram.  Fajly a.c, b.c i c.c soderzhat stroku

    # include program.h

t.e. zavisyat ot fajla program.h. Make-programma dlya raboty s
etimi fajlami budet soderzhat' 3 stroki

    program: a.o b.o c.o d.o
             cc a.o b.o c.o d.o -o program

    a.o b.o c.o: program.h

Po komande make  budet  sozdan  fajl  program.   Pri  pervom
vypolnenii poluchim na ekrane displeya:





                           - 9 -










      cc  -c a.c
      cc  -c b.c
      cc  -c c.c
      as - -o d.o d.s
      cc a.o b.o c.o d.o -o program

Obratite vnimanie na to, chto interpretator opredelil neobho-
dimye  dejstviya nad ishodnymi fajlami s suffiksami imen .c i
.s, hotya imena etih fajlov v Make-programme  ne  ukazany,  i
pravil'no osushchestvil sborku programmy.  Teper', dopustim, my
vyzyvaem make na vypolnenie vtoroj raz posle  redaktirovaniya
fajla program.h, pri etom poluchim:

      cc  -c a.c
      cc  -c b.c
      cc  -c c.c
      cc a.o b.o c.o d.o -o program

Esli vypolnit'  Make-programmu  posle  redaktirovaniya  fajla
b.c, to poluchim:

      cc  -c b.c
      cc a.o b.o c.o d.o -o program

Nakonec, esli, dopustim, neobhodimo poluchit'  fajl  c.o,  to
mozhno vypolnit' komandu

    make c.o

Mehanizm umolchanij i obrabotki suffiksov  sproektirovan  dlya
avtomatizacii programmirovaniya Make-programm; on sushchestvenno
sokrashchaet razmery programm i kolichestvo oshibok v nih.

3.  Soglasheniya yazyka Make

     Nizhe v kompaktnoj forme privodyatsya  osnovnye  sintaksi-
cheskie  konstrukcii  yazyka  Make.  V sleduyushchih paragrafah po
kazhdoj konstrukcii budut dany opisaniya i primery.


identifikator
     posledovatel'nost' bukv, cifr i simvola "_", soderzhashchaya
     shablony imen fajlov ([...], ?, *), simvoly / i  "."

identifikator = znachenie
     opredelenie makroperemennoj.  V pravoj chasti mogut byt'
     makropodstanovki,  a  takzhe vsya pravaya chast' mozhet byt'
     pustoj strokoj.

     $(identifikator)
     ${identifikator}
     $simvol



                           - 10 -










     podstanovka znacheniya makroperemennoj.  Special'noe zna-
     chenie simvola $ mozhno otmenit', ukazyvaya $$.

kommentarij
     tekst, sleduyushchij za simvolom # i do konca stroki.  Spe-
     cial'noe  znachenie simvola # otmenyaetsya, esli on ukazan
     v kavychkah.

obratnaya naklonnaya cherta
     simvol prodolzheniya stroki.  Special'noe  znachenie  sim-
     vola \ otmenyaetsya, esli on ukazan dvazhdy.

pustaya stroka, probely
     probely sluzhat razdelitelyami slov v  komandnoj  stroke,
     lishnie probely i tabulyacii ignoriruyutsya.  Pustaya stroka
     vsyudu ignoriruetsya.

spisok_zavisimostej



     pravilo v obshchem vide.  Spisok_dejstvij mozhet byt'  pus-
     tym.

 .pervyj_suffiks.vtoroj_suffiks:



     pravilo s ukazaniem  zavisimostej  suffiksov.   Esli  v
     Make-programme  soderzhitsya  hotya by odno pravilo s suf-
     fiksami, otlichnymi ot predopredelennyh, v  nee  neobho-
     dimo vklyuchit' pravilo:

          .SUFFIXES: spisok_suffiksov


spisok_celej :[:] spisok_podcelej
     spisok_zavisimostej.  Spisok_podcelej mozhet  byt'  pus-
     tym.   Pravila  s  odnim  i dvumya simvolami dvoetochiya v
     spiske_zavisimostej  otlichayutsya   poryadkom   vypolneniya
     spiska_podcelej i spiska_dejstvij.

imya_celi [imya_celi]
     spisok_celej.  Imya_celi - identifikator. Mozhno  ispol'-
     zovat'  simvol  /  i tochku.  Imya_celi mozhet byt' imenem
     fajla ili kataloga, togda vklyuchaetsya  vypolnenie  meha-
     nizma  rekonstrukcii.   Imya_celi  mozhet  ne byt' imenem
     fajla, togda mehanizm rekonstrukcii  ne  vklyuchaetsya,  a
     imya_celi  yavlyaetsya  metkoj  (imenem  pravila,  vhoda  v
     Make-programmu).

imya_podceli [imya_podceli] [#kommentarij]
     spisok_podcelej.  Imya_podceli  -  identifikator.  Mozhno


                           - 11 -










     ispol'zovat'  shablony imen fajlov "*", "?", [...], sim-
     vol / i tochku.  Imya_podceli mozhet  byt'  imenem  fajla,
     dlya  kotorogo  zapisano ili ne zapisano pravilo v Make-
     programme, v etih sluchayah vklyuchaetsya mehanizm  rekonst-
     rukcii.  Imya_podceli mozhet ne byt' imenem fajla, v etom
     sluchae mehanizm rekonstrukcii ne vklyuchaetsya, a imya_celi
     yavlyaetsya   metkoj   (imenem   pravila,  vhoda  v  Make-
     programmu).

stroka_dejstviya [#kommentarij]
 ...............
stroka_dejstviya [#kommentarij]


     spisok_dejstvij. Lyubye komandnye stroki DEMOS i  uprav-
     lyayushchie konstrukcii Shell.

'tabulyaciya'komandnaya_stroka_shell
      stroka_dejstviya.


     Stroka_dejstviya mozhet byt' ukazana v stroke  zavisimos-
     tej cherez simvol ";". Stroku_dejstviya mozhno ukazyvat' v
     sleduyushchih formatah:

          'tabulyaciya'komandnaya__stroka__shell    1

          'tabulyaciya'@komandnaya_stroka__shell    2

          'tabulyaciya'-komandnaya_stroka__shell    3

          'tabulyaciya'-@komandnaya_stroka_shell    4

     V pervom formate komandnaya stroka vyvoditsya na  pechat';
     esli kod vozvrata posle ee  vypolneniya ne 0, make prek-
     rashchaet vypolnenie programmy po oshibke.  Vo vtorom  for-
     mate  komandnaya stroka ne vyvoditsya na pechat'; esli kod
     vozvrata posle ee  vypolneniya  ne  0,  make  prekrashchaet
     vypolnenie  programmy  po  oshibke.   V  tret'em formate
     komandnaya stroka vyvoditsya na pechat'; esli kod vozvrata
     posle  ee   vypolneniya  ne  0, make ignoriruet oshibku i
     vypolnenie programmy prodolzhaetsya.  V chetvertom formate
     komandnaya stroka ne vyvoditsya na pechat'; esli kod vozv-
     rata posle ee  vypolneniya ne 0, make ignoriruet  oshibku
     i vypolnenie programmy prodolzhaetsya.  Prostaya komandnaya
     stroka (odna komanda DEMOS s  argumentami)  vypolnyaetsya
     bez   porozhdeniya  obolochki.   Drugie  komandnye  stroki
     vypolnyayutsya    sh    sleduyushchim    obrazom:    sh     -c
     komandnaya_stroka_shell


     Dlya sokrashcheniya oboznachenij predusmotreny  makroperemen-
nye  s  predopredelennymi  imenami.  V pravile bez suffiksov


                           - 12 -










stroka_dejstviya mozhet  vklyuchat'  sleduyushchie  predopredelennye
makroperemennye:

@    imya celi;

?    imena  fajlov  iz  spiska  podcelej,   kotorye   MOLOZHE
     fajla_celi.  |ti fajly uchastvuyut v rekonstrukcii celi.


     V pravile s suffiksami stroka_dejstviya  mozhet  vklyuchat'
sleduyushchie predopredelennye makroperemennye:

*    osnova_imeni_celi;

@    osnova_imeni_celi.vtoroj_suffiks;

<&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 :
       Znachenie $* -  a
       Znachenie $@ -  a.t
       Znachenie $? -  file.h a.c
       Znachenie $< -  a.c

      Dejstviya pravila .c.t :
       Znachenie $* -  b
       Znachenie $@ -  b.t
       Znachenie $? -  file.h b.c
       Znachenie $< -  b.c

      Dejstviya pravila .c.t :
       Znachenie $* -  c
       Znachenie $@ -  c.t
       Znachenie $? -  file.h c.c
       Znachenie $< -  c.c

      Dejstviya pravila result


                           - 24 -










       Znachenie $@ -  result
       Znachenie $? -  d.t a.t b.t c.t

Zametim, chto pravilo .k.t vypolnyaetsya tol'ko odin raz,  pra-
vilo  .c.t - tri raza, kak i trebovalos' dlya spiska ishodnyh
fajlov, ukazannyh v spiske podcelej  pravila  result.  Smysl
makroperemennoj  "?"  v  pravile s suffiksom tot zhe, chto i v
obychnom fajle - spisok podcelej. Makroperemennaya "@" v obych-
nom pravile - imya celi, a zdes' imya rezul'tata - fajl s ime-
nem osnova.suffiks_2.

     Interpretator make soderzhit spisok pravil dlya standart-
nyh  suffiksov  imen  fajlov  i opredeleniya samih suffiksov.
|tot spisok podklyuchaetsya k Make-programme pol'zovatelya, esli
make  zapuskaetsya  na  vypolnenie bez klyucha -r.  Programmist
polnost'yu osvobozhdaetsya ot  ukazaniya  pravil  preobrazovanij
fajlov  so  standartnymi  suffiksami  imen.   Obrabatyvayutsya
fajly, imena kotoryh vklyuchayut sleduyushchie suffiksy:

     .out   -    fajl v zagruzochnom formate;
     .o     -    ob容ktnyj fajl;
     .c     -    fajl na yazyke Si;
     .f     -    fajl na yazyke Fortran;
     .p     -    fajl na yazyke Paskal';
     .s     -    fajl na assemblere;
     .l     -    fajl na lex;
     .y     -    fajl na yacc;

Krome togo,  v  Make-programmu  vklyuchayutsya  predopredelennye
makroperemennye:

LOADLIBES =   # imena bibliotek
AS = as -     # imya assemblera
CC = cc       # imya Si-kompilyatora
CFLAGS =      # klyuchi Si-kompilyatora
PC = pc       # imya Paskal'-kompilyatora
PFLAGS =      # klyuchi Paskal'-kompilyatora
FF = f77      # imya f77-kompilyatora
FFLAGS =      # klyuchi f77-kompilyatora
LEX = lex     # imya generatora
LFLAGS =      # klyuchi lex
YACC = yacc   # imya generatora
YFLAGS =      # klyuchi yacc

Znacheniya predopredelennyh  makroperemennyh  mozhno  menyat'  v
Make-programme,  naprimer,  esli vvesti stroku  CFLAGS = -O,
to predopredelennaya makroperemennaya CFLAGS budet imet' novoe
znachenie  v Make-programme.  Nizhe privodyatsya graf zavisimos-
tej celej i spisok pravil Make-programmy, realizuyushchej  obra-
botku fajlov po suffiksam imen.





                           - 25 -










             .c   .f   .p   .s   .l   .y
              |    |    |    |    |    |
              |-------------------------
              |
              |
              --->  .out    <--- .o  ---
                                       |
                                       |
              --------------------------
             |    |    |    |    |    |
            .p   .f   .c   .s   .l   .y
                       |
                      ---
                     |   |
                    .l  .y








































                           - 26 -










 .l.out:
       $(LEX) $<
       $(CC) $(CFLAGS) lex.yy.c $(LOADLIBES) -ll -o $@
       rm lex.yy.c

 .y.out:
       $(YACC) $(YFLAGS) $<
       $(CC) $(CFLAGS) y.tab.c  $(LOADLIBES) -ly -o $@
       rm y.tab.c

 .f.out:
       $(FF) $(FFLAGS) $< $(LOADLIBES) -o $@
       -rm $*.o

 .o.out:
       $(CC) $(CFLAGS) $< $(LOADLIBES) -o $@

 .c.out:
       $(CC) $(CFLAGS) $< $(LOADLIBES) -o $@

 .p.out:
       $(PC) $(PFLAGS) $< $(LOADLIBES) -o $@

 .s.out:
       $(CC) $(CFLAGS) $< $(LOADLIBES) -o $@

 .l.c:
       $(LEX) $<
       mv lex.yy.c $@

 .y.c:
       $(YACC) $(YFLAGS) $<
       mv y.tab.c $@

 .l.o:
       $(LEX) $(LFLAGS) $<
       $(CC) $(CFLAGS) -c lex.yy.c
       rm lex.yy.c; mv lex.yy.o $@

 .y.o:
       $(YACC) $(YFLAGS) $<
       $(CC) $(CFLAGS) -c y.tab.c
       rm y.tab.c; mv y.tab.o $@

 .s.o:
       $(AS) -o $@ $<

 .f.o:
       $(FF) $(FFLAGS) -c $<

 .c.o:
       $(CC) $(CFLAGS) -c $<



                           - 27 -










 .p.o:
       $(PC) $(PFLAGS) -c $<

 .SUFFIXES: .out .o .c .f .p .y .l .s

Dopustim, imeyutsya fajly f[1-6].c s ishodnymi tekstami  prog-
rammy result. Fajly f[1-3].c soderzhat stroki

    # include file1.h
    # include file2.h

    i fajly f[4-6].c soderzhat stroku

    # include file3.h

Sleduyushchaya programma upravlyaet sozdaniem programmy result:

 CFLAGS = -O
 LDFLAGS = -s -n -o
 OBJS = f1.o f2.o f3.o f4.o f5.o f6.o

 result:  ${OBJS}
        ${CC} ${OBJS} ${LDFLAGS} $@

 f1.o f2.o f3.o : file1.h  file2.h

 f4.o f5.o f6.o : file3.h

Tak vyglyadit protokol vypolneniya:

 cc -O -c f1.c
 cc -O -c f2.c
 cc -O -c f3.c
 cc -O -c f4.c
 cc -O -c f5.c
 cc -O -c f6.c
 cc f1.o f2.o f3.o f4.o f5.o f6.o -s -n -o result

Teper' izmenim vremya modifikacii fajla komandoj

    touch file3.h

i snova vypolnim programmu, v rezul'tate poluchim:

     cc -O -c f4.c
     cc -O -c f5.c
     cc -O -c f6.c
     cc f1.o f2.o f3.o f4.o f5.o f6.o -s -n -o result

Teper' izmenim vremya modifikacii fajla komandoj touch f3.c i
snova vypolnim programmu




                           - 28 -










     cc -O -c f3.c
     cc f1.o f2.o f3.o f4.o f5.o f6.o -s -n -o result

Programmist mozhet otklyuchit' standartnye opredeleniya i spisok
pravil  s suffiksami (klyuch -r), mozhet ih ispol'zovat' naryadu
s temi, chto opredeleny v Make-programme. Dopustim,  k  imeyu-
shchimsya  fajlam  predydushchego  primera  dobavlyayutsya fajly a1.t,
a2.t i a3.t, ih neobhodimo obrabotat' programmoj sed,  vyho-
dom  kotoroj  budut  fajly  a1.c  a2.c  a3.c.   Teper' Make-
programma vyglyadit tak:

     CFLAGS = -O
     LDFLAGS = -o
     OBJS = a1.o a2.o a3.o f1.o f2.o f3.o f4.o f5.o f6.o

     result:  ${OBJS}
            ${CC} ${OBJS} ${LDFLAGS} $@

     f1.o f2.o f3.o : file1.h  file2.h

     f4.o f5.o f6.o : file3.h

     a1.c: a1.t

     a2.c: a2.t

     a3.c: a3.t

     .t.c:
           sed s/aaa/bbb/ < $< > $*.c

     .SUFFIXES: .t

Protokol vypolneniya programmy:

 sed s/aaa/bbb/ < a1.t > a1.c
 cc -O -c a1.c
 sed s/aaa/bbb/ < a2.t > a2.c
 cc -O -c a2.c
 sed s/aaa/bbb/ < a3.t > a3.c
 cc -O -c a3.c
 cc -O -c f1.c
 cc -O -c f2.c
 cc -O -c f3.c
 cc -O -c f4.c
 cc -O -c f5.c
 cc -O -c f6.c
 cc a1.o a2.o a3.o f1.o f2.o f3.o f4.o f5.o f6.o -o result

Make dopuskaet obrabotku suffiksov tol'ko odnogo urovnya vlo-
zhennosti.  V  pravile SUFFIXES ukazan tol'ko suffiks t, suf-
fiks c opredelen v podklyuchaemom spiske suffiksov.



                           - 29 -










8.  Upravlenie arhivom v Make-programme

     V DEMOS sushchestvuyut dva tipa  arhivov:  arhiv  tekstovyh
fajlov  i  arhiv ob容ktnyh fajlov (imeyushchij strukturu biblio-
teki ob容ktnyh modulej).   Sozdannyj  arhiv  yavlyaetsya  odnim
fajlom,  a  fajly, iz kotoryh on sobran, obrazuyut ego chasti.
Upravlenie   arhivom   vklyuchaet   dve    zadachi:    sozdanie
fajla_arhiva   opredelennoj   struktury  i  ego  modifikaciya
(dobavlenie, udalenie i zamena chastej, izmenenie  struktury,
dekompoziciya  arhiva na fajly, iz kotoryh on byl obrazovan).
Dlya resheniya takih zadach Make-programma  dolzhna  obespechivat'
rabotu  s celyami dvuh tipov: fajl_arhiv i fajl dlya vklyucheniya
v arhiv.  Pri etom ocenivaetsya vremya  poslednej  modifikacii
vklyuchaemogo  v  arhiv  fajla (a ne vremya sozdaniya arhiva ili
zapisi fajla_chasti v arhiv).  Imya fajla_arhiva mozhet  ukazy-
vat'sya v spiske zavisimostej pravil kak obychnaya cel':

    imya_arhivnogo_fajla(imya_fajla_dlya_vklyucheniya_v_arhiv)

Krome imen fajlov, pri rabote s bibliotekoj ob容ktnyh  modu-
lej mozhno ukazyvat' imena funkcij

    imya_fajla_biblioteki((_vneshnee_imya_bibl_funkcii))

Rassmotrim fragment Make-programmy dlya postroeniya biblioteki
s imenem libP.a:

    L      =   libP.a
    CFLAGS =  -O

    $(L)::
           ar r $(L)

    $(L):: $(L)(Ia.o) $(L)(La.o) $(L)(Da.o)

    # Iabs, Labs, Dabs - imena funkcij

    $(L)(Iabs.o):     lib/Ia.c
           $(CC) $(CFLAGS) lib/Ia.c
           ar r $(L) Ia.o
           -rm -f Ia.o

    $(L)(Labs.o):     lib/La.c
           $(CC) $(CFLAGS) lib/La.c
           ar r $(L) La.o
           -rm -f La.o

    $(L)(Dabs.o):     lib/Da.c
           $(CC) $(CFLAGS) lib/Da.c
           ar r $(L) Da.o
           -rm -f Da.o

U takogo sposoba raboty  s  bibliotekoj  est'  nedostatok  -


                           - 30 -










Make-programma dolzhna soderzhat' strukturu biblioteki. Spisok
imen bibliotechnyh modulej vo vtorom pravile  "$(L)::"  soot-
vetstvuet poryadku ih razmeshcheniya v biblioteke.  Eshche odno neu-
dobstvo zaklyuchaetsya v tom, chto esli by biblioteka  soderzhala
bol'shoe  kolichestvo  modulej, naprimer 100, to potrebovalas'
by zapis' 100 pravil v programme.  Dlya  postroeniya  odnopro-
hodnyh  bibliotek  takoj  sposob  ukazaniya  struktury  imeet
sushchestvennyj nedostatok, tak kak izmenenie ishodnogo  teksta
ob容ktnogo  modulya  mozhet  privesti k neobhodimosti izmenit'
strukturu biblioteki, a eto,  v  svoyu  ochered',  privedet  k
neobhodimosti  rekonstruirovat' Make-programmu.  Krome togo,
pri postroenii biblioteki neobhodimo,  chtoby  vse  ob容ktnye
fajly byli v rabochem kataloge.

     Rassmotrim Make-programmu,  v  kotoroj  eti  nedostatki
ustraneny.   Voz'mem  v  kachestve  primera fajly s ishodnymi
tekstami modulej ob容ktnoj biblioteki mylib

    m1.c m2.c m3.c m4.s m5.c m6.c m7.s

Dopustim, struktura odnoprohodnoj biblioteki s uchetom  vyzo-
vov modulej dolzhna byt' takoj:

    m4.o m2.o m1.o m5.o m6.o m7.o m3.o

Tekst Make-programmy:





























                           - 31 -










    CFLAGS = -O
    SRC    =  m1.c m2.c m3.c m4.s m5.c m6.c m7.s
    LIB    =  mylib

    ${LIB}:  ${SRC}
         echo $? | sed s/\\.[cs]/\\.o/g > list
         make `cat list`
         ar cr $@ `cat list`
         lorder $@ | tsort > list
        -@if cmp list topology ; \
         then \
             rm -f `cat list` list;\
         else \
             ar x ${LIB}; rm $@;\
             mv list topology;\
             ar cr $@ `cat topology`;\
             rm -f `cat topology`;\
             echo Struktura $@ izmenilas'.;\
         fi
         ranlib ${LIB}
         echo Biblioteka $@ gotova.

    m1.c : x.h
            touch m1.c

    m2.c : x.h y.h
            touch m2.c

    m3.c : x.h
            touch m3.c

    m5.c : y.h
            touch m5.c

    m6.c : x.h
            touch m6.c

Rassmotrim prostye  sluchai  rekonstrukcii  uzhe  sushchestvuyushchej
biblioteki.   Dopustim,  izmenilsya  ishodnyj tekst odnogo iz
modulej. V etom sluchae dostatochno na ego mesto v  biblioteke
vklyuchit'  novuyu versiyu ob容ktnogo fajla etogo modulya.  CHtoby
ne kompilirovat' drugie fajly biblioteki, mozhno ispol'zovat'
predopredelennuyu  makroperemennuyu "?" - spisok fajlov, koto-
rye stali MOLOZHE fajla mylib. Kak  uzhe  govorilos'  vyshe,  v
kataloge   net  ob容ktnyh  fajlov.  Sledovatel'no,  v  Make-
programmu  neobhodimo  vklyuchit'  predopredelennye   sredstva
obrabotki  suffiksov, a v kachestve argumenta formirovat' imya
celi s suffiksom o,  togda make avtomaticheski postroit novyj
ob容ktnyj  fajl  etogo modulya. V primere fajl list ispol'zu-
etsya v kachestve vremennogo rabochego fajla. Stroka vida

    echo $? | sed s/\\.[cs]/\\.o/g > list



                           - 32 -










zapisyvaet  v fajl list spisok celej s suffiksom o. Redaktor
sed  ispol'zuetsya v etoj komandnoj stroke dlya zameny suffik-
sov c i s na o.  Takim obrazom,  fajl  list  soderzhit  imena
fajlov-celej,  kotorye  neobhodimo  sozdat' i na etoj osnove
rekonstruirovat' biblioteku. |to  mozhno  sdelat',  naprimer,
tak:

    make `cat list`

V  rezul'tate  vypolneniya  budut  sozdany  nuzhnye  ob容ktnye
fajly.   Posle etogo mozhno vklyuchit' ob容ktnye moduli na svoi
mesta v biblioteke mylib

    ar rc mylib `cat list`

Esli zhe biblioteka mylib otsutstvuet,to ona sozdaetsya,  esli
modul'  v biblioteke ishodno otsutstvoval, on zapisyvaetsya v
konec biblioteki (tak rabotaet komanda ar s klyuchami cr).

     Po komande "make `cat list`" vypolnyat'sya budet Makefile
(zdes'  srabatyvaet  mehanizm  umolchaniya imeni fajla s Make-
programmoj). Takim obrazom, imeet  mesto  rekursivnyj  vyzov
Make-programmy.   Pri  rekursivnom  vyzove  v  kachestve imen
celej  peredayutsya imena ob容ktnyh fajlov, kotorye neobhodimo
poluchit' i vklyuchit' v biblioteku.  V interpretatore make net
sredstv, pozvolyayushchih menyat' spisok celej v processe vypolne-
niya Make-programmy.  Kogda eto neobhodimo, spisok celej soz-
daetsya v Make-programme i peredaetsya na vypolnenie kak  spi-
sok  argumentov pri vyzove podprogrammy.  Rekursiya v primere
ponadobilas' dlya togo, chtoby  ne  zapisyvat'  polnyj  spisok
pravil  dlya  vseh  fajlov-celej, a vyzvat' make s aktual'nym
spiskom argumentov.

     Vozmozhna takaya rekonstrukciya biblioteki, kogda menyaetsya
ee  struktura.   Dlya  etogo  v  Make-programme  ispol'zuyutsya
komandy lorder i tsort.  Lorder vyvodit spisok vyzovov modu-
lej  sushchestvuyushchej  biblioteki, a tsort sortiruet etot spisok
takim obrazom, chtoby struktura biblioteki byla  neprotivore-
chivoj,  t.e.  odnoprohodnyj  redaktor  svyazej mog by za odno
chtenie bibliotechnogo fajla najti vse neobhodimye moduli.   V
Make-programmu   vklyuchayutsya  dejstviya,  v  kotoryh  stroitsya
struktura biblioteki vo vremennom fajle list i  zapominaetsya
v  sohranyaemom  fajle  topology.  Vozmozhny  sleduyushchie sluchai
rekonstrukcii biblioteki:

     Rekonstrukciya biblioteki ne izmenila  ee  struktury,  v
etom sluchae fajl topology ne otlichaetsya ot fajla list.

     Rekonstrukciya izmenila  strukturu  biblioteki.  V  etom
sluchae  fajl  topology otlichaetsya ot fajla list i trebuetsya,
vo-pervyh, poluchit' vernuyu strukturu i zapomnit' ee v  fajle
topology,  vo-vtoryh,  izvlech'  iz  biblioteki vse ob容ktnye
moduli (razobrat' biblioteku i udalit' fajl s  bibliotekoj),


                           - 33 -










zatem  sobrat' ee v sootvetstvii s novoj strukturoj.  Razob-
rat' biblioteku mozhno komandoj

    ar x mylib

V rabochem kataloge budut sozdany kopii ob容ktnyh modulej  iz
bibliotechnogo fajla. Bibliotechnyj fajl pri etom sohranyaetsya.
Razobrannuyu  biblioteku  mozhno  sobrat'  zanovo,   ispol'zuya
informaciyu   o  strukture  biblioteki  v  fajle  topology  i
komandu:

    ar rc mylib `cat topology`

V shell dopuskaetsya  zapisat'  if  odnoj  strokoj  sleduyushchim
obrazom:

    if     spisok_komand;\
    then \
           spisok_komand;\
    else \
           spisok_komand;\
    fi

V Makefile eta konstrukciya zapisana:

    -@if cmp list topology ; \
      then \
          rm -f `cat list` list;\
      else \
          ar x $(LIB); rm $@;\
          mv list topology;\
          ar cr $@ `cat topology`;\
          rm -f `cat topology`;\
          echo Struktura $@ izmenilas'.;\
      fi

Pervaya stroka v nej vyglyadit tak:

     'tabulyaciya'-@if cmp list topology ; \

Ostal'nye stroki imeyut bolee 8 vedushchih probelov.  Simvol "-"
ukazan,  tak  kak  v otdel'nyh versiyah shell operator if pri
normal'nom zavershenii vozvrashchaet ne 0. Simvol  "@"  otmenyaet
vyvod etoj stroki pered vypolneniem.

     Privedennaya Make-programma pozvolyaet rabotat' s  lyubymi
ob容ktnymi  bibliotekami.  Dlya  konkretnoj  biblioteki  (ili
arhiva) nuzhno izmenit' makroperemennye LIB, SRC  i  zapisat'
zavisimosti ot fajlov vklyuchenij.  Esli neobhodimo rabotat' s
tekstovymi arhivami, to dostatochno  udalit'  stroku   ranlib
$@.   Rassmotrim  na primerah rabotu programmy pri razlichnyh
ishodnyh usloviyah.



                           - 34 -










     Biblioteki net, struktura neizvestna

     make -s
     cc  -c m1.c
     cc  -c m2.c
     cc  -c m3.c
     as - -o m4.o m4.s
     cc  -c m5.c
     cc  -c m6.c
     as - -o m7.o m7.s
     cmp: ne mogu otkryt' topology
     Struktura mylib izmenilas'.
     Biblioteka mylib gotova.


     Biblioteka mylib imeetsya, struktura ostaetsya bez  izme-
nenij, modificiruetsya fajl x.h

     touch x.h
     make -s
     cc  -c m1.c
     cc  -c m2.c
     cc  -c m3.c
     cc  -c m6.c
     Biblioteka mylib gotova.


     Menyaetsya soderzhimoe bibliotechnogo modulya  m5.c.   Menya-
etsya  struktura biblioteki: modul' m5 vyzyvaet teper' modul'
m1

     make -s
     cc  -c m5.c
     Struktura mylib izmenilas'.
     Biblioteka mylib gotova.

V fajle topology teper' novaya struktura biblioteki

    m4.o m2.o m5.o m1.o m6.o m7.o m3.o


     Dobavlyaetsya novyj modul' v biblioteku.  Pridetsya  izme-
nit'  stroku  SRC v Make-programme.  Imya modulya m8.c , vyzy-
vaet  on modul' m5.c

     cc  -c m8.c
     list topology razlichny: char 12, line 3
     Struktura mylib izmenilas'.
     Biblioteka mylib gotova.

V fajle topology teper' novaya struktura biblioteki

    m4.o m2.o m8.o m5.o m1.o m6.o m7.o m3.o


                           - 35 -










     Izmenim modul' m1.c tak, chtoby on vyzyval modul'  m2.c,
a modul' m2.c vyzyval m1.c, t.e. poluchaetsya zaciklennaya vza-
imnaya zavisimost' bibliotechnyh modulej m1 i m2

     make -s
     cc  -c m1.c
     tsort: zaciklennaya zavisimost'
     tsort: m2.o
     tsort: m1.o
     Struktura mylib izmenilas'.
     Biblioteka mylib gotova.

Komanda tsort vyvela soobshchenie ob oshibke v strukture biblio-
teki.   Biblioteka sobrana, no pol'zovat'sya eyu nel'zya, neob-
hodimo ispravit' strukturu modulya.  Udalyat'  fajl  mylib  ne
nuzhno,  tak  kak  on  soderzhit vse ob容ktnye moduli, kotorye
ponadobyatsya dlya novoj sborki.

9.  Osobennosti programmirovaniya na yazyke Make

     Vsyudu v primerah  Make-programma  razmeshchalas'  v  odnom
Makefile.  Sushchestvuet  vozmozhnost'  razmestit'  ee v fajle s
drugim imenem i pri vyzove interpretatora make  ukazat'  eto
imya

    make -f imya_fajla

Inogda voznikaet neobhodimost' ispol'zovat' neskol'ko  Make-
fajlov,  obrazuyushchih  odnu  Make-programmu,  togda pri vyzove
make mozhno ukazat'

    make -f imya_fajla1 -f imya_fajla2 i t.d.

Ukazannye fajly sostavyat tekst odnoj  Make-programmy  v  tom
poryadke, v kotorom oni ukazany v komandnoj stroke.

     Vnutri odnoj  Make-programmy  mozhno  vyzyvat'  make  na
vypolnenie drugoj Make-programmy, naprimer:

    LLL: a b c d
          make -k -f imya_Make-fajla $?

V tom sluchae, esli eta komandnaya stroka ne mozhet  byt'  nor-
mal'no vypolnena, klyuch -k ukazyvaet na neobhodimost' prodol-
zhit' vypolnenie drugih razdelov Make-programmy,  kotorye  ne
zavisyat  ot  celi  dannogo  pravila.  Esli v etom primere ne
ukazat' imya fajla, v kotorom  razmeshchena  Make-programma,  to
avtomaticheski budet vypolnyat'sya Makefile i budet imet' mesto
rekursivnyj vyzov na vypolnenie odnoj programmy.

     Est' nekotorye osobennosti pri ispol'zovanii makropere-
mennyh.  Dopustim, v Make-programme ukazana stroka



                           - 36 -










    SRC = a1.c a2.c a3.c     # kommentarij

Mezhdu a3.c i simvolom # 9 probelov, oni  budut  peredavat'sya
vsyudu, gde budet ispol'zovano znachenie makroperemennoj SRC.

     Predopredelennye makroperemennye "<" i "*"  v  pravilah
bez  suffiksov  ne opredeleny, i ih ispol'zovanie mozhet pri-
vesti k nepredskazuemym rezul'tatam.

     Vse, chto ukazano za simvolom tabulyaciya v stroke  dejst-
vij  peredaetsya na vypolnenie shell. Odnako idushchie za simvo-
lom  tabulyaciya  simvoly  "-"  i  "@"  obrabatyvayutsya   make.
Interpretator  make  optimiziruet skorost' vypolneniya dejst-
vij.  Esli stroka dejstvij - prostaya  komanda  sistemy,  ona
vypolnyaetsya  bez porozhdeniya processa shell. Po etoj prichine,
naprimer, takaya stroka vyzovet sostoyanie oshibki

     'tabulyaciya'#cat file

Dejstvitel'no,  kak  by  vypolnyalas'  stroka   "exec(#   cat
file);" v Si-programme?

     Esli v spiske zavisimostej otsutstvuyut imena  podcelej,
mozhno  ispol'zovat' sokrashchennuyu formu zapisi pravila s odnim
dejstviem. Ono imeet vid:

    imya_celi:[:];  odna_stroka_dejstviya [# kommentarij]

simvol ";" obyazatelen.

     Osobuyu ostorozhnost' neobhodimo soblyudat' pri ukazanii v
Make-programme  imeni  celi,  kotoraya  ne yavlyaetsya fajlom. V
etom sluchae programmist dolzhen uchityvat', chto on soznatel'no
isklyuchaet  vozmozhnost'  ispol'zovaniya etoj celi pri rekonst-
rukciyah, tak kak ona ne svyazana sootnosheniyami vremen  sozda-
niya  (modifikacii)  s drugimi ob容ktami Make-programmy.  |to
prepyatstvie mozhno obojti, sozdavaya LOZHNYJ fajl-cel',  napri-
mer:

    print: f1 f2 f3
           print $?
           touch print

     .DEFAULT:
           touch print

V rabochem kataloge sozdan pustoj fajl s imenem print. Teper'
vyvodit'sya  na  pechat' budut tol'ko te fajly, kotorye trebu-
etsya raspechatat' kak izmenivshiesya. Pravilo DEFAULT  zapisano
na tot sluchaj, kogda fajl print otsutstvuet.

     Komandu touch mozhno ispol'zovat', kogda neobhodimo raz-
rushit'  dinamicheskuyu  strukturu  svyazej  mezhdu fajlami. Nado


                           - 37 -










uchityvat', chto pri  etom  make  budet  rekonstruirovat'  vse
fajly zanovo.

     Nizhe perechisleny vse klyuchi  interpretatora  make  i  ih
dejstvie:

-d   otladochnyj rezhim, v  kotorom  vyvoditsya  dopolnitel'naya
     informaciya o vypolnenii Make-programmy.

-f   sleduyushchij parametr yavlyaetsya imenem Make-fajla. Po umol-
     chaniyu  ishchetsya  Makefile ili makefile. Esli imeyutsya oba,
     to vypolnyaetsya Makefile. V komandnoj stroke mozhno  uka-
     zat' neskol'ko klyuchej -f i parametrov.

-i   rezhim ignorirovaniya kodov zaversheniya komand  ne  ravnyh
     nulyu.  |kvivalentno direktive IGNORE.

-k   esli kod zaversheniya komandy ne raven  nulyu,  prekratit'
     vypolnenie tekushchego pravila i perejti k vypolneniyu dru-
     gih razdelov, ne zavisyashchih ot fajla-celi etogo pravila.

-n   vyvesti,  no  ne  vypolnyat'   stroki   dejstvij   Make-
     programmy.

-p   vyvesti polnuyu informaciyu o strukture Make-programmy.

-q   poluchit' informaciyu o neobhodimosti rekonstrukcii celi.
     Esli rekonstrukciya ukazannoj celi ne trebuetsya, vozvra-
     shchaetsya -1, inache 0.

-r   otmenyaet predopredelennuyu obrabotku  pravil  s  suffik-
     sami, predopredelennye makroperemennye i suffiksy.

-s   otmenit' vyvod vypolnyaemyh strok.  |kvivalentno  direk-
     tive SILENT.

-S   prervat' vypolnenie Make-programmy pri oshibochnom zaver-
     shenii kakoj-libo komandy.

-t   unichtozhit' slozhivshuyusya strukturu dinamicheskih  (zavisya-
     shchih ot vremeni) svyazej mezhdu fajlami.

10.  Avtomatizaciya programmirovaniya Make-programm

     Dlya sozdaniya novoj  Make-programmy  mozhno  imet'  fajl-
shablon,  dobavlyaya v nego neobhodimye stroki my poluchim goto-
vuyu k ispol'zovaniyu programmu.  Takoj princip  realizovan  v
programme mkmf.  Rassmotrim ee rabotu na primere. Pust' ime-
yutsya ishodnye fajly f.h, f1.c, f2.c i f3.c, iz kotoryh neob-
hodimo poluchit' fajl a.out:





                           - 38 -










     /*
     ** fajl f.h
     */
     # include       <stdio.h>
     # include       <ctype.h>
     # include       <time.h>

     /*
     ** fajl f1.c
     */
     # include       f.h

     main(ac, av)
     int ac;
     char **av;
     {
           f1(); f2(); f3();

     printf("Rezul'tat vypolneniya programmy example.\n");
     }
     f1(){
           return;
     }

     /*
     ** fajl f2.c
     */
     # include       f.h

     int f2(){
           return( a2());
     }
     # include       <stat.h>
     char *a2(){
          return;
     }

     /*
     ** fajl f3.c
     */
     # include       f.h

     int f3(){
            return( nn());
     }

     char *nn(){
            return;
     }

Pust' vse eti fajly razmeshcheny  v  odnom  kataloge.  Vypolnim
komandu  mkmf.   V  rezul'tate  ee  vypolneniya  budet sozdan
Makefile s programmoj sborki fajla a.out:


                           - 39 -










    DEST          = .

    EXTHDRS       = /usr/include/ctype.h \
                    /usr/include/stat.h  \
                    /usr/include/stdio.h \
                    /usr/include/time.h

    HDRS          = f.h

    LDFLAGS       =

    LIBS          =

    LINKER        = cc

    MAKEFILE      = Makefile

    OBJS          = f1.o f2.o f3.o

    PRINT         = pr

    PROGRAM       = a.out

    SRCS          = f1.c f2.c f3.c

    all:            $(PROGRAM)

    $(PROGRAM): $(OBJS) $(LIBS)
                @echo -n "Sborka $(PROGRAM) ..."
                @$(LINKER) $(LDFLAGS) $(OBJS) \
                           $(LIBS) -o $(PROGRAM)
                @echo "gotovo."

    clean:;     @rm -f $(OBJS)

    depend:;    @mkmf -f $(MAKEFILE) \
                PROGRAM=$(PROGRAM) DEST=$(DEST)

    index:;     @ctags -wx $(HDRS) $(SRCS)

    install:    $(PROGRAM)
                @echo Ustanovka $(PROGRAM) v $(DEST)
                @install -s $(PROGRAM) $(DEST)

    print:;     @$(PRINT) $(HDRS) $(SRCS)

    program:;   $(PROGRAM)

    tags:       $(HDRS) $(SRCS)
                @ctags $(HDRS) $(SRCS)

    update:     $(DEST)/$(PROGRAM)



                           - 40 -










    $(DEST)/$(PROGRAM): $(SRCS) $(LIBS) \
                        $(HDRS) $(EXTHDRS)
                @make -f $(MAKEFILE) \
                    DEST=$(DEST) install

    ###
    f1.o: f.h /usr/include/stdio.h \
              /usr/include/ctype.h \
              /usr/include/time.h

    f2.o: f.h /usr/include/stdio.h \
              /usr/include/ctype.h \
              /usr/include/time.h  \
              /usr/include/stat.h

    f3.o: f.h /usr/include/stdio.h \
              /usr/include/ctype.h \
              /usr/include/time.h

Programmoj mkmf v kachestve ishodnogo fajla-shablona ispol'zo-
van  standartnyj fajl /usr/new/lib/p.Makefile, no mozhno uka-
zat' dlya ispol'zovaniya i lyuboj drugoj.

     Programma  mkmf  rabotaet  sleduyushchim  obrazom:  snachala
vybirayutsya i vnosyatsya v fajl-shablon imena vseh ishodnyh faj-
lov rabochego kataloga, dalee opredelyaetsya ot kakih  include-
fajlov zavisyat ishodnye fajly, formiruyutsya pravila i zapisy-
vayutsya  v  fajl-shablon.  Dlya  oboznacheniya  ishodnyh   fajlov
ispol'zuyutsya pravila s suffiksami.

     Makefile mozhno redaktirovat', izmenyat' znacheniya  makro-
peremennyh.   Pri etom, esli povtorit' vyzov programmy mkmf,
v nem poyavyatsya tol'ko te izmeneniya, kotorye  neobhodimy  dlya
sborki s uchetom izmenenij v ishodnyh tekstah.

     V Makefile, poluchennom iz  standartnogo  fajla-shablona,
opredeleny sleduyushchie makroperemennye:

CFLAGS
     klyuchi Si-kompilyatora;

DEST
     katalog, v kotorom budet razmeshchen rezul'tat;

EXTHDRS
     perechen' polnyh imen include-fajlov;

HDRS
     perechen' imen  include-fajlov,  razmeshchennyh  v  rabochem
     kataloge;

LIBS
     spisok ob容ktnyh bibliotek dlya sborki programmy;


                           - 41 -










MAKEFILE
     imya fajla s Make-programmoj;

OBJS
     spisok ob容ktnyh fajlov,  uchastvuyushchih  v  sborke  prog-
     rammy;

PROGRAM
     imya programmy, kotoruyu neobhodimo poluchit';

SRCS
     spisok imen vseh fajlov s ishodnymi tekstami;


     Znacheniya  makroperemennyh  EXTHDRS,  HDRS,  OBJS,  SRCS
ustanavlivayutsya  programmoj  mkmf  i vsegda imeyut aktual'nye
znacheniya.  Ostal'nye makroperemennye poluchayut  pri  sozdanii
Makefile  znacheniya po umolchaniyu, ih mozhno izmenyat' po svoemu
usmotreniyu.

     Rassmotrim  pravila  Make-programmy,   kotoroye   mozhno
ispol'zovat' kak samostoyatel'nye vhody:

all
     translyaciya, sborka i zapusk  na  vypolnenie  poluchennoj
     programmy;

clean
     udalenie nenuzhnyh fajlov;

depend
     izmenenie struktury Make-programmy s uchetom  sushchestvuyu-
     shchego Makefile;

index
     pechat' indeksov funkcij sobiraemoj programmy;

install
     translyaciya, sborka i ustanovka  programmy  v  ukazannyj
     katalog;

print
     pechat' include-fajlov i tekstov programmy;

tags
     sozdanie fajla ./tags - ssylok programm, napisannyh  na
     yazykah Si, Paskal' i Fortran;

update
     izmenenie Makefile, peregeneraciya, sborka  i  ustanovka
     programmy  v  ukazannyj katalog.  S uchetom proizoshedshih
     izmenenij v tekstah  ishodnyh  fajlov  budet  vypolneno
     tol'ko to, chto neobhodimo v dannyj moment vremeni.


                           - 42 -










     Pust' imeyutsya fajly f[123].c, f.h i Makefile, zamenim v
nem  znachenie  makroperemennoj DEST na /usr/tmp i makropere-
mennoj PROGRAM - na example.  Vypolnim  sleduyushchuyu  komandnuyu
stroku:

    % make program install clean

    poluchim na ekrane soobshchenie

    cc  -c f1.c
    cc  -c f2.c
    cc  -c f3.c
    Sborka example ... gotovo.
    Rezul'tat vypolneniya programmy example
    Ustanovka example v /usr/tmp

Vypolnim komandnuyu stroku

     % make index

    poluchim imena funkcij i mesta ih opredelenij

     a2       5 f2.c      char *a2(){
     f1      11 f1.c      f1(){
     f2       2 f2.c      int f2(){
     f3       2 f3.c      int f3(){
     main     5 f1.c      main(ac, av)
     nn       6 f3.c      char *nn(){

Programma mkmf pozvolyaet sozdavat' Makefile dlya sborki  bib-
lioteki.      Dlya     etogo     ispol'zuetsya     fajl-shablon
/usr/new/lib/l.Makefile i dopolnitel'no vvodyatsya  makropere-
mennaya LIBRARY (imya biblioteki) i  pravila extract (izvleche-
nie iz biblioteki vseh  chastej  v  vide  otdel'nyh  fajlov),
library (translyaciya i zagruzka biblioteki).

     Programmist mozhet  otkazat'sya  ot  standartnyh  fajlov-
shablonov /usr/new/lib/[lp].Makefile i sozdat' svoi shablony v
rabochem  kataloge.   Fajly  shablony   dolzhny   imet'   imena
l.Makefile i p.Makefile.















                           - 43 -










LITERATURA

 1. "Banahan M., Ratter |. Vvedenie v  operacionnuyu  sistemu
    UNIX. - M.: Radio i svyaz', 1986." AI

 2. "Baurn S. Operacionnaya sistema UNIX.- M.: Mir, 1986." AN

 3. "Braun P. Vvedenie v operacionnuyu sistemu  UNIX.  -  M.:
    Mir, 1987." AM

 4. "Got'e R. Rukovodstvo po operacionnoj  sisteme  UNIX.  -
    M.: Finansy i statistika, 1985." AE

 5. "Dialogovaya edinaya mobil'naya operacionnaya sistema DEMOS.
    - Kalinin: CENTRPROGRAMMSISTEM, 1985." AK

 6. "Instrumental'naya mobil'naya operacionnaya sistema  INMOS/
    M.I.  Belyakov,  A.YU. Liverovskij, V.P. Semik i dr. - M.:
    Finansy i statistika, 1985." AH

 7. "Kernigan B., Ritchi D., F'yuer A.  YAzyk  programmirovaniya
    Si.  Zadachi  po  yazyku  Si.  - M.: Finansy i statistika,
    1985." AF

 8. "Kristian K. Vvedenie v operacionnuyu sistemu UNIX. - M.:
    Finansy i statistika, 1985." AJ

 9. "Henkok L., Kriger M.  Vvedenie  v  programmirovanie  na
    yazyke SI. - M.: Radio i svyaz', 1986." AG

10. "Aho A. V., Kernighan Brian V. W., Weinberger  Peter  J.
    AWK - a pattern scanning and processing language. Second
    edition. UNIX Programmers manual,  42  BSD,  1980.  Bell
    Laboratries: Murray Hill, New Jersey, 1978." AL

11. "Feldman S. I. Make - a program maitaining computer pro-
    gramms.  Bell  Laboratries:  Murray  Hill,  New  Jersey,
    1978." AB

12. "Joy W. N. An introduction the UNIX C-shell.  UNIX  Pro-
    grammers  manual, 42 BSD, 1980. Bell Laboratries: Murray
    Hill, New Jersey, 1978." AA

13. "Johnson S. C. YACC  -  yet  another  compiler-compiler.
    Comp.  Sci.  tech.  rep.  N 32. Bell Laboratries: Murray
    Hill, New Jersey, 1975." AD

14. "Lesk M. E. Lex - lexical analyzer generator. Comp. Sci.
    tech. rep. N 39. Bell Laboratries: Murray Hill, New Jer-
    sey, 1975." AC





                           - 44 -










                         SODERZHANIE



    ANNOTACIYA .........................................    2

1.  Vvedenie ..........................................    3

2.  Principy vypolneniya Make-programmy ................    4

3.  Soglasheniya yazyka Make .............................   10

4.  Ispol'zovanie makroperemennyh .....................   13

5.  Vypolnenie pravil v Make-programme ................   16

6.  Rezhimy vypolneniya Make-programmy ..................   18

7.  Pravila s suffiksami ..............................   21

8.  Upravlenie arhivom v Make-programme ...............   30

9.  Osobennosti programmirovaniya na yazyke Make ........   36

10. Avtomatizaciya programmirovaniya Make-programm ......   38

    LITERATURA ........................................   44




























                           - 45 -




Last-modified: Mon, 29 Jun 1998 14:13:47 GMT
Ocenite etot tekst: