mikrocontroller.net

Forum: Compiler & IDEs mit einem make für mehrere Targets übersetzen


Autor: Jürgen Sachs (jsachs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich baue mir eine eigen Bibliothek, die auf das jeweilige Target 
abgestimmt ist. Diese haben dann das jeweilige Target im Namen, z.B:
buslogic_atmega16.a oder buslogic_atmega32 usw..
Es wird im Script also mit LIBNAME = buslogic_$(MCU) der Name definiert.

Das funktioniert einzeln prima, nur muss ich jetzt wenn ich alle libs 
machen möchte
1) MCU im Makefile setzen
2) make clean
3) make
4) ab zu 1 für jede MCU typ :-(

Ich habe mir gedacht ich könnte es in der art lösen, was leider nicht 
geht.
alllib: mega16 meag32

mega16:
  clean
  MCU = atmega16
  all

mega32:
  clean
  MCU = atmega32
  all

leider kann ich so die make Target clean und all nicht aufrufen und das 
setzen der "Variablen" MCU geht auch nicht. Ich bin da leider kein make 
Profi.
Hat mir jemand einen Tipp wie ich das machen kann.

Danke
Juergen

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sowas sollte gehen:
.PHONY: all clean atmega16

atmega16: MCU=atmega16
atmega16: CFLAGS= ...

atmega16: all clean

http://www.gnu.org/software/make/manual/make.html#...

Ausserden geht es über Conditionals (if else), wenn die das besser 
gefällt.

Uns wenn das auch nicht genehm ist, kann man es auch über rekursive 
make-Aufrufe lösen. Setzt dann aber ne gescheite Umgebung voraus. Also 
keine DOS-Box.

Johann

Autor: Jürgen Sachs (jsachs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Link. Ich stecke trotzdem noch fest.
Hab mal ein kleines Testmakefile gemacht. wenn ich "make buildall" 
aufrufe sollte er doch alles übersetzen, macht er aber nicht.
Einzeln mit "make mega16" oder "make mega32" geht wunderbar.

Nachfolgend mal das Test Makefile.
# test for make file that build for multiple targets
.PHONY: clean all begin end compile mega16 mega32 mega8515

mega16: MCU=atmega16
mega16: DUDE_MCU=m16
mega16: all

mega32: MCU=atmega32
mega32: DUDE_MCU=m32
mega32: all

mega8515: MCU=atmega8515
mega8515: DUDE_MCU=m8515
mega8515: all

buildall: clean mega16 clean mega32 clean mega8515

all: begin compile end

begin:
        @echo "-------- begin ---------"

end:
        @echo "--------- end ----------"

compile:
        @echo "compiling for MCU=$(MCU)"

clean:
        @echo "cleaning"

oder stolpere ich jetzt darüber das ich keine Dateien habe die make 
prüfen kann ?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Abhängigkeiten müssennatürlich korrekt beschrieben sein, was gerade 
bei Bibliotheken tricky ist. Wird aber auch im make-Manual erklärt.

Beachte auch, daß make in 2 Phasen arbeitet und nicht wie ein Skript! 
Wenn du "nur" erzwungen Sachen machen willst und es keine Abhängigkeiten 
von Quellen mehr gibt, ist vielleicht ein Skript Mittel der Wahl. Im 
Falle von make würde ich "hinten" anfangen, also beschreiben, wovon eine 
Lib abhängt und wie sie daraus zu erstellen ist. make rekursive zu 
verwenden kann hier sehr hilfreich sein. Gerade das Arbeiten in 2 Phasen 
macht Probleme, wenn eine Regel mehrfach von einem (Phony)-Target 
abhängt. make arbeitet wie gesagt nicht wie ein Skript-Interpreter und 
eine Abhängigkeit von einem Target ist kein Funktionsaufruf oder sowas.

Johann

Autor: Jürgen Sachs (jsachs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also wenn ich das nun richtig verstehe, arbeitet Make wie folgt:
1) Parsen was ist alles zu tun und festhalten der durchzuführenden 
Aktionen
2) Durchführung der notwendigen Aktionen

Wird bei 1 eben das clean schon erledigt, macht er es eben nur einmal.
Ich war der Meinung es ist wirklich wie ein Interpreter.

Ich denke ich mach mir ein Shell Script das mir das Make für jedes 
Target gezielt aufruft
also
make mega16
make mega32
make mega8515

zwar nicht so schön, aber es geht :-)

Danke für die Tipps.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.