Pausar GNU Make en una consola de Windows si ocurre un error
Pregunta
Parte de la instalación de una aplicación de la que soy responsable compila algunas bibliotecas de código C.Esto se hace en una consola usando GNU Make.
Entonces, como parte de la instalación, se abre una ventana de la consola, ve el asistente de creación del archivo de salida mientras se compila y vincula; cuando finaliza, la ventana de la consola se cierra y el instalador continúa.
Todo bien, salvo que haya un error de compilación.Luego, el archivo make falla y la ventana de la consola se cierra antes de que tengas la oportunidad de descubrir qué está sucediendo.
Entonces, lo que me gustaría que sucediera es que la ventana de la consola se pausara con una funcionalidad del tipo "presione una tecla para continuar", si hay un error en el archivo MAKE, para que la consola permanezca abierta.De lo contrario, simplemente salga normalmente y cierre la consola.
No puedo entender cómo hacer esto en un GNU Makefile o desde un archivo por lotes que pueda ejecutar Make.
Solución
Esto debería funcionar:
if not ERRORLEVEL 0 pause
tipo help if
en DOS para obtener más información sobre el uso del nivel de error.
Otros consejos
Esto es lo que estás buscando:
if ERRORLEVEL 1 pause
si escribes
HELP IF
obtienes esta información:Número de nivel de error | Especifica una condición verdadera si el último programa en ejecución devolvió un código de salida igual o mayor que el número especificado.
Usando este sencillo programa C para manipular el código de salida:
#include <stdio.h>
main(int argc, char *argv[]) {
if (argc == 2) {
// return integer of argument 1
return strtol(argv[1], NULL, 10);
}
else {
return 0;
}
}
Podemos probar el código de salida en un archivo por lotes al igual que:
test.exe 0
IF ERRORLEVEL 0 PAUSE
Condición: 0 => 0 == TRUE
Cuando ERRORLEVEL = 0
, la pausa se producirá porque la lógica es >=
o mayor que o igual.Esto es importante, ya que no está claro de inmediato que la afección no sea una ==
comparación.
Observe que al sustituir 1 => 0
también será cierto y, por lo tanto, también se producirá la pausa.Esto es válido para cualquier número positivo.
Sólo podemos provocar el efecto contrario bajando 0
:
test.exe -1
IF ERRORLEVEL 0 PAUSE
Condición: -1 => 0 == FALSE
desde un ERRORLEVEL
de 1
normalmente significa que hay un error, y 0
no hay error, simplemente podemos aumentar el mínimo en la condición de comparación para obtener lo que queremos así:
test.exe 0
IF ERRORLEVEL 1 PAUSE
Condición: -1 => 1 == FALSE
Condición: 0 => 1 == FALSE
Condición: 1 => 1 == TRUE
En este ejemplo.el guión se detendrá cuando ERRORLEVEL
es 1
o mas alto
Tenga en cuenta que esto permite -1
códigos de salida iguales que 0
.¿Qué pasa si uno sólo quiere 0
¿Para no hacer una pausa?Podemos usar una sintaxis separada:
test.exe 0
IF NOT %ERRORLEVEL% EQU 0 PAUSE
Condición: -1 != 0 == TRUE
Condición: 0 != 0 == FALSE
Condición: 1 != 0 == TRUE
En este ejemplo, el script se detiene si %ERRORLEVEL%
no es 0
Podemos hacer esto usando el operador EQU para verificar primero si %ERRORLEVEL% EQU 0
, entonces el operador NOT para obtener el efecto contrario, equivalente al !=
operador.Sin embargo, creo que esto sólo funciona en máquinas NT, no en DOS simples.
Referencias:
http://chrisoldwood.blogspot.ca/2013/11/if-errorlevel-1-vs-if-errorlevel-neq-0.html http://ss64.com/nt/errorlevel.html
¿Has probado el comando 'pausar'?
@echo off
echo hello world
pause
- más información sobre 'pausa': http://technet.microsoft.com/en-us/library/bb490965.aspx
- Referencia de la línea de comandos de DOS A-Z: http://technet.microsoft.com/en-us/library/bb490890.aspx