linux-l: Makefile hilfe, Bounding box...

gunni at mathematik.hu-berlin.de gunni at mathematik.hu-berlin.de
Di Jan 30 18:20:47 CET 2001



On Tue, 30 Jan 2001, Carsten Wartmann wrote:

> gunni at mathematik.hu-berlin.de writes:
>  > Hi Carsten,
>  > 
>  > > Nahe drann! ;-) Leider müssen dazu ja die *.gif im images/ Verzeichnis 
>  > > existieren.... Nicht so schön.
>  > > 
>  > Ich würde folgendes machen:
>  > 
>  > all_gifs:
>  > 	make `echo *.tga | sed -e 's/\.tga\>/\.gif/g'`
> 
> Hmmm, warum nicht....
> 
> Naja, damit werden wieder alle GIFs immer gemacht... oder?
> 
Nein,

das haengt davon ab, wie die entsprechende Make-Regel zum Erzeugen
der gif-Files aussieht.

Wenn make merkt, dass das Ziel neuer ist, als die Quellen, wird
das Ziel nicht neu erzeugt, d.h. make wird aufgerufen, aber convert 
nicht.

Darüber hatten andere schon geschrieben.

>  > P.S.
>  > 
>  > Gibt es bei make eine Option, mit der alle möglichen Ziele erzeugt
>  > werden, das würde hier helfen, habe ich aber nicht gefunden.
>  > (Ist wahrscheinlich auch nicht so trivial, in komplizierten Fällen)
> 
> Was ich nicht verstehe ist: Wenn ich *.c habe wird daraus auch *.o
> ohne dass ich erst die *.o machen muss...
> 

siehe unten

> Ich schaue jetzt mal, ob ich nicht was mit "normaler" bash machen kann 
> so a la:
> 
> for alle dateien in verzeichnis:
> 	if filedate(basename.tga) > filedate(basename.gif):
> 		convert basename.tga basename.gif

Das macht ja make!

Wenn Du eingibst:

  make test.o

und es existiert

  test.c

, dann:

 - testet make, ob test.o schon existiert.
 - wenn es nicht existiert, wird test.o aus test.c erzeugt, fertig.
 - wenn es existiert, wird verglichen, in welches File zuletzt
   geschrieben wurde.
 - ist test.c neuer, wird test.o aus test.c generiert, fertig.
 - ist test.o neuer, wird nichts gemacht, fertig.

Bleibt die Frage, wie test.o erzeugt wird.

Dazu gibt es implizite Regeln, die angeben, wie eine .c-Datei aus
einer .o-Datei gemacht wird. Die ist bei make schon mitgeliefert,
da das überall gebraucht wird. So sieht das bei mir aus:

CC=cc
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
OUTPUT_OPTION = -o $@

%.o: %.c
#  commands to execute (built-in):
        $(COMPILE.c) $(OUTPUT_OPTION) $<

Die übrigen Variablen sind nicht definiert, können aber (glabe ich !!!)
in eigenen Makefiles überschrieben werden, um Einfluß zu nehmen, ohne
die implizite Regel anzutasten, denn die könnte von System zu System
leicht unterschiedlich sein.


Die gesamte Datenbasis gibts mit

make -p





Mehr Informationen über die Mailingliste linux-l