2016-07-27 19 views
0

Ich habe mehrere Zeilen in Makefile, die .o und .d Dateien kompilieren und produzieren. Ich möchte zwei Sätze von .o.d produziert werden, so etwas wie:Benennen von O-Dateien mit Makefile und GCC

name.d 
name_hello.d 
name.o 
name_hello.o 

bereits gefunden, wie Namen von .d ändern "$(@:.o=_hello.d)" verwenden, aber haben keine wechselndem Erfolg .o Vielleicht muss ich mit [email protected] spielen, aber haben keine Ahnung, wie es zu tun.

Hier Datei Code Hersteller:

$(OBJECT_DIRECTORY)/%.o: %.c 
# Build header dependencies 
    $(CC) $(CFLAGS) $(INCLUDEPATHS) -M $< -MF "$(@:.o=.d)" -MT [email protected] 
    $(CC) $(CFLAGS) $(INCLUDEPATHS) -M $< -MF "$(@:.o=_hello.d)" -MT [email protected] 
# Do the actual compilation 
    $(CC) $(CFLAGS) $(INCLUDEPATHS) -c -o [email protected] $< 
    $(CC) $(CFLAGS) $(INCLUDEPATHS) -c -o [email protected] $< - this line i want to change 

Ich benutze arm-none-eabi-gcc.exe für Arm und make.exe


aktualisieren

scheint, dass separates Ziel mit Lösung als wechselnde Namen preffered wird. Also habe ich das Ziel dafür getrennt. Aber es wird nie benutzt. An anderer Stelle des Makefiles gibt es nächste Codezeile, die verwenden Compiler welche .o Dateien erzählt:

C_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILENAMES:.c=.o)) 

nehme ich an, dass ich es zu etwas ändern muß, wie:

C_OBJECTS_hello = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILENAMES:.c=*_hello.o)) 

Bitte sagen, wie zu modifizieren C_OBJECTS um Compiler Gebrauch zu machen *_hello.o Dateien


Update 2

Dies ist, wie C_OBJECTS verwendet, nehme ich an, irgendeine Art von Filter in C_OBJECTS erzählt CC (arm-none-eabi-gcc.exe), bestimmte .o Dateien zu verwenden. Und da *_hello.o Dateien nicht im Filter verwendet werden, werden sie auch nicht in ihrem Ziel erzeugt.

## Link C and assembler objects to an .out file 
$(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out: $(BUILD_DIRECTORIES) $(C_OBJECTS) $(ASSEMBLER_OBJECTS) $(LIBRARIES) 
    $(CC) $(LDFLAGS) $(C_OBJECTS) $(ASSEMBLER_OBJECTS) $(LIBRARIES) -o $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out 

Ich weiß, dass dies in Make-Hilfe geschrieben und ich es lese, aber immer noch nicht in der Lage, eine Antwort zu finden


Update 3

Hier ist, wie ich ‚C_OBJECTS geändert ', und scheint das funktioniert:

C_OBJECTS_hello = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILENAMES:.c=_hello.o)) 
+0

_aber haben keinen erfolg ändern '.o'_ - ändern es zu was? –

+0

Mein Ziel ist es, sowohl * .o und * _hello.o Dateien zu haben. –

+1

http://stackoverflow.com/a/7358961/412080 –

Antwort

1

Sie würden tatsächlich einen Ersatz verwenden. Die [email protected] Variable erweitert alle %.o Übereinstimmungen. Deshalb hatten Sie einen $(@:.o=.d) Ersatz; Sie benötigten eine .d Datei für jede %.o Übereinstimmung. In diesem Fall können Sie in der Tat einen $(@:.o=_hello.o) Ersatz verwenden. Beachten Sie, dass dies keine Abhängigkeit des Eingangs %.c ist; es ist eine sekundäre Ausgabe.

Die Alternative besteht darin, einen zweiten Ausgang $(OBJECT_DIRECTORY)/%.o $(OBJECT_DIRECTORY)/%_hello.o: %.c hinzuzufügen.In diesem Fall würden Sie nicht [email protected] verwenden, sondern $*, das ist die übereinstimmende %. Ihre beiden Abhängigkeitsdateien wären also $(OBJECT_DIRECTORY)/$*.d und $(OBJECT_DIRECTORY)/$*_hello.d

+0

Es ist nicht einmal eine _secondary_ Ausgabe, da make es überhaupt nicht bemerkt. –

+0

@MaximEgorushkin: Richtig, sollte es als eine Ausgabe aufgeführt haben. – MSalters

+0

Bitte schauen Sie, ich habe ein Update für das Thema gemacht. Hat das Ziel für das * _hello.o getrennt, aber das Ziel wird nie benutzt. –

1

Ihre Makefile-Regel erstellt mehr Dateien, als make bekannt ist. $(OBJECT_DIRECTORY)/%.o: %.c sagt, es baut ein .o von .c, während Sie möchten, dass es 4 Dateien erstellen.

Sie müssen make bewusst machen, welche Dateien ihre Regeln erzeugt, so dass es eine vollständige Abhängigkeitsgraphen aufbauen können:

$(OBJECT_DIRECTORY)/%.o $(OBJECT_DIRECTORY)/%.d: %.C# Compile and build dependencies. 
    $(CC) -c -o [email protected] $(CFLAGS) $(INCLUDEPATHS) -MD -MP $< 

$(OBJECT_DIRECTORY)/%_hello.o $(OBJECT_DIRECTORY)/%_hello.d: %.C# Compile and build dependencies. 
    $(CC) -c -o [email protected] $(CFLAGS) $(INCLUDEPATHS) -MD -MP $< 

Beachten Sie, dass diese Regeln explizit die .d Ausgabedatei nicht nennen, lassen den Compiler bestimmen es durch Ersetzen .o durch .d.

Jetzt haben Sie zwei Regeln anstelle von einem make kann ihre Ausführung parallelisieren, wenn -j Flag verwendet wird.

Beachten Sie, dass Sie aus den in https://stackoverflow.com/a/7358961/412080 angegebenen Gründen keine expliziten Regeln für automatisch generierte Abhängigkeiten benötigen sollten.

+0

Danke, das ist nützlich, ich habe zwei Ziele, die scheinen, zwei Sätze von Dateien zu produzieren, wie ich brauche. –