bash - instalar - makefile linux c
¿Cómo puedo usar la sintaxis de Bash en los objetivos de Makefile? (5)
A menudo encuentro que la sintaxis de Bash muy útil, por ejemplo, la sustitución de procesos como en diff <(sort file1) <(sort file2)
.
¿Es posible usar tales comandos Bash en un Makefile? Estoy pensando en algo como esto:
file-differences:
diff <(sort file1) <(sort file2) > $@
En mi GNU Make 3.80 esto dará un error ya que usa el shell
lugar de bash
para ejecutar los comandos.
De la documentación de GNU Make,
5.3.1 Choosing the Shell
------------------------
The program used as the shell is taken from the variable `SHELL''. If
this variable is not set in your makefile, the program `/bin/sh'' is
used as the shell.
Así que pon SHELL := /bin/bash
en la parte superior de tu archivo MAKE, y deberías estar listo para continuar.
Por cierto: también puedes hacer esto para un objetivo, al menos para GNU Make. Cada objetivo puede tener sus propias asignaciones de variables, como esta:
all: a b
a:
@echo "a is $$0"
b: SHELL:=/bin/bash # HERE: this is setting the shell for b only
b:
@echo "b is $$0"
Eso se imprimirá:
a is /bin/sh
b is /bin/bash
Consulte "Valores de variables específicos del destino" en la documentación para obtener más detalles. Esa línea puede ir a cualquier parte en el Makefile, no tiene que ser inmediatamente antes del objetivo.
Hay una manera de hacer esto sin establecer explícitamente su variable SHELL para apuntar a bash. Esto puede ser útil si tiene muchos archivos make ya que SHELL no es heredado por makefiles posteriores o tomado del entorno. También debe asegurarse de que cualquier persona que compile su código configure su sistema de esta manera.
Si ejecuta sudo dpkg-reconfigure dash
y responde ''no'' a la solicitud, su sistema no usará dash como shell predeterminado. Luego apuntará a bash (al menos en Ubuntu). Tenga en cuenta que el uso de dash como el shell de su sistema es un poco más eficiente.
Puede llamar a bash directamente dentro de su archivo Makefile en lugar de usar el shell predeterminado:
bash -c "ls -al"
en lugar de:
ls -al
Puedes llamar a bash
directamente, usa el indicador -c
:
bash -c "diff <(sort file1) <(sort file2) > $@"
Por supuesto, es posible que no puedas redirigir a la variable $ @, pero cuando traté de hacerlo, obtuve -bash: $@: ambiguous redirect
como un mensaje de error, por lo que es posible que desees analizarlo antes de que obtengas también en esto (aunque estoy usando bash 3.2.algo, entonces tal vez el suyo funciona de manera diferente).
Si la portabilidad es importante, es posible que no desee depender de un shell específico en su archivo Makefile. No todos los entornos tienen Bash disponible.