9. Program make
   Program make umozliwia dokonanie niezaleznej kompilacji programu. 
   Na podstawie informacji zawartych w pliku Makefile oraz daty modyfikacji 
   poszczegolnych plikow program make dokonuje ponownej kompilacji tylko 
   tych plikow, ktore zmienily sie od czasu utworzenia ostatniej wersji 
   programu. Uzyteczne opcje to:

  a) -d - wypisuje dodatkowe informacje o tym, co robi
  b) -f nazwa_pliku - uzywa wskazanego pliku zamiast Makefile
  c) -i - ignoruje bledy w poleceniach wykonywanych w celu wybudowania celow
  d) -j liczba_jobow - do kompilacji rownoleglej
  e) -n - wypisuje polecenia, jakie bylyby wykonane, ale ich nie wykonuje

   Wyczerpujacy opis programu make wraz z formatem Makefile znajda Panstwo
   w info make. Nie jest konieczne opanowanie wszystkich mozliwosci 
   programu. Ponizej wymieniamy te elementy, ktore bedziemy wykorzystywac
   w dalszym ciagu zajec.

10. Pliki Makefile
  Proste pliki Makefile zawieraja jedynie zestaw regul.
  Kazda regula jest postaci
  <cel>: <lista zaleznosci>
  <w nowym wierszu znak tabulacji> <polecenie>
  
 a) Cele moga byc nazwami plikow, ale niekoniecznie (jak w przykladowym
    Makefile-u). Cele bedace nazwami plikow moga zawierac znaki uogolniajace
    (gwiazdki i znaki zapytania, rozwijane normalnie jak w shellu). Takoz
    znaki uogolniajace moga wystepowac w zaleznosciach.  Uwaga: znaki
    specjalne nie sa rozwijane przy definiowaniu zmiennej, a dopiero przy jej
     uzyciu.

 b) lista zaleznosci to oddzielona spacjami lista nazw plikow, ktorych 
    zmiana ma spowodowac ponowne wybudowanie celu.
 
 c) polecenie to polecenie interpretatora uzywane do utworzenia celu. 
    Zwroc uwage, ze wiersz z poleceniem zaczyna sie od znaku tabulacji!

 d) Jako domyslny budowany jest cel, zdefiniowany w pierwszej zawartej w
    pliku regule. Mozna jednak wywolujac program make podac nazwe celu,
    na przyklad make clean, patrz nizej

 e) Przykladowa regula:
    err.o: err.c err.h
	gcc -Wall -c err.c
    
    powoduje utworzenie pliku err.o o ile zmianie ulegly pliki err.c 
    lub err.h za pomoca odpowiedniego wywolania kompilatora.
    Spowoduje to oczywiscie zmiane pliku err.o i uaktywnienie kolejnych
    regul, w ktorych plik err.o wystepuje na liscie zaleznosci.

    Regula:
    clean:
        rm -f *.o copy
    nie ma zaleznosci. Powoduje usuniecie wskazanych plikow. 
    Poniewaz brak jest zaleznosci jedynym sposobem jej uaktywnienia jest
    jawne podanie nazwy celu w wywolaniu programu make.
* Przeanalizuj przykladowy plik Makefile1. Zmien jego nazwe na 
  Makefile. Wykonaj 
    make clean, a nastepnie make. 
  Co stanie sie jesli jeszcze raz wywolasz make?
  Sprobuj wprowadzic jaka zmiane do programu copy. Wykonaj jeszcze raz
  make. Co sie stalo?

 f) Znak # rozpoczyna komentarz (do konca wiersza). 
   
 g) W Makefile moga wystapic definicje zmiennych. Dzieki nim mozna uzyskac
  bardziej eleganckie Makefile. 
  Definicja zmiennej ma postac nazwa = wartosc. potem uzywa sie tych zmiennych
  jak zmiennych interpretera polecen, poprzedzajac znakiem dolara.
  Wartosci zmiennych moga byc takze pobierane ze srodowiska, ale definicje w 
  pliku Makefile sa wazniejsze.
     
* Przeanalizuj plik Makefile2. Skopiuj go do pliku Makefile i wykonaj
  make clean; make
  (zamiast kopiowac mozna uzyc opcji -f, np: make clean -f Makefile2)
 
 h) W pliku Makefile moga wystapic takze zmienne specjalne. Sa po to, 
   zeby nie trzeba bylo powtarzac identycznych definicji w
   odniesieniu do wielu plikow. Oto niektore zmienne specjalne:
   * $@ oznacza nazwe celu danej reguly;
   * $< to nazwa pierwszego celu, od ktorego cel danej reguly zalezy;
   * $? lista nazw wszystkich celow, od ktorych cel w danej regule zalezy, a
        ktore sa nowsze, niz cel reguly;
   * $^ lista nazw wszystkich celow, od ktorych cel w danej regule zalezy;
   * $* nazwa celu z usunietym rozszerzeniem (o ile jest ono powszechnie
        znane; np. .c .cpp .h .cc .C .o sa powszechnie znane);
 i) w celu zdefiniowania reguly domyslnej uzywa sie reguly, w ktorej w nazwie
   celu (jako i w zaleznosciach, o ile to potrzebne) wystepuje znak %
   (dokladnie raz w kazdej nazwie); reguly takie sa stosowane w przypadku,
   gdy zadna jawna regula nie pasuje do danego, konkretnego celu, ktory
   trzeba wybudowac;

   * Przeanalizuj plik Makefile3. Przetestuj jego dzialanie.