2016-04-13 3 views
1

i ein Make-Datei so etwas wie dieses hava:Make-Datei automatische Variable für entsprechende C-Datei

outdir = release 
allsrc = aaa/a.c bbb/b.c ccc/c.c 
allobjs = $(addprefix $(outdir), $(notdir $(allsrc:.c=.o)) 
... 
test: $(allobjs) 

$(allobjs): $(allsrc) 
     gcc -c -o [email protected] $< 

make test führt:

gcc -c -o release/a.o aaa/a.c 
gcc -c -o release/b.o aaa/a.c 
gcc -c -o release/c.o aaa/a.c 

(automatischer Variable $ < immer nimmt erste Voraussetzung) aber ich will "Entsprechendes":

gcc -c -o release/a.o aaa/a.c 
gcc -c -o release/b.o bbb/b.c 
gcc -c -o release/c.o ccc/c.c 

was soll ich ändern? ein wünschenswertes Ergebnis erzielen?

ich weiß, dass dies sicher funktioniert:

$(outdir)/a.o: aaa/a.c 
     gcc -c -o [email protected] $< 

$(outdir)/b.o: bbb/b.c 
     gcc -c -o [email protected] $< 

$(outdir)/c.o: ccc/c.c 
     gcc -c -o [email protected] $< 

und sich fragen, wie man das gleiche in einer receipe zu erreichen. (weil ich in meinem echten Makefile ~ 20 verschiedene Quelldateien habe, nicht nur 3, wie ich hier zum Beispiel gemacht habe)

+1

nicht brauchen Wenn Sie die Aufmerksamkeit auf die gute Beratung nicht in Etan Antwort zahlen , können Sie mit '$ *. c' experimentieren. –

Antwort

1

Der übliche Weg zu tun, was man so etwas würde fragen:

outdir = release 
allsrc = aaa/a.c bbb/b.c ccc/c.c 
allobjs = $(addprefix $(outdir), $(notdir $(allsrc:.c=.o))) 
VPATH = $(sort $(dir $(allsrc))) 
... 
test: $(allobjs) 

$(outdir)/%.o: %.c 
     gcc -c -o [email protected] $< 

Natürlich ist dies auf Probleme stoßen, wenn Sie beide haben eine b.c in aaa und bbb, aber da Sie versuchen, um alle Objektdateien in dasselbe Verzeichnis zu bringen, haben Sie das unabhängig. Es könnte mehr Sinn der $(notdir loszuwerden machen und die gleiche Verzeichnisstruktur unter $(outdir) halten, in dem Fall, dass Sie die VPATH

outdir = release 
allsrc = aaa/a.c bbb/b.c ccc/c.c 
allobjs = $(addprefix $(outdir), $(allsrc:.c=.o)) 
... 
test: $(allobjs) 

$(outdir)/%.o: %.c 
     mkdir -p `dirname [email protected]` 
     gcc -c -o [email protected] $< 
+0

danke, VPATH ist die Lösung. – MetNP

2

Du schreibst dein Rezept nicht so. So funktioniert das nicht.

Das Rezept sagt, dass jedes Element in $(allobjs)jeden Artikel in $(allsrc) als Voraussetzung hat, aber das ist nicht das, was Sie meinen.

Sie meinen, dass jede .o Datei die passende .c Datei als Voraussetzung hat, die ist genau das, was die in %.o: %.c Regel gebaut bereits der Fall ist. Sie brauchen dazu nicht einmal ein Makefile.

Edit: Eigentlich meinst du das nicht. Ich hatte übersehen, dass die Quelldateien in verschiedenen Verzeichnissen lagen. Das ändert und kompliziert die Dinge.

Chris Dodd wrote up zwei gute Lösungen dafür.

+0

gut kannst du mir minimal Beispiel schreiben, wie man aaa/ac, bbb/bc und ccc/cc zu release/ao, release/bo, release/co, weil das ist, was ich mit dieser Frage – MetNP

Verwandte Themen