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
1min bei Google: http://web.mit.edu/gnu/doc/html/make_7.html conditional make ist das Zauberwort. _.-=: MFG :=-._
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) |
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
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).
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
> %.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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.