Ich brauche eure Hilfe. Compiler: WinAVR->GCC Per #define mache ich im C-Code eine "Versionsunterscheidung". Eigentlich mehr eine spezielle Anpassung. Nun möchte ich nicht jedesmal das Makefile anpassen müssen, um auch einen entsprechenden Dateinamen zu erhalten. Kann ich das Makefile abhängig von einem #define im C-Code machen? Vermutlich nicht. Wie kann ich das lösen, dass ich nur an einer Stelle den "Schalter" (das #define) ändern muss. Also ich möchte im C-code ein #define einkommentieren oder eben nicht und dann entsprechend automatisch mit dem makefile eine entsprechend benanntes Hex file erzeugen. Geht das? Ich hoffe ihr könnt mir helfen. Danke.
Peter wrote: > Ich brauche eure Hilfe. > > Compiler: WinAVR->GCC > Per #define mache ich im C-Code eine "Versionsunterscheidung". > Eigentlich mehr eine spezielle Anpassung. Nun möchte ich nicht jedesmal > das Makefile anpassen müssen, um auch einen entsprechenden Dateinamen zu > erhalten. > > Kann ich das Makefile abhängig von einem #define im C-Code machen? > Vermutlich nicht. Wie kann ich das lösen, dass ich nur an einer Stelle > den "Schalter" (das #define) ändern muss. > Also ich möchte im C-code ein #define einkommentieren oder eben nicht > und dann entsprechend automatisch mit dem makefile eine entsprechend > benanntes Hex file erzeugen. Geht das? Du musst das ganze umdrehen. Praktisch jeder Compiler hat eine Option, mit der man '#define'-ments über die Commandline des Compilers zusätzlich übergeben kann. (Meistens heist diese Option /D oder so ähnlich) Du änderst also nicht das #define im C-Code sondern im makefile. Und das makefile übergibt das geänderte #define an den Compiler.
Genau andersrum gehts. Über die Compileroption -D kannst du Einstellungen aus dem Makefile mit in den Sourcecode "durchschleifen".
Hallo Peter, also meines Wissens geht das so nicht, da das Makefile ja eine übergeordnete Instanz ist =) Ich kenne das so: zeile include mt_defs.mk in das makefile schreiben. So hast du eine seperate, übersichtliche Stelle zum deklarieren der Einstellungen. In das File kommen dann zB: # target board BOARD = SAM7EX256 #BOARD = AT91SAM7SEK im makefile musst du dann einmalig definieren, wie der schalter an den gcc weitergereicht wird: CCFLAGS = -mcpu=$(MCPU) -std=gnu99 -Wall -mthumb-interwork \ $(OPTIMIZATION) -D$(TARGET) -D$(BOARD) -I$(LIB) -I../ \ -ffunction-sections -fdata-sections $(OBJECTS): %.o : %.c @echo Building $@ ... @if not exist $(OBJ) mkdir $(OBJ) $(CC) -c $(CCFLAGS) -o $(OBJ)/$@ $< Was das alles genau bedeutet, kann ich dir leider nicht sagen. Bei makefiles bin ich immer nur am kopieren und ausprobieren =)
Mit SPECIAL_FW =NORMAL und dann CCFLAGS = -DSPECIAL_FW=$(SPECIAL_FW) im makefile geht es. Danke. Aber wie kann ich im c-code diese Abfrage machen? #if (SPECIAL_FW==NORMAL) es gibt zwar keinen Fehler, aber da könnte anstelle von NORMAL auch was beliebiges stehen und er führt den Teil danach trotzdem aus.
Alternativ kannst du auch zwei make-targets definieren, mit passemdem -DmyDefine und Dateinamen, und dann make target1 bzw. make target2 das gewünschte erzeugen. Oliver
Kann mein SREC-File einen anderen Namen als die C-Datei haben? Ich bekomme es einfach nicht hin. all: ${OBJS} $(CC) $(CCFLAGS) $(CF) -o $(PROJECTNAME) $(OBJS) $(LDLIBS) $(OBJCOPY) --output-target=srec $(PROJECTNAME) $(PROJECTNAME).srec avr-size $(PROJECTNAME) $(OBJS)
Man kann Makefile-Symbole in der Kommandozeile übergeben. Also Makefile: CFLAGS += -DVERSION=$(V) und dann make V=2 und im Code steht beispielsweise #if VERSION == 2
Verstehe ich nicht. Ich möchte die Version vom makefile aus steuern. zB. V=2 Die C-Datei soll aber immer gleich heißen (main.c), nur das SREG-File soll dann beispielsweise main2.SREG heißen.
Die Übergabe der Versionsnummer an den C-Code bekomme ich hin.
Bei deiner ziemlich konfusen Frage kann ich nur blind raten was du meinst. Vielleicht main1.SREG : main.c bastele-mir-ein-SREG-file-was-immer-das-ist -DVERSION=1 main.c -o $@ main2.SREG : main.c bastele-mir-ein-SREG-file-was-immer-das-ist -DVERSION=2 main.c -o $@ oder main$(V).SREG : main.c bastele-mir-ein-SREG-file -DVERSION=$(V) main.c -o $@ und make V=99
Ja so was in der Art suche ich. SREC sollte es heißen... Ich tu mich nur schwer, das in mein makefile einzubauen. Irgendwie sehen die makefiles immer anders aus und ich versteh nicht wirklich, was da wie zusammen gebaut wird. Vielleicht kannst du mich in die richtige Richtung schubsen? --------------------------- CC = avr-gcc OBJDUMP = avr-objdump OBJCOPY = avr-objcopy OBJS = $(PROJECTNAME).o #gyro_control.o UISP = uisp -dprog=dapa AVRDUDE = avrdude -p c128 -c yaap -e -U eeprom:w:0xFF,0xFF:m -U flash:w: all: ${OBJS} $(CC) $(CCFLAGS) $(CF) -o $(PROJECTNAME) $(OBJS) $(LDLIBS) $(OBJCOPY) --output-target=srec $(PROJECTNAME) $(PROJECTNAME).srec avr-size $(PROJECTNAME) $(OBJS) .c.o: $(CC) -c $(CCFLAGS) $(CF) -o $@ $< ------------------------ Da wird das doch irgendwie zusammen gebau, oder? Ich hätte da gerne sowas wie: PROJECTNAME_SOURCE =$(FW_VERSION)_$(DESCRIPTION) PROJECTNAME_OUTPUT =$(FW_VERSION)_$(DESCRIPTION)_$(SPECIAL) Nur wenn ich irgendwas an PROJECTNAME ändere. findet er die c-Datei nicht mehr...
Ich hab es. all: ${OBJS} $(CC) $(CCFLAGS) $(CF) -o $(PROJECTNAME) $(OBJS) $(LDLIBS) $(OBJCOPY) --output-target=srec $(PROJECTNAME) $(PROJECTNAME_OUTPUT).srec avr-size $(PROJECTNAME) $(OBJS) Muss mir dringend ein Tutorial zu makefiles suchen... Danke.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.