mikrocontroller.net

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


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: der mechatroniker (Gast)
Datum:

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

Autor: alibabashack (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 =)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Übergabe der Versionsnummer an den C-Code bekomme ich hin.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.