variable source make automatic makefile expansion dollar-sign

automatic - makefile source variable



Cuatro signos de dólar en Makefile (3)

Estoy leyendo el documento de GNU Make. Aquí hay un ejemplo

% .d:% .c

@set -e; rm -f $@; / $(CC) -M $(CPPFLAGS) $< > $@.$$$$; / sed ’s,/($*/)/.o[ :]*,/1.o $@ : ,g’ < $@.$$$$ > $@; / rm -f $@.$$$$

Probé esto en un programa C ++ y obtuve la lista de archivos

init3d.d init3d.d.18449 input.d input.d.18444 main.d main.d.18439

Esto es lo que encontré pero no entiendo en el mismo document

Si ha habilitado la expansión secundaria y desea un signo de dólar literal en la lista de requisitos previos, debe escribir cuatro signos de dólar (''$$$$'').

Me pregunto qué significan los cuatro signos de dólar "$$$$" en realidad? ¿Cómo lo hacen 18449, 18444 o 18439?

¡Gracias y saludos!


18449, 18444 o 18439 parecen identificaciones de proceso, ¿tal vez una identificación de proceso?


Si la "expansión secundaria" está habilitada, se requiere $$$$ para generar un solo $ en la salida real. Normalmente se usa $ para expandir variables, funciones de creación de llamadas, etc. $$ con la expansión secundaria habilitada hace otra cosa, pero de lo contrario genera un $ real en la salida.

El shell que se usa para ejecutar líneas de comando en sistemas similares a Unix normalmente interpreta $$ como expandir al ID del proceso del shell. Por lo tanto, sin la expansión secundaria habilitada, $$$$ se convertirá en $$ en la salida, que el shell ampliará al ID de proceso.

(Usar la ID del proceso de shell como sufijo es una forma sencilla de intentar garantizar la unicidad del nombre de archivo para un archivo temporal).


$$ se convertirá a $ , pero en las reglas de Makefile (que son expresiones de shell) también tendrá que escapar de los $ resultantes utilizando / o utilizando comillas simples alrededor de su expresión.

Aquí hay un ejemplo que lo demuestra:

DOLLAR:=$$ dollar: echo ''$$'' > $@ echo "/$$" >> $@ echo ''$(DOLLAR)'' >> $@ echo "/$(DOLLAR)" >> $@ cat dollar