Jan Vlášek: MAKE
Predchozi (Obsah) Dalsi

8. Vysvětlující příklady

V této kapitole budou uvedeny příklady, které snad pomohou osvětlit princip některých přepínačů make a jiných jeho náležitostí.

8.1. Pokusy s přepínači

Pro vyzkoušení činnosti make jsem zvolil co možná nejjednodušší příklad. Skládá se ze dvou souborů. První (prvni.c) obsahuje funkci main() a využívá funkci tiskni() z druhého souboru (druhy.c). Definice této funkce je uvedena v hlavičkovém souboru defin.h. Obsahy těchto souborů se při testování budou měnit dle situace. Ve všech příkladech make ještě neexistují .o soubory.

  • prvni.c

    #include "defin.h"

    void main(void)
    {
    int i=8; /* nepotrebne */

    tiskni("ahoj");
    tiskni("nazdar");
    }
  • druhy.c

    #include
    #include "defin.h"

    void tiskni (char *ret)
    {
    printf("%s\n", ret);
    }
  • defin.h

    extern void tiskni (char *ret);

Soubor makefile pro výše uvedené soubory bude také velice jednoduchý:


progr: prvni.o druhy.o
cc -o progr prvni.o druhy.o

prvni.o: prvni.c defin.h
cc -c prvni.c

druhy.o: druhy.c defin.h
cc -c druhy.c

Poznámka:
Řádku s popisem závislostí cílu progr lze zapsat též jako

cc -o prvni.o druhy.o $@

Pokud nyní spustíme make, vytvoří se přímo spustitelný soubor progr. Pokud si však budeme chtít prohlédnout ladící informace, spustíme make s parametrem -d a výpis bude vypadat zhruba takto:


eryx2.zcu.cz> make -d
MAKE ENTRY (make -d) at Thu Apr 22 09:53:01 1999
Reading internal rules.
MAKEDIR=/
Current working directory for make is
/afs/zcu.cz/users/j/jvlasek/home
doname(progr, 0)
doname(prvni.o, 1)
doname(prvni.c, 2)
Looking for Single suffix rule.
TIME1(prvni.c)=Apr 21 20:38:34 1999
TIME1(prvni.c)=Wed Apr 21 20:38:34 1999
doname(defin.h, 2)
Looking for Single suffix rule.
TIME1(defin.h)=Apr 21 20:37:53 1999
TIME1(defin.h)=Wed Apr 21 20:37:53 1999
doname(prvni.c, 2)
TIME1(prvni.c)=Apr 21 20:38:34 1999
TIME3(prvni.o)=Thu Apr 22 09:49:25 1999
TIME1(prvni.o)=Apr 22 09:49:25 1999
TIME1(prvni.o)=Thu Apr 22 09:49:25 1999
doname(druhy.o, 1)
doname(druhy.c, 2)
Looking for Single suffix rule.
TIME1(druhy.c)=Apr 21 20:38:46 1999
TIME1(druhy.c)=Wed Apr 21 20:38:46 1999
doname(defin.h, 2)
TIME1(defin.h)=Apr 21 20:37:53 1999
TIME1(defin.h)=Wed Apr 21 20:37:53 1999
doname(druhy.c, 2)
TIME1(druhy.c)=Apr 21 20:38:46 1999
TIME3(druhy.o)=Thu Apr 22 09:49:26 1999
TIME1(druhy.o)=Apr 22 09:49:26 1999
TIME1(druhy.o)=Thu Apr 22 09:49:26 1999
cc -o progr prvni.o druhy.o
TIME1(progr)=Apr 22 09:53:01 1999
MAKE EXIT (0) at Thu Apr 22 09:53:01 1999

Nyní vložíme do souboru prvni.c záměrnou chybu, a to do volání funkce tiskni().


eryx2.zcu.cz> make
cc -c prvni.c
cc: Error: prvni.c, line 7: An unexpected newline
character is present in a string literal.
tiskni(ahoj");
-------------^
*** Exit 1
Stop.

Pokud ale spustíme make s přepínačem -i (nebo použijeme speciálního jména .IGNORE), budou chyby ignorovány a soubory na těchto chybách nezávislé budou přeloženy či sestaveny (v tomto případě druhy.o).


eryx2.zcu.cz> make -i
cc -c prvni.c
cc: Error: prvni.c, line 7: An unexpected newline
character is present in a string literal.
tiskni(ahoj");
-------------^
*** Exit 1 (ignored)
cc -c druhy.c
cc -o progr prvni.o druhy.o
ld:
Can't open: prvni.o (No such file or directory)
*** Exit 1 (ignored)

Chybu opět opravíme a vyzkoušíme jak funguje make v módu neproveditelnosti.


eryx2.zcu.cz> make -n
cc -c prvni.c
cc -c druhy.c
cc -o progr prvni.o druhy.o

Jak je patrno, make vypíše jednotlivé příkazy definující cíle, ale neprovede je.

Dále je uvedeno, jak make zachází s parametrem -r, který říká: "nepoužívej vestavěná pravidla". A abychom mohli porovnat rozdíly, jsou vypsány i ladící informace.


eryx2.zcu.cz> make -r -d
No suffix list.
MAKE ENTRY (make -r -d) at Mon Apr 26 19:06:05 1999
MAKEDIR=/
Current working directory for make is
/afs/zcu.cz/users/j/jvlasek/home
doname(progr, 0)
doname(prvni.o, 1)
doname(prvni.c, 2)
Looking for Single suffix rule.
TIME1(prvni.c)=Apr 22 11:51:13 1999
TIME1(prvni.c)=Thu Apr 22 11:51:13 1999
doname(defin.h, 2)
Looking for Single suffix rule.
TIME1(defin.h)=Apr 21 20:37:53 1999
TIME1(defin.h)=Wed Apr 21 20:37:53 1999
TIME1(prvni.o)=Apr 26 19:06:05 1999
TIME1(prvni.o)=Mon Apr 26 19:06:05 1999
doname(druhy.o, 1)
doname(druhy.c, 2)
Looking for Single suffix rule.
TIME1(druhy.c)=Apr 21 20:38:46 1999
TIME1(druhy.c)=Wed Apr 21 20:38:46 1999
doname(defin.h, 2)
TIME1(defin.h)=Apr 21 20:37:53 1999
TIME1(defin.h)=Wed Apr 21 20:37:53 1999
TIME1(druhy.o)=Apr 26 19:06:05 1999
TIME1(druhy.o)=Mon Apr 26 19:06:05 1999
TIME1(progr)=Apr 26 19:06:05 1999
MAKE EXIT (0) at Mon Apr 26 19:06:05 1999

8.2. Větší makefile soubory

Následující ukázka souboru makefile obsahuje klasické prvky. Naleznete v ní především různé definice maker, po nichž následují i definice cílů. Uvedený příklad naznačuje, jak je sestaven konfigurační soubor.


# Generated automatically from Makefile.in by configure.
CC = gcc
LIBS = libaa.a -lslang -L/usr/X11R6/lib -lX11 -lgpm -lm
LFLAGS =
CFLAGS = -m486 -O2 -m486 -fstrength-reduce -ffast-math \
-fomit-frame-pointer \
-I/usr/X11R6/include -I/usr/include/slang
prefix= /usr/local
exec_prefix= ${prefix}
datadir= ${prefix}/share
bindir= ${exec_prefix}/bin
libdir= ${exec_prefix}/lib
includedir= ${prefix}/include
mandir= ${prefix}/man
infodir= ${prefix}/info

INCL = config.h

OBJS = aafont.o aafonts.o aamktabl.o aamem.o \
aahelp.o aaslnkbd.o aaslang.o aafastre.o \
aalinux.o aax.o aaxkbd.o aaxmouse.o \
fontgl.o font16.o font14.o fontx16.o \
fontx13.o fontx13b.o fontcour.o aarec.o \
font9.o font8.o fontline.o aacurses.o \
aacurkbd.o aacurmou.o aalib.o aaflush.o \
aarender.o aaout.o aastderr.o aain.o \
aaedit.o aaregist.o aakbdreg.o aagpm.o \
aamoureg.o aasave.o aastdout.o aastdin.o \
aaparse.o

#config.h:
#cp config.autoconf config.h

all: libaa.a aatest fire savefont info

libaa.a: $(OBJS)
#$(CC) $(CFLAGS) $(LFLAGS) -o aview $(OBJS) $(LIBS)
rm -f libaa.a
ar rcs libaa.a $(OBJS)
ranlib libaa.a
aatest: aatest.o libaa.a
$(CC) $(CFLAGS) $(LFLAGS) -o aatest aatest.o \
$(LIBS)
fire: fire.o libaa.a
$(CC) $(CFLAGS) $(LFLAGS) -o fire fire.o $(LIBS)
savefont: savefont.o libaa.a
$(CC) $(CFLAGS) $(LFLAGS) -o savefont savefont.o \
$(LIBS)
info: info.o libaa.a
$(CC) $(CFLAGS) $(LFLAGS) -o info info.o $(LIBS)

install: libaa.a
/usr/bin/install -c -d $(libdir)
/usr/bin/install -c -d $(includedir)
/usr/bin/install -c -d $(infodir)
/usr/bin/install -c -m 444 libaa.a $(libdir)
/usr/bin/install -c -m 444 aalib.h $(includedir)
/usr/bin/install -c -m 444 doc/aalib.info \
$(infodir)

clean:
rm -f libaa.a aatest fire info savefont
rm -f core `find . -name '*.[oas]' -print`
rm -f core `find . -name '*~' -print`
rm -f core `find . -type f -name 'core' -print`

distclean:clean
rm config.h config.log config.status
rm config.cache makefile

#dep:
# rm -f .depend
# make .depend
#
#.depend:
# echo '# Program dependencies' >.depend
# gcc -I svgalib $(DEFINES) -MM \
# $(patsubst %.o,%.c,$(OBJS)) >>.depend
#include .depend


Predchozi
Converted by Selathco 0.85 on 15.06.1999 11:08
Dalsi