makefile abhängig von einem #define im c-code?

Gast #1244040
Lesenswert?
• ▲
▼
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.
#1244059
Lesenswert?
• ▲
▼
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.
Gast #1244063
Lesenswert?
• ▲
▼
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 =)
Gast #1244249
Lesenswert?
• ▲
▼
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.
Gast #1245190
Lesenswert?
• ▲
▼
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)
#1245218
Lesenswert?
• ▲
▼
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
Gast #1245259
Lesenswert?
• ▲
▼
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...
Gast #1245314
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren