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


von Jürgen S. (jsachs)


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.
1
alllib: mega16 meag32
2
3
mega16:
4
  clean
5
  MCU = atmega16
6
  all
7
8
mega32:
9
  clean
10
  MCU = atmega32
11
  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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Sowas sollte gehen:
1
.PHONY: all clean atmega16
2
3
atmega16: MCU=atmega16
4
atmega16: CFLAGS= ...
5
6
atmega16: all clean

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

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

von Jürgen S. (jsachs)


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.
1
# test for make file that build for multiple targets
2
.PHONY: clean all begin end compile mega16 mega32 mega8515
3
4
mega16: MCU=atmega16
5
mega16: DUDE_MCU=m16
6
mega16: all
7
8
mega32: MCU=atmega32
9
mega32: DUDE_MCU=m32
10
mega32: all
11
12
mega8515: MCU=atmega8515
13
mega8515: DUDE_MCU=m8515
14
mega8515: all
15
16
buildall: clean mega16 clean mega32 clean mega8515
17
18
all: begin compile end
19
20
begin:
21
        @echo "-------- begin ---------"
22
23
end:
24
        @echo "--------- end ----------"
25
26
compile:
27
        @echo "compiling for MCU=$(MCU)"
28
29
clean:
30
        @echo "cleaning"

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

von Johann L. (gjlayde) Benutzerseite


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

von Jürgen S. (jsachs)


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.

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.