Forum: Compiler & IDEs Makefile - bedingets Bearbeiten


von Christian B. (christianbesemann)


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

von Markus -. (mrmccrash)


Lesenswert?

1min bei Google:

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

conditional make ist das Zauberwort.

_.-=: MFG :=-._

von Klaus W. (mfgkw)


Lesenswert?

Falls GNU-make:
1
# MCU name
2
MCU = atmega32
3
#MCU = atmega644
4
5
# List C source files here.
6
7
ifeq ($(MCU),atmega32)
8
SRC = prog_1.c
9
else ifeq ($(MCU),atmega644)
10
SRC = prog_2.c
11
else
12
SRC = "hae?"
13
endif
14
15
all:
16
  @echo $(SRC)

von Christian B. (christianbesemann)


Lesenswert?

Danke an die Spezialisten!!!!

von Wolfgang Mües (Gast)


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

von Christian B. (christianbesemann)


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

von Klaus W. (mfgkw)


Lesenswert?

Z.B. im makefile:
1
# List C source files here. (C dependencies are automatically
2
generated.)
3
SRC = $(TARGET).c file_1.c File_2.c
4
5
SRC_OPTIONS=
6
7
ifdef USE_File_3
8
  SRC +=  File_3.c
9
  SRC_OPTIONS += -DUSE_FILE3
10
endif
11
12
ifdef USE_File_4
13
  SRC += File_4.c
14
  SRC_OPTIONS += -DUSE_FILE4
15
endif
16
17
ifdef USE_File_5
18
  SRC += #File_5.c
19
  SRC_OPTIONS += -DUSE_FILE5
20
endif
21
22
%.o : %.c
23
  $(CC) -c $(ALL_CFLAGS) $(SRC_OPTIONS) $< -o $@ 
24
25
all:; @echo $(SRC)

Im Quelltext kann man dann schreiben:
1
...
2
#ifdef USE_FILE3
3
#include "file3.h"
4
#endif
5
6
#ifdef USE_FILE4
7
#include "file4.h"
8
#endif
9
10
#ifdef USE_FILE5
11
#include "file5.h"
12
#endif
13
...

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/Preprocessor-Options.html#Preprocessor-Options)
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).

von Christian B. (christianbesemann)


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

von Roland R. (roland) Benutzerseite


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

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.