mikrocontroller.net

Forum: Compiler & IDEs Wie Makefile-Abhängigkeiten ausdrücken?


Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
.INTERMEDIATE: foo.c

foo.c: $(COMMON)/foo.c
  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:
.PHONY: clean
clean:
  rm -f .depend .depend.common

.INTERMEDIATE: $(COMMON_SRC)

COMMON_RULE=%s: $(COMMON)/%s\n\tcp $$^ .

# Schreibt Regeln der Gestalt
# foo.c: $(COMMON)/foo.c
#   cp $^ .
.depend.common: Makefile
  echo '$(COMMON_SRC)' \
    | gawk 'BEGIN {RS="[ \t\n]+"} /[^ \t]+/ { printf "$(COMMON_RULE)\n", $$0, $$0}' \
    > $@

-include .depend.common

# Normale Abhängigkeiten für gcc erzeugen
.depend: .depend.common Makefile $(COMMON_SRC) $(SRC)
  $(CC) -MM $(SRC) -mmcu=$(MCU_TARGET) $(DEFS) $(INCLUDES) \
    | sed -e 's/\.o\:/.s:/' \
    > .depend

-include .depend

Für Hilfe und Tipps bin ich überaus dankbar!

Johann

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.SECONDEXPANSION:

$(COMMON_SRC): $(COMMON)/$$@
  cp $< $@

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, danke.

Das .SECONDEXPANSION war mir schon in sen Sinn gekommen, hab ich aber 
noch nie verwendet.

Wie wird denn die liste der .SECONDEXPANSION beendet?

Dateiende?
Leerzeile?

p.s.: naja, fast egal. scheint zu funktionieren freu.

Danke!

Johann

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann man das auch verwenden, um mit patsubst ne "doppelte Schleife" zu 
realisieren?

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

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

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
$(patsubst %, a%, $(B))
$(patsubst %, b%, $(B))
$(patsubst %, c%, $(B))

Johann

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab jetzt das gefunden:
A=a b
B=x y z

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

.SECONDEXPANSION:
XY=$(AB)

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

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

Braucht man sowas wie .THIRDEXPANSION?

Johann

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die make-Dokumentation sagt, dass sich das .SECONDEXPANSION 
ausschließlich auf die Abhängigkeitslisten auswirkt, und zwar auf alle 
nachfolgenden (um auch die Frage davor zu beantworten ;-).

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke für deine Mühe :-)

Johann

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst wrote:
>
> .SECONDEXPANSION:
> 
> $(COMMON_SRC): $(COMMON)/$$@
>   cp $< $@
> 

Hi, inzwischen hab ich diese Lösung:
$(COMMON_SRC): % : $(COMMON)/%
  cp $< $@

Die unendlichen Weiten von make...

Trotzdem Danke!

Grüß, Johann

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.