Ulli Horlacher <
fram...@rus.uni-stuttgart.de>:
>Ich geb zu, ich hab seit 20 Jahren keine makefiles mehr erstellt.
>Ich dachte immer, die make execute Zeilen waeren normaler
>shell-Code.
Erst dann, wenn sie durch den Make‐Präprozessor gelaufen sind, sind
sie Shell‐Code. Wie der Präprozessor funktioniert, sollte im
Handbuch des verwendeten Make‐Programms zu lesen sein. (Leider gibt
der POSIX‐Standard für Make ziemlich wenig her. Daher muss man bei
den verschiedenen Make‐Implementierungen mit zu einander
inkompatiblen Erweiterungen des POSIX‐Standards rechnen.)
Mit dem Make‐Präprozessor haben auch die von dir beobachteten
Effekte zu tun:
>Was macht da $$d? Wieso nicht $d?
>
«$d» würde die (hypothetische) Make‐Präprozessor‐Variable «d»
expandieren. Das ist hier aber nicht gewünscht.
«$$d» wird vom Make‐Präprozessor in «$d» umgesetzt: Zwei vom
Make‐Präprozessor erkannte aufeinanderfolgende «$» setzt er als ein
einzelnes «$» in die Shell‐Kommandozeile, die er erstellt. Die vom
Make‐Präprozessor erstellte Shell‐Kommandozeile enthält also den Text
«$d».
>Und wie(so) wird '#!$(PYTHON)' expandiert?
>
Auch da siehst du wieder den Make‐Präprozessor am Werk: Er ersetzt
im Text «'#!$(PYTHON)'» den Teil «$(PYTHON)» durch den Wert der
Make‐Präprozessor‐Variablen «PYTHON». Dadurch entsteht in der von
ihm erstellten Shell‐Kommandozeile der Text «'#!/usr/bin/python3'».
Du fragst «wieso»? Vermutlich vermutest du, der Apostroph habe für
den Make‐Präprozessor eine Sonderbedeutung ähnlich wie im Shell,
richtig? Das ist nicht der Fall: Ein Apostroph wird vom
Make‐Präprozessor unverändert an die Shell‐Kommandozeile
weitergereicht.