2016-10-07 2 views
0

Ich habe ein Makefile mit diesen Regeln.Makefile Überspringe eine Regel, obwohl der Dateityp existiert

all: $(TARGET) 
OBJECTS = file.o 
    %.o: %.c 
    $(COMPILER) -c $(FLAGS) &< -o C_$(basename [email protected]).o 
    %.o: %.s 
    $(COMPILER) -c $(FLAGS) &< -o S_$(basename [email protected]).o 
... The Linker is then called with *.o to link all the object files 

Ich habe den gleichen Dateinamen file.c und file.s in einem src-Verzeichnis. Aber make führt nur die erste Regel für die Objektdatei aus. Warum kompiliert es nur einmal? Und wie kann ich make machen, um sowohl file.c als auch file.s zu kompilieren, wenn sie in meinem src-Ordner existieren?

Ich möchte nicht einen anderen Objekt Dateinamen für eine andere Erweiterung erstellen müssen. Das wäre albern.

Gibt es eine Möglichkeit für mich, den Dateinamen mit der Erweiterung .s und .c zu kompilieren?

Ich fühle mich wie make kann dies leicht tun und ich vermisse etwas.

Vielen Dank für die Hilfe. Wenn ich nicht klar bin, bitte sag es mir und ich werde versuchen, es ausführlicher zu erklären.

Antwort

0

Sie missverstehen, wie Make funktioniert.

Es gibt viele Möglichkeiten, ein Ziel zu erstellen; Machen Sie Gebrauch ein von ihnen, nicht alle. Wie auch immer, verletzt Ihr Make-Datei eines Mad Scientist's rules, dass Ihr Muster Regeln nicht bauen, was sie behaupten zu bauen:

%.o: %.c 
    $(COMPILER) -c $(FLAGS) &< -o C_$(basename [email protected]).o 
%.o: %.s 
    $(COMPILER) -c $(FLAGS) &< -o S_$(basename [email protected]).o 

Die erste nicht foo.o nicht bauen, es baut C_foo.o; das zweite baut foo.o nicht, es baut S_foo.o. Ich weiß nicht, wie Ihre Verknüpfungsregel funktioniert, aber wenn es auf foo.o ankommt, sind Sie in Schwierigkeiten.

Try this:

C_%.o: %.c 
    $(COMPILER) -c $(FLAGS) &< -o [email protected] 
S_%.o: %.s 
    $(COMPILER) -c $(FLAGS) &< -o [email protected] 

Dann geben Sie Ihre Verknüpfungsregel, was Voraussetzungen Sie denken, es haben sollte. Wenn Sie möchten, dass es sowohl C_foo.o als auch S_foo.o verwendet (was nicht nach einer guten Idee klingt), dann legen Sie beide in die Voraussetzungsliste.

+0

Ist das Regel # 4? Ich denke, ich kann für jede Datei einen eigenen Dateinamen haben. Es macht mein Makefile unglaublich groß und schwer zu pflegen. Gibt es trotzdem Makefile zu zwingen, ein Ziel mit allen verfügbaren Regeln zu erstellen? –

+0

@Bradleybare: Ich weiß nicht was * "ein separater Dateiname.o für jede Datei" * bedeutet. Von welchem ​​Ziel sprichst du? Warum möchtest du, dass Make 'foo.o' mit einer Regel erstellt und dann mit einer anderen überschreibt? – Beta

+0

Ich nicht. Ich habe nur eine Datei namens DMA2D.c und DMA2D.s, weil ich die Registerregeln in asm schreiben kann, aber das Zeug auf höherer Ebene in c. Ich wollte in der Lage sein, sie beide DMA2D aber mit einer anderen Erweiterung zu nennen. Mit seperatem Dateiname.o meine ich DMA2D_S.o und DMA2D_C.o. –

Verwandte Themen