**Make** on tarkvaraarenduses kasutatav koosteprogramm.

Make koostab käivitatava programmi lähtetekstidest ja teekidest (ingl *build-management*). Juhised koostamiseks antakse ette Makefile'iga.

Ajalugu
-------

Make'i esimese versiooni lõi 1977. aasta aprillis Stuart Feldman, kes töötas Bell Labsis, kus arendati Unix operatsioonisüsteemi. Feldman sai 2003. aastal oma töö eest ACM'i tarkvara auhinna.

Feldmmanni inspiratsiooniks oli töökaaslasel tekkinud probleem koodist vigade kõrvaldamisel, sest käivitusfail oli kogemata jäänud muudatustega uuendamata:

> „Make sai alguse külastusega Steve Johnsoni (Yacc autor jne.) poolt, kes tormas mu kontorisse pühaviha täis, sest oli terve hommiku otsinud viga töökorras programmist (viga oli parandatud, fail ei olnud uuesti kompileeritud, \*.o oli seetõttu muutumata). Tänu sellele, et olin eelneva õhtupooliku , iseenda projekti kallal töötades, sattunud sama õuduse otsa, tekkis idee selle lahendamiseks. See sai alguse sõltuvusanalüsaatori ideest, mis taandus millegiks palju lihtsamaks ja kujunes Make'iks see nädalavahetus. Veel poolikute tööriistade kasutamine oli osa kultuurist. Makefailid olid tekstifailid, mitte maagiliselt kodeeritud binaarid, sest selline oli Unixi eetos: prinditav, silutav, arusaadav kraam."
> 
> 
>  – Stuart Feldman
> 
>

Makefile
--------

Make otsib praegusest kaustast makefile'i, näiteks GNU Make otsib faili nimega makefile, Makefile või GNUmakefile ja kutsub välja etteantud (või vaikimisi) sihtmärgi sellest failist.

Makefile'ide keel sarnaneb deklaratiivsele programmeerimisele. 

### Reeglid

Makefile koosneb reeglites. Iga reegel algab sõltuvusreast, mis defineerib ühe sihtmärgi (ingl *target*) või mitu, kuigi tavaliselt ainult üks. Sellele järgneb koolon (:) ja valikuliselt ka komponendid (fail või teised sihtmärgid), millest sihtmärk sõltub. Sihtmärk (vasakul pool koolonit) sõltub komponentidest (paremal pool koolonit). Tavaliselt kutsutakse komponente ka sihtmärgi eeldusteks (ingl *prerequisites*).

Igale sõltuvusreale võivad järgneda TAB taandega käskuread, mis kirjeldavad, kuidas komponentidest koostada sihtmärk. Kui Make tuvastab, et mõnes komponendis on uuemaid muudatusi kui sihtmärgis, siis käsud jooksutatakse.

```
sihtmärk [sihtmärk ...]: [komponent ...]
TAB [käsk 1]
	   .
	   .
	   .
TAB [käsk n]
```

Esimene käsk võib paikneda ka sõltuvusreal, kui ta on eraldatud semikooloniga (;),

```
sihtmärgid: komponendid ; käsk

```

näiteks makefile sisuga

```
hello: ; @echo "hello world"

```

väljastab

```
make hello
"hello world"

```

Iga järgnev käsurida peab algama TAB sümboliga, et Make seda käsuna kohtleks. See võib viia kasutajavigadeni, sest TAB ja tühikute rida näevad visuaalselt välja identsed, aga käsuna töötavad ainult TAB algusega read. Just see osa Make'i süntaksist on saanud kõige rohkem kriitikat. Eric Raymond kirjeldas seda kui "üks suurimaid disaini vusserdisi Unixi ajaloos".

> „Miks see TAB 1. veerus? Yacc oli uus, Lex oli uhiuus. Ma polnud kumbagi proovinud, nii et arvasin, et see oleks hea ettekääne õppimiseks. Pärast seda, kui olin oma Lexi esimese katsega nurka jooksnud, tegin reavahetuse TABiga midagi lihtsat. See töötas, see jäi. Ja paar nädalat hiljem oli mul umbes tosin kasutajat, enamik neist sõbrad, ja ma ei tahtnud oma vundamenti ära rikkuda. Ülejäänu on juba kahjuks ajalugu."
> 
> 
>  – Stuart Feldman
> 
>

Järeltulijad
------------

Make'i on ümberkirjutatud mitmeid kordi. Uued versioonid kasutavad reeglina sama failiformaati ja põhilisi algoritmide põhimõtteid, aga lisavad ka uusi ebastandardseid funktsioone. Näiteks:

* GNU Make (lühendatud *gmake*) on Make'i standardimplemetatsioon Linux ja macOSis. See on vajalik, et kasutada näiteks GNU Compiler Collection (GCC), Linux, Mozilla Firefox jpt.
* Microsoft nmake on käsureal tööriist, mis tuleb kaasa Visual Studioga. .

Viited
------

1. ↑  M. Douglas McIlroy (1987). A Research UNIX Reader: Annotated Excerpts from the Programmer's Manual, 1971-1986 , Bell Labs
2. ↑  Matthew Doar (2005). *Practical Development Environments* (inglise). O'Reilly Media. Lk 94. ISBN 978-0-596-00796-6.
3. 1 2 3  Eric S. Raymond 2003, Chapter 15. Tools "*make*: Automating Your Recipes". sfn viga: sihtkoht puudub: CITEREFEric\_S.\_Raymond2003 (spikker)
4. ↑  "GNU Make" (inglise). Vaadatud 16. aprill 2024.
5. ↑  Greg Kroah-Hartman (2006). *Linux Kernel in a Nutshell* (inglise). O'Reilly. Lk 5, 6. ISBN 0-59-610079-5.
6. ↑  "Netscape Portable Runtime (NSPR) build instructions" (inglise). Vaadatud 17. aprill 2024.
7. ↑  "NMAKE Reference" (inglise). Vaadatud 16. aprill 2024.

Kirjandus
---------

* Eric S. Raymond (2003). *The Art of Unix Programming* (inglise). Addison-Wesley. ISBN 0-13-142901-9.

Välislingid
-----------

* Makefile'i kasutamise õpetus