A menudo encuentro que la sintaxis de Bash es 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 en shell
lugar de bash
ejecutar los comandos.
/bin/sh: -c: line 0: syntax error near unexpected token
(''Respuestas:
De la documentación de GNU Make,
Así que ponlo
SHELL := /bin/bash
en la parte superior de tu archivo MAKE y estarás listo para comenzar.Por cierto: también puede hacer esto para un objetivo, al menos para GNU Make. Cada objetivo puede tener sus propias asignaciones variables, como esta:
Eso imprimirá:
Consulte "Valores variables específicos del objetivo" en la documentación para obtener más detalles. Esa línea puede ir a cualquier parte del Makefile, no tiene que estar inmediatamente antes del objetivo.
fuente
man
. Habla sobre los tiempos. : Pinfo
realidad, pero supongo que realmente ayudó a Andy. Sé que he tenido días así ...SHELL=/bin/bash
como la primera línea del Makefile (o justo después del comentario).Puedes llamar
bash
directamente, usa la-c
bandera:Por supuesto, es posible que no pueda redirigir a la variable $ @, pero cuando intenté hacer esto, obtuve
-bash: $@: ambiguous redirect
un mensaje de error, por lo que es posible que desee ver eso antes de que también lo haga (aunque estoy usando bash 3.2.algo, así que tal vez el tuyo funcione de manera diferente).fuente
Si la portabilidad es importante, es posible que no desee depender de un shell específico en su Makefile. No todos los entornos tienen bash disponible.
fuente
Puede llamar a bash directamente dentro de su Makefile en lugar de usar el shell predeterminado:
en vez de:
fuente
make
ignora el valor de la variable de entorno SHELL.Hay una manera de hacer esto sin configurar explícitamente su variable SHELL para que apunte a bash. Esto puede ser útil si tiene muchos archivos MAKE ya que SHELL no se hereda de los archivos MAKE posteriores ni se toma del entorno. También debe asegurarse de que cualquiera 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á el guión como el shell predeterminado. Luego apuntará a bash (al menos en Ubuntu). Sin embargo, tenga en cuenta que usar dash como el shell de su sistema es un poco más eficiente.fuente
sh
, bash se ejecuta en modo de compatibilidad (set -o posix
). La funcionalidad que el OP está tratando de usar, la sustitución del proceso, no está disponible en este modo.Una forma que también funciona es ponerlo de esta manera en la primera línea de su objetivo:
fuente