[Help] makefile schreiben!



  • Hallo zusammen,

    Ich bin gerade an einer Aufgabe dran die sich mit makefiles beschäftigt (stammt aus einem Buch leider ohne Lösung) und das "Wissen" das ich mir darüber angelesen habe lässt mich nicht verstehen wie das ganze aufgebaut werden muss, habe mir auch schon bei gnu.org die manuals zu make durchgelesen, aber ich blick da nicht durch.
    Hoffe ihr könnt mir bei folgender Aufgabe weiterhelfen:

    Ihr cpp-Projekt enthält folgende SourceFiles mit entsprechenden Abhängigkeiten:
    a.cpp -> a.h -> b.h -> c.h
    b.cpp -> b.h
    c.cpp -> c.h ->b.h

    Schreiben Sie für diese Projekt ein makefile, das folgende Funktionalitäten übernimmt:

    make all -> compilieren, linken zur Applikation testabc.exe,installieren der testabc.exe in /usr/bin

    make build -> compilieren und linken zur Applikation testabc.exe

    make install -> installieren der testabc.exe in /usr/bin

    make clean -> entfernen aller ObjectFiles und der testabc.exe

    Leider find ich nirgends Beispiele an denen ich mich orientieren könnte, deshalb wär ich sehr dankbar, wenn jmd. mir bei der Erstellung helfen würde.

    Vielen Dank schonmal!!!



  • Hier, sollte dir einen Ansatz geben.
    http://www.emba.uvm.edu/~snapp/make.html





  • svenb schrieb:

    Ihr cpp-Projekt enthält folgende SourceFiles mit entsprechenden Abhängigkeiten:
    a.cpp -> a.h -> b.h -> c.h

    ok. die schreiben wir mal als regel in das makefile. wobei ich annehme, daß eigentlich nur gemeint ist, daß a.cpp diese drei headers inkludiert.

    a.o:   a.cpp a.h b.h c.h
    

    das bedeutet jetzt: wenn sich a.h oder b.h oder c.h oder a.cpp geändert haben, dann muß die a.o neugemacht werden. und sie muß auch gemacht werden, wenn es sie noch gar nicht gab.

    [/quote]
    b.cpp -> b.h
    c.cpp -> c.h ->b.h[/quote]

    b.o: b.cpp b.h
    c.o: c.cpp c.h b.h

    [quote]Schreiben Sie für diese Projekt ein makefile, das folgende Funktionalitäten übernimmt:
    ...

    a.o:   a.cpp a.h b.h c.h
    
    b.o:   b.cpp b.h
    
    c.o:   c.cpp c.h b.h
    
    testabc.exe:  a.o b.o c.o
    
    all: testabc.exe install
    
    install: testabc.exe
         cp testabc.exe /usr/bin/
    
    clean:
         rm *.o testabc.exe
    

    nach der install-regel steht noch ne zeile. so sieht allgemein eine regel aus. in der ersten zeile vor dem doppelpunkt, was das ergebnis ist und nach dem doppelpunkt, was die eingangsdaten sind. in den folgenden zeilen, die je mit einem tab anfangen MÜSSEN, stehen die befehle, die dazu notwendig sind.
    manche befehle braucht man nicht anzugeben, wie die von *.cpp nach *.o, weil sie in make eingebaut sind. kannst sie aber auch gerne aneben.

    a.o:   a.cpp a.h b.h c.h
        g++ a.cpp -o a.o
    
    b.o:   b.cpp b.h
        g++ b.cpp -o b.o
    
    c.o:   c.cpp c.h b.h
        g++ c.cpp -o c.o
    
    testabc.exe:  a.o b.o c.o
    
    all: testabc.exe install
    
    install: testabc.exe
         cp testabc.exe /usr/bin/
    
    clean:
         rm *.o testabc.exe
    

    besser sind aber makefiles, die sowas alles ganz automatisch machen, weil man dann nich immer am makefile anpassungen machen muss, wenn man am sourcecode was ändert. ich verwende zur zeit auf win und linux das hier:

    # Volkards universal makefile
    # (c) 1999-2005 volkard@normannia.de
    # feel free to use it in any ways.
    
    #CXXFLAGS:=-Wall -Werror -march=i586 -O3 -fno-rtti -pipe -s -DUNITTEST
    CXXFLAGS:=-Wall -Werror -march=i586 -O3 -fno-rtti -pipe -s -DNDEBUG
    
    PROJECT:=$(basename $(notdir $(CURDIR)))
    TARGET_EXT:=
    ifeq ($(OS),Windows_NT)
     TARGET_EXT:=.exe
    endif
    TARGET:=$(PROJECT)$(TARGET_EXT)
    
    zip:=$(PROJECT).rar
    headers:=$(wildcard *.h)
    sources:=$(wildcard *.cpp)
    missingSources:=$(filter-out $(sources),$(headers:.h=.cpp))
    objects:=$(sources:.cpp=.o)
    deps:=$(sources:.cpp=.d) $(missingSources:.cpp=.d)
    
    all:	$(missingSources) $(TARGET)
    
    ifneq ($(MAKECMDGOALS),clean)
    -include $(deps)
    endif
    
    .PHONY:	all clean run zip create
    
    $(TARGET):	$(deps) $(objects)
    	$(CXX) $(CXXFLAGS) -o $(TARGET) $(objects)
    
    %.o %.d:	%.cpp
    	$(CXX) $(CXXFLAGS) -MMD -c $<
    
    $(missingSources):	%.cpp:	%.h
    	echo #include "$<" > $@
    
    clean:
    	-$(RM) $(TARGET) $(objects) $(deps)
    
    run:	$(TARGET)
    	./$(TARGET)
    
    zip:
    	-$(RM) $(zip)
    	rar a -r -s -m5 -ap$(PROJECT) $(zip) *.cpp *.h makefile
    


  • Vielen Dank!!!

    Wo genau kommen denn die file namen hin? also a.cpp b.cpp usw.und deren Abhängigkeiten?

    ich hab hier leider nur makefiles die mit Dev-Cpp für Windows erstellt wurden, soll aber für Linux laufen.
    Desweiteren hab ich noch solche makefiles:

    all: Fahrzeugverwaltung.exe
    
    Fahrzeugverwaltung.exe: Fuhrpark.o Fahrzeuge.o LKW.o PKW.o main.o Fahrzeugverwaltung.o Menu/Menu.o Menu/MenuItem.o CallbackFahrzeugver.o
    	g++ -pedantic -Wall -o Fahrzeugverwaltung.exe Fuhrpark.o Fahrzeuge.o LKW.o PKW.o main.o Fahrzeugverwaltung.o Menu/Menu.o Menu/MenuItem.o CallbackFahrzeugver.o
    
    Fuhrpark.o: Fuhrpark.cpp Fuhrpark.h Fahrzeuge.h LKW.h PKW.h
    	g++ -pedantic -Wall -c Fuhrpark.cpp
    
    CallbackFahrzeugver.o: CallbackFahrzeugver.cpp CallbackFahrzeugver.h Menu/MenuReturn.h Fahrzeuge.h LKW.h PKW.cpp Fuhrpark.h
    	g++ -pedantic -Wall -c CallbackFahrzeugver.cpp
    
    Fahrzeuge.o: Fahrzeuge.cpp Fahrzeuge.h
    	g++ -pedantic -Wall -c Fahrzeuge.cpp
    
    main.o: main.cpp Fahrzeugverwaltung.h Menu/Menu.h Menu/MenuReturn.h
    	g++ -pedantic -Wall -c main.cpp
    
    LKW.o: LKW.cpp LKW.h Fahrzeuge.h
    	g++ -pedantic -Wall -c LKW.cpp
    
    PKW.o: PKW.cpp PKW.h Fahrzeuge.h
    	g++ -pedantic -Wall -c PKW.cpp
    
    Menu.o: Menu/Menu.cpp Menu/Menu.h
    	g++ -pedantic -Wall -c Menu/Menu.cpp
    
    MenuItem.o: Menu/MenuItem.cpp Menu/MenuItem.h
    	g++ -pedantic -Wall -c Menu/MenuItem.cpp
    
    Fahrzeugverwaltung.o: Fahrzeugverwaltung.cpp Fahrzeugverwaltung.h Menu/MenuItem.h Menu/Menu.h Menu/MenuReturn.h Fuhrpark.h CallbackFahrzeugver.h
    	g++ -pedantic -Wall -c Fahrzeugverwaltung.cpp
    
    clear:
    	rm *.o
    	rm Menu/*.o
    	rm Fahrzeugverwaltung.exe
    

    Sieht aber nicht wirklich professionell wie die Volkards Version aus, deshalb hoffe ich auf Hilfe wo die ganzen Sachen hinkommen.

    Danke nochmal!!!


Anmelden zum Antworten