Wie Makefile-Abhängigkeiten ausdrücken?

OP Persönliche Seite #1114675
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
OP Persönliche Seite
Kann man das auch verwenden, um mit patsubst ne "doppelte Schleife" zu 
realisieren?

Also
1
A=a b c ...
2
B=x y z ...

und es sollen String mit allen Kombinationen aus A x B erzeugt werden, 
d.h.
1
ax ay az ...
2
bx by bz ...
3
cx cy cz ...
4
 .  .  . .
5
 .  .  .  .
6
 .  .  .   .

Bei dem ganzen Makro-Zeugs hab ich ab irgendner Ebene n Knoten im Kopf, 
geht mir mit sh und TeX auch net besser.

Die erste Ebene bekomm ich ja mit
1
$(patsubst %, a%, $(B))
2
$(patsubst %, b%, $(B))
3
$(patsubst %, c%, $(B))

Johann
OP Persönliche Seite
Ich hab jetzt das gefunden:
1
A=a b
2
B=x y z
3

4
.SECONDEXPANSION:
5
AB=$(patsubst %, $$(patsubst \%, \%%, $$(A)), $(B))
6

7
.SECONDEXPANSION:
8
XY=$(AB)
9

10
$(warning "AB=$(AB)")
11
$(warning "XY=$(XY)")

aber das wird nicht weiter expandiert, das .SECONDEXPANSION zeigt keine 
Wikung, es ändert sich auch nix wenn ich es weg lasse:
1
Makefile:192: "AB= $(patsubst %, %x, $(A))  $(patsubst %, %y, $(A))  $(patsubst %, %z, $(A))"
2
Makefile:193: "XY= $(patsubst %, %x, $(A))  $(patsubst %, %y, $(A))  $(patsubst %, %z, $(A))"

Braucht man sowas wie .THIRDEXPANSION?

Johann

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.