Hi,
ich hänge schon länger an einem Problem mit meinen Makefiles:
In vielen meiner Projekte werden immer wieder die gleichen Quellen
verwendet.
Zur Compile-Zeit sollen diese Dateien aus einem Verzeichnis $(COMMON) in
das aktuelle Verzeichnis kopiert werden.
Die Dateien, um die es geht, sind in $(COMMON_SRC) eingetragen.
Die Regel, um eine Date zu kopieren sieht also so aus:
1 | .INTERMEDIATE: foo.c
|
2 |
|
3 | foo.c: $(COMMON)/foo.c
|
4 | cp $^ .
|
Wie erreiche ich, daß solche Regeln für alle Einträge von $(COMMON_SRC)
erzeugt werden?
Was nicht funktioniert ist VPATH oder vpath weil ich auch technischen
Gründen eine Kopie brauche.
Was auch nicht geht ist mit awk eine Datei wie zB .depend.common zu
schreiben und per -include ins Makefile zu holen:
Nach einem clean ist diese Datei nämlich leer und wird aber gebraucht,
um .depend zu erzeugen. Man kann zwar .depend von .depend.common
abhängig machen, was auch das .depend.common erzeugt.
Aber das, geht auch nicht, weil das include zum falschen Zeitpunkt
wirkt.
Hier konkret das Fragment mit dem awk-Ansatz:
1 | .PHONY: clean
|
2 | clean:
|
3 | rm -f .depend .depend.common
|
4 |
|
5 | .INTERMEDIATE: $(COMMON_SRC)
|
6 |
|
7 | COMMON_RULE=%s: $(COMMON)/%s\n\tcp $$^ .
|
8 |
|
9 | # Schreibt Regeln der Gestalt
|
10 | # foo.c: $(COMMON)/foo.c
|
11 | # cp $^ .
|
12 | .depend.common: Makefile
|
13 | echo '$(COMMON_SRC)' \
|
14 | | gawk 'BEGIN {RS="[ \t\n]+"} /[^ \t]+/ { printf "$(COMMON_RULE)\n", $$0, $$0}' \
|
15 | > $@
|
16 |
|
17 | -include .depend.common
|
18 |
|
19 | # Normale Abhängigkeiten für gcc erzeugen
|
20 | .depend: .depend.common Makefile $(COMMON_SRC) $(SRC)
|
21 | $(CC) -MM $(SRC) -mmcu=$(MCU_TARGET) $(DEFS) $(INCLUDES) \
|
22 | | sed -e 's/\.o\:/.s:/' \
|
23 | > .depend
|
24 |
|
25 | -include .depend
|
Für Hilfe und Tipps bin ich überaus dankbar!
Johann