# Linux Makefiles



## Daniel Toplak (7. März 2003)

Sorry für den Doppel-Post, aber ich versuche es mal im Linux-Forum, ob da jemand helfen kann.
Für weitere Infos ist hier der Orginal-Post:
http://www.tutorials.de/tutorials72794.html

Hier erst mal ne Beschreibung:
Ich bin gerade dabei ein Projekt von Windows auf Linux zu portieren, bzw. parallel zu entwickeln.
Angefangen hab ich unter Windows mit VC++ 6.0. Das Projekt (bzw. der Arbeitsbereich) besteht aus mehreren statischen Lib's die danach mit einer main.cpp zu einer .EXE zusammengelinkt werden. (unter Windows wie auch unter Linux).
So jetzt hab ich z.B. eine Ordnerstruktur die folgendermaßen aussieht:


```
source        
 |-- apps
   |--app1    darin liegt meine main.cpp 
 |-- libs
   |--lib1    darin liegen meine .cpp und .h zu der jeweiligen lib
   |--lib2
   |--lib3
   |--...
   |--libn
```
Jetzt ist es so, daß ja VC++ 6.0 in jedem ordner beim kompilieren einen Release oder Debug Ordner anlegt (je nach Konfigruation).

Genau den selben Effekt will ich unter Linux erziehlen in dem ich für jede lib ein makefile erstellt habe und für die Applikation auch das ich dann aufrufe. Außerdem gibt es noch ein Globales makefile das von allen includiert wird. Es enthält allgemeine Regeln. Die makefiles der libs werden in einer Schleife aus dem "Hauptmakefile" der Applikation aufgerufen.

Su komm ich nun zu dem eigentlichen Problem:
jedes mal wenn ich z.B. "make debug" aufrufe, dann wird immer alles neu erstellt. Also alle .o und .a, obwohl keine Datei sich geändert hat
Die Ordner Debug in denen die Ausgaben (.o und .a) erfolgen lass ich von meinem globalen makefile das von allen includiert wird anlegen.
Und zwar gibt es dort eine Regel:


```
# jede .o braucht die entspr. .cpp, mache einen ordner und 
# compilier die .cpp zur .o
%.o: %.cpp
	-mkdir -p $(BUILDDIR)
	$(CC) $(CFLAGS) $(LIBINCLUDE) $(SDLINCLUDE) $< -o $(WORKINGDIR)/$(BUILDDIR)/$(@F)
```

So ich hoffe, daß irgendjemand nur annähernd verstanden hat, was mein Problem ist.

Gruss Homer


----------

