Forum: Compiler & IDEs Makefile - Wie bedingte Kompilierung umsetzen?


von Markus (Gast)


Lesenswert?

Hallo,

makefiles, oh Gott...


Als Grundlage habe ich ein mit mfile erstelltes Makefile benutzt.

Ich möchte Code für die SPI-Schnittstelle kompilieren. Einmal für den 
master mit "make master".

Dafür habe ich folgendes target definiert

:master
CDEFS += -D SPI_MASTER

Aber wie kann ich von hier dann weiter zu :all springen?

Oder geht das ganz anders? Ein Link, wo ein gutes Beispiel steht wäre 
auch hilfreich, das Manual 
http://www.gnu.org/software/make/manual/make.html ist zu viel für 
mich...Oder Schlagwörter nach denen man googeln kann. "make Bedingte 
Kompilierung" oder "make conditions" haben mich auch nicht weiter 
gebracht. Ich habe auch versucht ein paar Echos einzubauen um den Ablauf 
herauszufinden. Aber ich kann nicht nachvollziehen, wie das abläuft...

Gruß,
Markus

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Markus schrieb:
> Aber wie kann ich von hier dann weiter zu :all springen?

"Springen" überhaupt nicht, Makefile ist kein Skriptsprache. Da kannst 
das Target von "all" abhängig machen, aber das ist vermutlich nicht das, 
was du willst.

Vielleicht doch nochmal ein make-Tutorial durchlesen und sich mit den 
Konzepten und Ideen vertraut machen?

von Markus (Gast)


Lesenswert?

Eigentlich wollte ich nur, dass bei "make master" das "#define 
SPI_MASTER" gesetzt wird. Aber wenn das alles so komplex ist, muss ich 
doch nochmal weiter unten anfangen...Trotzdem danke

von Karl H. (kbuchegg)


Lesenswert?

Ja das ist meistens so.
WEnn man weiß wie es geht, sind die Dinge einfach.
Aber bis man erst mal weiß, wie es geht gibt es eine Menge zu lernen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Du kannst eine Variable abhängig vom Target setzen:
1
master: CFLAGS += -DSPI_MASTER

von makefile (Gast)


Lesenswert?

Weitere Möglichkeit:
1
ifeq ($(MAKECMDGOALS), master)
2
  CFLAGS += -DSPI_MASTER
3
endif

Wobei die von gjlayde vorgeschlagene target-spezifische Variable
vielleicht etwas eleganter ist.

von Markus (Gast)


Lesenswert?

Johann L. schrieb:
> Du kannst eine Variable abhängig vom Target setzen:
> master: CFLAGS += -DSPI_MASTER

Ich möchte, dass er dann bei :all weiter macht. Wenn ich all außerdem 
noch als Abhängigkeit hinzufüge, funktioniert das aber nicht.

Ich bin sehr frustriert, dass ich an sowas einfachem schon scheitere. 
Das müssen doch jeden Tag tausend Leute brauchen verdammt. Ich mach mein 
define jetzt in einem Header, das finde ich zwar total hässlich, aber na 
ja. Hab mir das make Manual ausgedruckt, dann hab ich was zu 
Lesen...Auch wenn ich gar keine Lust mehr habe mich mit dem kranken Zeug 
zu befassen ;-) Danke für die Hilfe.

von Markus (Gast)


Lesenswert?

Noch eine grundsätzliche Frage zum Ablauf:

Make beginnt die Ausführung beim Standard-Target, in meinem Fall all, 
bei all sieht er Abhängigkeiten von anderen Targets, als führt er diese 
zuerst aus. Wie er von all: über build: zu elf: kommt, kann ich mir noch 
vorstellen, aber ab elf: dann weiß ich nicht mehr so recht weiter mit 
der Reihenfolge. Bei :elf sieht er die Abhängigkeit von einer 
.elf-Datei, die Regel wie diese erzeugt wird. steht dann bei %.elf. Aber 
das linken ist ja schon der letzte Schritt, warum er vorher noch die 
ganzen Kompilierschritte ausführt kann ich nicht nachvollziehen.

Der Auszug:

all: begin gccversion sizebefore build sizeafter end

build: elf hex eep lss sym

elf: $(TARGET).elf

# Link: create ELF output file from object files.
.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
  @echo
  @echo $(MSG_LINKING) $@
  $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)

von Markus (Gast)


Lesenswert?

makefile schrieb:
> Weitere Möglichkeit:
> ifeq ($(MAKECMDGOALS), master)
>   CFLAGS += -DSPI_MASTER
> endif

Ja, das funktioniert. Hurra. Vielen Dank.

Falls mal jemand per Forensuche über diesen Thread stolpern sollte, bei 
mir funktioniert folgendes:

master:  all
ifeq ($(MAKECMDGOALS), master)
  CFLAGS += -DSPI_MASTER
endif

slave:  all
ifeq ($(MAKECMDGOALS), slave)
  CFLAGS += -DSPI_SLAVE
endif

Danke nochmal an alle

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.