run how makefile

makefile - how - Salida de variable multilínea a un archivo con GNU Make



makefile windows (3)

GNU make 4.0 agrega la capacidad de escribir archivos directamente :

define VAR1 /dev d 755 - - - - - endef define VAR2 /test d 777 - - - - - /test2 d 777 - - - - - endef define VARS := $(VAR1) $(VAR2) endef all: $(file > test,$(VARS))

Tenga en cuenta que aún debe usar define para definir VARS , o la última línea de VAR1 y la primera línea de VAR2 se pegarán en una línea. Además, no ponga un espacio después de la coma en la construcción $(file ...) , ¡o habrá un espacio inicial en la salida!

Me cuesta mucho escribir una regla de makefile que genere una variable multilínea en un archivo.

Aquí está el código que tengo:

define VAR1 /dev d 755 - - - - - endef define VAR2 /test d 777 - - - - - /test2 d 777 - - - - - endef VARS += $(VAR1) VARS += $(VAR2) all: echo "$(VARS)" > test

Sin embargo, el eco falla al decir "Cadena citada sin terminar" por un motivo desconocido para mí. ¿Cómo podría poner en el archivo todas las líneas declaradas en una línea separada?


Parece como si estuvieras obteniendo "Cadena citada sin terminar" porque Make ejecuta cada línea de la receta en un shell separado, y la primera línea es:

echo " /dev d 755 - - - - -

Aquí está la mejor solución que podría encontrar (y admito que no es muy buena, pero vas en contra de Make) es pasar VARS a una sub-Make que invoca $(info ...) :

Makefile:

define VAR1 /dev d 755 - - - - - endef define VAR2 /test d 777 - - - - - /test2 d 777 - - - - - endef define VARS $(VAR1) $(VAR2) endef export VARS all: $(MAKE) -f Makefile.print > test

Makefile.print:

$(info $(VARS)) .PHONY:all all: @# do nothing


Si exporta la variable al shell y la referencia como una variable del shell, en lugar de una variable make, tendrá mejor suerte:

define VAR1 /dev d 755 - - - - - endef define VAR2 /test d 777 - - - - - /test2 d 777 - - - - - endef define VARS $(VAR1) $(VAR2) endef export VARS all: echo "$$VARS" > test

Tenga en cuenta los siguientes ajustes a su makefile:

  • Utilicé define para crear VARS , en lugar de una serie de asignaciones += , lo que hace que sea más fácil obtener una nueva línea entre el valor de VAR1 y VAR2 .
  • export VARS a tu makefile para obtener la variable insertada en el entorno para la invocación del shell.
  • Utilicé $$VARS lugar de $(VARS) para desreferenciarlo, lo que deja la expansión en el shell, en lugar de hacer, lo que evitará el error "Cadena entrecomillada sin terminar".