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

Gast #1244040
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
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
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
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 #1244266
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
Gast #1245190
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)
Gast #1245208
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.
#1245218
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
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.