Forum: Mikrocontroller und Digitale Elektronik makefile abhängig von einem #define im c-code?


von Peter (Gast)


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.

von Karl H. (kbuchegg)


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.

von der mechatroniker (Gast)


Lesenswert?

Genau andersrum gehts. Über die Compileroption -D kannst du 
Einstellungen aus dem Makefile mit in den Sourcecode "durchschleifen".

von alibabashack (Gast)


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 =)

von Peter (Gast)


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.

von Oliver (Gast)


Lesenswert?

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

von Peter (Gast)


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)

von (prx) A. K. (prx)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

Die Übergabe der Versionsnummer an den C-Code bekomme ich hin.

von (prx) A. K. (prx)


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

von Peter (Gast)


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...

von Peter (Gast)


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.

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
Noch kein Account? Hier anmelden.