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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.