2016-06-19 6 views
0

Ich habe ein Makefile von einem früheren Projekt genommen, das Programme für einen avr Mikrocontroller kompiliert. Ich stieß auf einige Probleme mit den IO-Ports/Datenrichtungsadressen, die ich einstellte, die den Mikrocontroller dazu veranlassten, Fehler zu verursachen und zurückzusetzen. Aus diesem Grund wollte ich einen Schritt in meinem Makefile hinzufügen, damit es die vorverarbeiteten Dateien erzeugt und dann aus diesen vorverarbeiteten Dateien kompiliert. Ich bin nicht sehr vertraut mit der Funktionsweise von Regeln/Abhängigkeiten in Makefiles, daher habe ich, was ich glaube, einen einfachen Fehler in meinem Verständnis der Funktionsweise von Makefiles gemacht. Meine Regeln, um die vorverarbeiteten Dateien/Objektdateien und eventuell die .elf-Datei zu erstellen, müssen falsch sein. Bis ich die Schritte hinzugefügt habe, die versuchten, die vorverarbeiteten Dateien zu erstellen, die die .elf-Datei erstellen, funktioniert es gut. Was ist mein einfacher Fehler in der Funktionsweise von Regeln/Abhängigkeiten?Wie kann ich einen Schritt in einem Makefile haben, um Vorverarbeitungsdateien zu generieren und aus diesen Dateien zu kompilieren?

Wie ich diese Arbeit sehe, wenn ich nach make all frage, sieht es, dass es eine Abhängigkeit von led.elf hat. Um dies zu erstellen, hat es die Abhängigkeit der vorverarbeiteten Dateien basierend auf der Zeile $(OUTPUT).elf: $(PROCESS_FILES), so dass es mit dieser Zeile beginnt. Wenn ich versuche, make all jedoch bekomme ich den Fehler make: *** No rule to make target 'main.c', needed by 'main.e'. Stop. und ich verstehe nicht warum. Kann jemand mein Verständnis in Make-Dateien helfen?

SRC_FILES=\ 
main.c led.c comm.c 
#Object files 
PROCESS_FILES=$(SRC_FILES:.c=.e) 
OBJ_FILES=$(PROCESS_FILES:.e=.o) 
#Directories where to look for include files 
INC_DIRS=\ 
-I. \ 
#Output file name 
OUTPUT=led 
#Programmer and port 
PROG=dragon_isp 

PORT=usb 
#Debugging host and port 
DHOST=localhost 
DPORT=6423 
#Compiler related params 
MCU=atmega2560 
CC=avr-gcc 
OBJCOPY=avr-objcopy 
CFLAGS= -mcall-prologues -std=gnu99 -funsigned-char -funsigned bitfields \ 
-fpack-struct -fshort-enums -mmcu=$(MCU) -Wall -Wstrict-prototypes \ 
$(INC_DIRS) 
#Optimization level 
CFLAGS+=-Os 
#Debug info 
CFLAGS+=-gdwarf-2 

#Generate hex file ready to upload 
all: $(OUTPUT).elf 
$(OBJCOPY) -R .eeprom -O ihex $(OUTPUT).elf $(OUTPUT).hex       
#Link output files 
$(OUTPUT).elf: $(PROCESS_FILES) 
    $(CC) $(CFLAGS) $(OBJ_FILES) -o $(OUTPUT).elf -Wl,-Map,$(OUTPUT).map 
#Create object files 
$(PROCESS_FILES): %.e : %.c 
    $(CC) -E $(CFLAGS) $< -o [email protected] 
$(OBJ_FILES): %.o : %.e 
    $(CC) -x $(CFLAGS) $< -o [email protected] 
#Create assembler file of a C source 
%.s: %.c 
    $(CC) -S $(CFLAGS) $< -o [email protected] 
#Cleans all generated files 
clean: 
    rm -f $(OBJ_FILES) 
    rm -f $(OUTPUT).elf 
    rm -f $(OUTPUT).hex 
    rm -f $(OUTPUT).map 

Edit: Ich bin von meinem Computer jetzt weg, so kann ich dies nicht, aber über meine Frage denke ich beginne ich keine Datei mit dem Namen main.c in diesem Verzeichnis zu denken. Selbst wenn ich das tat, denke ich immer noch, dass das Makefile nicht korrekt funktionieren würde, weil ich Regeln in Makefiles nicht vollständig verstehe.

+0

Der von Ihnen gepostete Fehler besagt, dass Sie 'main.c' nicht finden können, wo sind die Quelldateien relativ zum Makefile? Auch ist nicht klar, warum Sie den zusätzlichen Vorverarbeitungsschritt benötigen, bitte erläutern Sie. – user657267

+0

Ich benutze ein Projekt in einem Unternehmen, wo die Makefiles viel aufwändiger und komplizierter waren. Sie hatten viele Schritte zu ihnen und ein Schritt war, die vorverarbeiteten Dateien zu erstellen, so dass Sie sie überprüfen konnten, wenn Sie wollten. Ich mochte das und ich weiß, dass es möglich ist, also möchte ich es in mein Projekt integrieren. Von jetzt an wäre es nützlich zu sehen, in was für ein spezielles Makro in avr/io.h übersetzt wird. – rangeme

Antwort

0

Mein Fehler kam von der Tatsache, dass ich keine main.c Datei in meinem Verzeichnis hatte. Stellen Sie sicher, dass Sie Dateien sichern, wenn Sie mit der OBJ_FILES oder einer ähnlichen Variablen herumhantieren, und eine Zeile haben, die alles löschen wird, was sich in dieser Variablen befindet, unter make clean.

Wie für die Regeln, musste ich einen kleinen Fix machen, um zu erreichen, was ich wollte. Ich änderte

$(OUTPUT).elf: $(PROCESS_FILES) 
    $(CC) $(CFLAGS) $(OBJ_FILES) -o $(OUTPUT).elf -Wl,-Map,$(OUTPUT).map 

zu

$(OUTPUT).elf: $(OBJ_FILES) 
    $(CC) $(CFLAGS) $(OBJ_FILES) -o $(OUTPUT).elf -Wl,-Map,$(OUTPUT).map 

Dies dann sieht sie die Objektdateien benötigt, die wiederum die vorverarbeiteten Dateien benötigt.

Bearbeiten: Ich änderte auch OBJ_FILES=$(PROCESS_FILES:.e=.o) zu OBJ_FILES=$(SRC_FILES:.c=.o). Ich fügte auch $(PROCESS_FILES) zu $(OUTPUT).elf: $(OBJ_FILES) hinzu, so dass die Regel sowohl die vorverarbeiteten Dateien als auch die Objektdateien unabhängig voneinander erzeugen würde. Ich musste $(OBJ_FILES): %.o : %.e zu $(OBJ_FILES): %.o : %.c ändern, um diese Arbeit zu machen.

+0

Sie können Ihre eigene Antwort akzeptieren, indem Sie auf den grünen Haken klicken .... –

Verwandte Themen