rekursives make



  • Hallo,

    Wie erstelle ich ein makefile welches die Quellverzeichnisse rekursiv durchläuft, die entsprechenden .o Dateien erzeugt und anschließend diese zu einer .so zusammenfasst? Die entsprechenden Aufrufe des gcc bekomme ich ja hin, nur eben das rekursive durchlaufen bekomm ich irgendwie nicht gebacken, bzw. ich hab nicht die richtige Idee dazu.

    Momentan wollte ich in jedem Unterverzeichnis ein entsprechendes makefile ablegen, welches die .o Dateien erstellt und auf die Wurzel packt. Damit es aber nicht zu Namensüberschreitungen kommt müssten die Dateien entsprechend der Verzeichnisse aus denen sie stammen benannt werden. Wenn das aber so umständlich ist, dann schreibe ich mir gleich selber ein Tool welches dies kann 😞



  • Warum willst du die Objektdateien in das Wurzelverzeichnis schieben? Es ist doch üblich die Objektdateien an Ort und Stelle zu belassen.



  • Ja nur wie baue ich dann aus der verschiedenen Verzeichnissen eine .so zusammen. Dazu müsste ich doch alle Pfade/.o-Dateien angeben?

    Oder sehe ich das falsch? Wenn ich folgende Verzeichnisse habe: root/a, root/b, root/a/a, ...
    Wie sieht dann, der entsprechende Befehl aus der automatisch die Verzeichnisse ermittelt und diese zu einer .so zusammenlinkt?



  • Du kannst beim linken ja die Pfade angeben:

    gcc -shared -fPIC -DPIC blub/a.o moep/b.o -o libab.so
    

    ansonsten ist es natürlich kein Problem den Namen des Pfades in den Objektnamen zu verwandeln

    %.o: %.cpp
      $(CXX) $(CXXFLAGS) -c $< -o "`pwd | sed 's/\//_/g'`$@"
    


  • Genau an diesem Punkt bleibe ich ja bei meinem Problem hängen. Etweder ich verwende

    gcc -shared -fPIC -DPIC blub/a.o moep/b.o -o libab.so
    

    und muß damit leben jede Datei einzeln anzugeben, was ein nicht unerheblicher Aufwand ist. Oder ich verwende die Namensersetzung und die .o Dateien befinden sich eben nicht bei den Sourcen.

    Gibt es da eine Möglichkeit die Vorteile beider Varianten zu nutzen?



  • tobain schrieb:

    Gibt es da eine Möglichkeit die Vorteile beider Varianten zu nutzen?

    Hast Du denn Deine Sourcen in so schrecklich viele Unter-Verzeichnisse aufgesplittet?



  • Das beste wäre nichtrekursives make...

    DIRS := bla blub foo
    bla_SOURCES := test.bla.c
    blub_SOURCES := test.blub.c
    foo_SOURCES := test.foo.c
    
    LIB=foo.bla.blub.so
    
    SRCS=$(foreach dir, $(DIRS), $(foreach src, $($(dir)_SOURCES), $(dir)/$(src)))
    OBJS=$(subst .c,.o,$(SRCS))
    
    $(LIB): $(OBJS)
            gcc -shared -fPIC -DPIC -o $(LIB) $(OBJS)
    
    all: $(LIB)
            @echo $(SRCS)
            @echo $(OBJS)
    
    define OBJ_TEMPL
    $(1): $(subst .o,.c,$(1))
            gcc -c -shared -fPIC -DPIC -o $(1) $(subst .o,.c,$(1))
    endef
    
    $(foreach obj,$(OBJS),$(eval $(call OBJ_TEMPL,$(obj))))
    
    clean:
            rm -f $(OBJS) $(LIB)
    

Anmelden zum Antworten