F3KL5


Make -- põhialused
******************

    Unix: sh vi regex make awk cc lint yacc lex net ..
    <tab>oskan kirjutada    $(NOVICE)
    <tab>is able to read    $(INTERMEDIATE)
    <tab>is able to fix     $(MASTER)
    <tab>is able to improve $(EMOTIONAL)

Tase 0. $NOVICE
---------------

make -- failide muutmise tööriist. Muutmise reeglid on kirjeldatud skript-failis nimega Makefile, mis peab asuma projekti põhikaustas.

Reegli kirjeldamine koosneb vastustest kolmele küsimusele -- teeme millest, teeme kuidas, saavutame mida?

  + Siht    -- mida_teeb antud reegel?
  + Koostis -- mida_on_vaja Sihi tabamiseks?
  + Käsud   -- kuidas_täita antud reeglit?

NB! Tabulatsiooni <tab> sümbolit ei tohi tühikutega asendada!
    Iga käsk algab <tab>'iga.

Reegli süntaks:

  <siht>: <koostis>
  	<käsk #1>
  	...
  	<käsk #n>

Selleks,et lühendada make-faili, make failide töötlemise programmi varustatakse lisaintellektiga. Võetakse kasutusele:

  + muutujad, nagu

  $(OBJS), $(SHELL), $(MAKE), $(CC), $(CFLAGS), $(INCLUDE), $(LDFLAGS)

  + automaatmuutujad järgmiste nimedega:

  $@ -- Sihi nimi
  $< -- koostise esimene komponent
  $^ -- koostise loetelu
  $%, $?, $+, $* -- võib minna vaja intensiivse make-failide kasutamise puhul.

  + .PHONY sihid (nagu all, clean,..)

    ++ Ei sõltu teistest sihtidest
    ++ Täidetakse igal korral, kui antud siht on eesmärgiks
       (näiteks, > make clean)

  Näide GNU make:

    # Default target executed when no arguments are given to make.
    default_target: all
    .PHONY : default_target

    # A target that is always out of date.
    cmake_force:
    .PHONY : cmake_force

    # The main clean target
    clean:
    <tab>cd /d D:\tmp && $(MAKE) -f CMakeFiles\Makefile2 tests/clean
    .PHONY : clean

  + Vaikimisi eesmärgi reegel (> make)

  Default goal is first rule that does not start with a period

Edasiminek on kiirem, kui osata lugeda ingliskeelset teksti.


Level 1. $(INTERMEDIATE)

  + using shell variables (unexport)
  + including other make files
  + recursion


Level 2. $(MASTER)

  + implicit rules:

    ++ multiple targets and rules
    ++ defaults
    ++ pattern rules
    ++ suffix rules
    ++ double-quote rules

  + archives


Level 3. $(GNU)

  + Other functionality:

    ++ conditionals
    ++ loops
    ++ functions
    .. (infinity)

Example. using $(MAKECMDGOALS) to remove the redundancy
         http://lastsummer.de/make-directories-recursively/

  .PHONY: $(SUBDIR) recurse
  $(MAKECMDGOALS) recurse: $(SUBDIR)
  $(SUBDIR):
          @exec $(MAKE) -C $@ $(MAKECMDGOALS)

------------------------------------------------------------------------

  Sources:

  [0]. https://www.cs.bu.edu/teaching/c/makefiles.html
  [1]. http://mrbook.org/blog/tutorials/make/
  [2]. http://stackoverflow.com/questions/5098798
           /could-someone-explain-this-make-file
  [3]. https://www.gnu.org/software/make/manual/make.txt

