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 crearVARS
, en lugar de una serie de asignaciones+=
, lo que hace que sea más fácil obtener una nueva línea entre el valor deVAR1
yVAR2
. -
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".