Makefile - bedingets Bearbeiten

OP #1415236
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
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)
Gast
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
OP
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
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).
OP
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
Persönliche Seite
> %.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

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.