GNU Makefile mit mehereren Ordnern



  • Hi zusammen,
    ich muss eine "gute" makefile schreiben für ein c-Programm mit folgender Ordnerstruktur:
    inv
    inv/src
    inv/bin
    inv/obj
    inv/inc

    Weiter unten befinden sich meine makefiles. Eigentlich sollte die makefile im inv Ordner die makefiles im bin/obj Ordner aufrufen. wenn ich jedoch make eintippe bekomme ich nur die Meldung, dass nichts zu tun ist.
    Danke schon mal!

    makefile in bin folder:

    vpath %.o ../obj/
    $(prog): $(objs)
    $(cc) $(ccflags) -o $@ $^ $(ldflags)
    

    makefile in obj folder:

    vpath %.c ../src
    vpath %.h ../inc
    all: $(objs)
    %.o: %.c %.h
    $(cc) $(ccflags) -c $<
    -include *.d
    

    general makefile:

    export prog := inv_svn
    export objs := $(patsubst %.c, %.o, $(wildcard src/*.c)))
    export src_dir := src
    export inc_dir := inc
    export obj_dir := obj
    export bin_dir := bin
    export cc := gcc
    export ccflags := -I $(PWD)/$(inc_dir) -MMD -g -Wall
    export ldflags := -lcurses -lgdbm
    
    test := ./$(prog)
    
    all: $(prog)
    $(prog): $(bin_dir)
    $(bin_dir): $(obj_dir)
    $(bin_dir):
    make -C $@
    $(obj_dir):
    make -C $@
    
    .PHONY: clean 
    
    clean: 
    rm -f $(obj_dir)/*.[od]$(prog)
    


  • Und was hat das alles mit C++ zu tun?



  • ich habe leider kein Unterforum für GNU Make gefunden...



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    all sollte phony sein, ebenso die ganzen anderen Ziele, deren Abhängigkeiten auf jeden Fall überprüft werden sollen (z.B. die Verzeichnisse). Sonst tritt nämlich genau das ein, was du beobachtest: Die Abhängigkeiten werden geprüft, sie existieren, daher wird nichts gemacht.



  • Ein rekursives make ist nicht so toll und man kann sich damit leicht ins Knie schießen. Ich würde wenn schon, dann auf automake setzen, das ist zwar rekursiv, aber kümmert sich darum, dass keine Abhängigkeiten vergessen werden.

    Ansonsten ist ein einziger make-Prozess vorzuziehen. Siehe auch http://aegis.sourceforge.net/auug97.pdf


  • Mod

    Tippgeber schrieb:

    Ein rekursives make ist nicht so toll und man kann sich damit leicht ins Knie schießen. Ich würde wenn schon, dann auf automake setzen, das ist zwar rekursiv, aber kümmert sich darum, dass keine Abhängigkeiten vergessen werden.

    Ansonsten ist ein einziger make-Prozess vorzuziehen. Siehe auch http://aegis.sourceforge.net/auug97.pdf

    Maßlos übertrieben. Der erste Satz in dem verlinkten Artikel schränkt korrekt ein: "...large projects..."

    Rekursives make ist bewährt bei unzähligen kleinen und mittleren Projekten und sogar bei den großen Projekten, die es benutzen, hört man kein großes Gejammer.



  • SeppJ schrieb:

    Tippgeber schrieb:

    Ein rekursives make ist nicht so toll und man kann sich damit leicht ins Knie schießen. Ich würde wenn schon, dann auf automake setzen, das ist zwar rekursiv, aber kümmert sich darum, dass keine Abhängigkeiten vergessen werden.

    Ansonsten ist ein einziger make-Prozess vorzuziehen. Siehe auch http://aegis.sourceforge.net/auug97.pdf

    Maßlos übertrieben. Der erste Satz in dem verlinkten Artikel schränkt korrekt ein: "...large projects..."

    Rekursives make ist bewährt bei unzähligen kleinen und mittleren Projekten und sogar bei den großen Projekten, die es benutzen, hört man kein großes Gejammer.

    Du hast wohl noch die das Glück gehabt stundenlang zu suchen warum ein Projekt plötzlich nicht mehr tut, nur weil die Bibliothek nicht neu gebaut und das Projekt nicht neu gelinkt wird, oder?

    Das passiert recht schnell mal. Selbst mit automake kann es einem mal passieren.

    Den Sinn verstehe ich aber nicht, gerade bei einem kleinen oder mittleren Projekt braucht man doch gar kein rekursives make. Da kann man ja alles in ein Makefile schreiben ohne die Übersicht zu verlieren.


Log in to reply