español - makefile 112 makeopts no existe el fichero o el directorio
¿Cómo puedo verificar si el archivo existe en Makefile? (8)
En la sección limpia de mi makefle estoy tratando de verificar si el archivo existe antes de eliminarlo permanentemente. Yo uso este código pero recibo errores.
¿Qué pasa con eso?
if [ -a myApp ]
then
rm myApp
fi
Recibo este mensaje de error
f [ -a myApp ]
/bin/sh: Syntax error: end of file unexpected (expecting "then")
make: *** [clean] Error 2
Es extraño ver a tanta gente usando scripts de shell para esto. Estaba buscando una forma de utilizar la sintaxis nativa de los archivos MAKE, porque estoy escribiendo esto fuera de cualquier objetivo. Puede usar la función de wildcard
para verificar si el archivo existe:
ifeq ($(UNAME),Darwin)
SHELL := /opt/local/bin/bash
OS_X := true
else ifeq (,$(wildcard /etc/redhat-release))
OS_RHEL := true
else
OS_DEB := true
SHELL := /bin/bash
endif
Actualizar:
Encontré una manera que realmente me funciona:
ifneq ("$(wildcard $(PATH_TO_FILE))","")
FILE_EXISTS = 1
else
FILE_EXISTS = 0
endif
Es posible que necesite una barra invertida al final de la línea para continuar (aunque tal vez eso dependa de la versión de make):
if [ -a myApp ] ; /
then /
rm myApp ; /
fi;
Falta un punto y coma
if [ -a myApp ];
then
rm myApp
fi
Sin embargo, supongo que está comprobando la existencia antes de la eliminación para evitar un mensaje de error. Si es así, simplemente puede usar rm -f myApp
que "fuerza" la eliminación, es decir, no rm -f myApp
errores si el archivo no existe.
La segunda respuesta superior menciona ifeq
, sin embargo, no menciona que estos deben estar en el mismo nivel que el nombre del objetivo, por ejemplo, para descargar un archivo solo si no existe actualmente, se puede usar el siguiente código:
if fi
download:
ifeq (,$(wildcard ./glob.c))
curl … -o glob.c
endif
O simplemente colóquelo en una línea, como make
likes it:
if [ -a myApp ]; then rm myApp; fi;
Simplemente puede usar el comando de prueba para probar si el archivo existe, por ejemplo:
test -f myApp && echo File does exist
-f file
Verdadero si el archivo existe y es un archivo normal.
-s file
True si el archivo existe y tiene un tamaño mayor que cero.
o no:
test -f myApp || echo File does not exist
test ! -f myApp && echo File does not exist
La test
es equivalente a [
comando. Ver: help [
o help test
para help test
la sintaxis adicional.
Solución de una línea:
[ -f ./myfile ] && echo exists
Una solución de línea con acción de error:
[ -f ./myfile ] && echo exists || echo not exists
Ejemplo utilizado en mis directivas de make clean
:
clean:
@[ -f ./myfile ] && rm myfile || true
¡Y make clean
siempre funciona sin ningún mensaje de error!
FILE1 = /usr/bin/perl
FILE2 = /nofile
ifeq ($(shell test -e $(FILE1) && echo -n yes),yes)
RESULT1=$(FILE1) exists.
else
RESULT1=$(FILE1) does not exist.
endif
ifeq ($(shell test -e $(FILE2) && echo -n yes),yes)
RESULT2=$(FILE2) exists.
else
RESULT2=$(FILE2) does not exist.
endif
all:
@echo $(RESULT1)
@echo $(RESULT2)
resultados de ejecución:
bash> make
/usr/bin/perl exists.
/nofile does not exist.