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
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?
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
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.
Du kannst eine Variable abhängig vom Target setzen:
1 | master: CFLAGS += -DSPI_MASTER |
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.
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.
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.