www.mikrocontroller.net

Forum: Compiler & IDEs Makefile - bedingets Bearbeiten


Autor: Christian Besemann (christianbesemann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möche im makefile je nach spezifiziertem Prozessortyp

Beispiel:
# MCU name
MCU = atmega32
#MCU = atmega644

im weiteren Verlauf des Makefiles bei:

# List C source files here.
SRC = prog_1.c (für atmega32)

SRC = prog_2.c (für atmega644)

automatisch zwischen den zu linkenden Files umschalten mit dem zuvor 
definierten unter MCU Namen und nicht jedesmal umständlich 
auskommentieren müssen.

Für einen Tip wie ich dieses anstelle wäre ich Euch sehr dankbar,

Grüße Chris

Autor: Markus ---- (mrmccrash)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1min bei Google:

http://web.mit.edu/gnu/doc/html/make_7.html

conditional make ist das Zauberwort.

_.-=: MFG :=-._

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls GNU-make:
# MCU name
MCU = atmega32
#MCU = atmega644

# List C source files here.

ifeq ($(MCU),atmega32)
SRC = prog_1.c
else ifeq ($(MCU),atmega644)
SRC = prog_2.c
else
SRC = "hae?"
endif

all:
  @echo $(SRC)

Autor: Christian Besemann (christianbesemann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke an die Spezialisten!!!!

Autor: Wolfgang Mües (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit den Bedingungen in Make kann sehr schnell unübersichtlich 
werden.

Darf ich Dich auf eine andere Möglichkeit hinweisen?

MCU:=atmega32

atmega32src:=src1.c
atmega644src:=src2.c src3.c

SRC:= $(MCU)src

Autor: Christian Besemann (christianbesemann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, Danke!

Habe es jetzt so gelöst:

# List C source files here. (C dependencies are automatically 
generated.)
SRC = $(TARGET).c file_1.c File_2.c

ifdef USE_File_3
  SRC +=  File_3.c
endif

ifdef USE_File_4
  SRC += File_4.c
endif

ifdef USE_File_5
  SRC += #File_5.c
endif
all:; @echo $(SRC)

Ich empfand dieses für mich am übersichtlichsten, so kann ich je nach 
gewünschtem Programmoptionen über Variablen die Dateien hinzulinken.

Bleibt noch die Frage wie ich dem Präprozessor die im makefile 
definierten Variablen übergeben kann, so daß dieser auch die includes 
über die gleichen Variablen steuern kann, zb.: ifdef USE_File_5 #include 
file_5.h

Danke schon mal!

Chris

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Z.B. im makefile:
# List C source files here. (C dependencies are automatically
generated.)
SRC = $(TARGET).c file_1.c File_2.c

SRC_OPTIONS=

ifdef USE_File_3
  SRC +=  File_3.c
  SRC_OPTIONS += -DUSE_FILE3
endif

ifdef USE_File_4
  SRC += File_4.c
  SRC_OPTIONS += -DUSE_FILE4
endif

ifdef USE_File_5
  SRC += #File_5.c
  SRC_OPTIONS += -DUSE_FILE5
endif

%.o : %.c
  $(CC) -c $(ALL_CFLAGS) $(SRC_OPTIONS) $< -o $@ 

all:; @echo $(SRC)

Im Quelltext kann man dann schreiben:
...
#ifdef USE_FILE3
#include "file3.h"
#endif

#ifdef USE_FILE4
#include "file4.h"
#endif

#ifdef USE_FILE5
#include "file5.h"
#endif
...

Eine etwas einfachere Möglichkeit wäre, im Makefile anstatt
der "-D..." gleich "-include filex.h" zu schreiben und dies als
Argument an den gcc zu übergeben; dadurch entfallen dann im
Quelltext die #ifdef... #include... #endif-Passagen.
(Siehe 
http://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Prepro...)
Halte ich aber aber für suboptimal, weil 1. die Quelltexte
nicht mehr für sich alleine kompilierbar sind, 2. das Ganze
für Aussenstehende eher undurchsichtig wird, (ein #include
sucht man ja am ehesten im Quelltext, nicht beim Aufruf),
und 3. die so erzwungenen automatischen #include wirken, als
ob sie ganz am Anfang des Quelltextes stünden (vielleicht
ist das der falsche Platz).

Autor: Christian Besemann (christianbesemann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Klaus,

danke für die ausführliche Antwort!!!

Habe es genau so umgesetzt - leider funzt es noch nicht :-(

Ich gebe zu, ich habe auch nicht wirklich verstanden was die Zeile:

%.o : %.c $(CC) -c $(ALL_CFLAGS) $(SRC_OPTIONS) $< -o $@

bewirkt...

Wenn ich im main.h die Variable USE_FILE nochmals bekannt mache klappt 
es.

Noch eine Idee?

Grüße Chris

Autor: Roland Riegel (roland) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> %.o : %.c
>     $(CC) -c $(ALL_CFLAGS) $(SRC_OPTIONS) $< -o $@

"Kompiliere (-c) aus jeder .c-Datei eine .o-Datei, indem der Compiler 
$(CC) mit den Optionen aus ALL_CFLAGS und SRC_OPTIONS (also Dein 
USE_FILE) aufgerufen wird, mit der .c-Datei ($<) als Eingabe und der 
.o-Datei ($@) als Ausgabe (-o)."

In ALL_CFLAGS kannst Du nützliche Sachen wie -Wall, -Os, -pedantic usw. 
aufnehmen.

Gruß,
Roland

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.