Makefile - Wie bedingte Kompilierung umsetzen?

Gast #3325059
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
Gast #3325512
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.
Gast #3325526
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)
Gast #3325537
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren