2016-09-22 6 views
0

Ich versuche, mehr .c-Dateien durch Assembler zu kompilieren:Bypass Standardregel für make

%.S: %.c 
     $(XCC) -S -o [email protected] $(XCFLAGS) -c $< 

%.o: %.S 
     $(XCC) -o [email protected] $(XCFLAGS) -c $< 

test.a: test.o foo.o 
     $(LD) -o [email protected] $^ $(XLDFLAGS) 

$ (XCC) ist ein Quer Kompilierung-Tool.

Eigentlich sehe ich:

cc -c -o test0.o test0.c 
cc -c -o foo.o foo.c 

Mutterzusammenstellung statt erforderlichen Quer Kompilierung läuft. Ich sehe aus wie eine Standardregel für% .c bis% .o Übersetzung wird anstelle der beschriebenen Kettenregel verwendet.

Wenn ich ein Muster auf direkte Beschreibung ändern, Kompilation ist ok:

test.S: test.c 
     $(XCC) -S -o [email protected] $(XCFLAGS) -c $< 

foo.S: foo.c 
     $(XCC) -S -o [email protected] $(XCFLAGS) -c $< 

%.o: %.S 
     $(XCC) -o [email protected] $(XCFLAGS) -c $< 

Was mit Muster Kette ist falsch? Ist es möglich, die Standardregel für% .o zu deaktivieren?

+0

die temporären * .S-Dateien zu halten, fügen Sie die Anweisung: '.PRECIOUS% .S' – user3629249

Antwort

3

Es gibt eine Standardregel, um .o Dateien aus .c Dateien zu generieren. Diese Regel wird aufgerufen, wenn das erste Makefile verwendet wird.

Sie konnten die folgenden auf die Make-Datei fügen Sie die Standardregel außer Kraft zu setzen:

%.o: %.c 
     $(XCC) -S -o $*.S $(XCFLAGS) -c $< 
     $(XCC) -o [email protected] $(XCFLAGS) -c $*.S 

Sie können auch verwenden:

%.o: %.c 

ohne darunter Rezepte. Dadurch werden die anderen zwei Regeln aufgerufen, um die .S-Datei und die .o-Datei von dort zu erstellen. Es wird jedoch die Zwischen-S-Datei löschen, nachdem das O erstellt wird. Um die .S-Datei zu verhindern, gelöscht zu werden, können Sie verwenden:

.PRECIOUS: test.S foo.S 

Sie mehr zu diesem Thema in https://www.gnu.org/software/make/manual/html_node/Implicit-Rules.html#Implicit-Rules lesen.

+0

Diese baut die .S jedes Mal. –

+0

Es gibt wahrscheinlich eine Möglichkeit anzugeben, die Regel "% .o:% .S" vor dieser Regel zu bevorzugen. Es lohnt sich, aufzuschauen. –

+0

Nein, so habe ich Angst. Beim Kompilieren der '.o' wird make zwei Regeln auswerten: die eingebaute' .c -> .o' Eins und die benutzerdefinierte '.S -> .o'. Da letzteres eine Regelverkettung benötigt (weil das '.S' nicht existiert und über' .c -> .S' gemacht werden muss), während das erste eine bereits existierende Voraussetzung hat, wird es das eingebaute bevorzugen. Siehe [verkettete Regeln] (https://www.gnu.org/software/make/manual/html_node/Chained-Rules.html). BTW, Muster in '.PRECIOUS' sind seit 17 Jahren ein TODO ... –

0

Sie können Ihre Regeln und nur cancel die integrierte Regel mit %.o: %.c halten. Siehe auch this answer.

+0

Ja, es funktioniert. Es genügt also, die Zeile "% .o:% .c" hinzuzufügen, um das beschriebene Problem zu umgehen. Danke vielmals! –