2011-04-05 17 views
91

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.¿Cómo puedo verificar si el archivo existe en Makefile?

¿Qué tiene de malo?

if [ -a myApp ] 
then 
    rm myApp 
fi 

me sale este mensaje de error

f [ -a myApp ] 
/bin/sh: Syntax error: end of file unexpected (expecting "then") 
make: *** [clean] Error 2 
+0

¿Es myApp una variable o un nombre de archivo real? – BugFinder

+0

myApp es para myApplication, es decir, el nombre del archivo por el proceso de compilación. –

+5

Si solo quiere evitar detenerse si el archivo no existe, 'rm -rf myApp' podría ser una alternativa. O precediendo el comando con un guión ('-rm myApp') para hacer que make ignore el error de rm (sin embargo, imprimirá un mensaje desagradable). – thomasa88

Respuesta

1

La segunda respuesta más menciones ifeq, sin embargo, no se menciona que estos deben estar en el mismo nivel que el nombre de la diana, por ejemplo, descargar una archivo solo si no existe actualmente, el siguiente código podría ser utilizado:

if fi 
download: 
ifeq (,$(wildcard ./glob.c)) 
    curl … -o glob.c 
endif 
13

Falta un punto y coma

if [ -a myApp ]; 
then 
    rm myApp 
fi 

Sin embargo, supongo que mirando por 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 se produce un error si el archivo no existe.

+1

THhat es exactamente lo que yo quería hacer. Muchas gracias. –

47

Se puede necesitar una barra invertida en el extremo de la línea de continuación (aunque tal vez eso depende de la versión de marca):

if [ -a myApp ] ; \ 
then \ 
    rm myApp ; \ 
fi; 
+2

parece no ser una sintaxis Makefile? http://sunsite.ualberta.ca/Documentation/Gnu/make-3.79/html_chapter/make_7.html – holms

+0

@holms es una sintaxis de bash. Al escapar de las nuevas líneas, permite que se maneje como un solo comando bash. Por defecto en 'make' una nueva línea sería un nuevo comando bash. La principal advertencia de esto, aparte de la molestia de tener un montón de '\' al final de las líneas, es que cada comando debe terminarse con el ';' que de otro modo estaría implícito en bash. – flungo

+1

La respuesta correcta es por @holms. Ni '\' ni comodín está destinado exactamente para este propósito. La razón por la que usaría un comodín es por la claridad del código. Este método no solo es menos legible, sino que también es más propenso a errores de sintaxis. – Maitreya

19

O sólo hay que poner en una línea, como make le gusta:

if [ -a myApp ]; then rm myApp; fi; 
148

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 utilizar la función de wildcard para comprobar si existe el archivo:

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 

Actualización:

he encontrado una manera que está trabajando realmente para mí:

ifneq ("$(wildcard $(PATH_TO_FILE))","") 
FILE_EXISTS = 1 
else 
FILE_EXISTS = 0 
endif 
+1

Buen truco. Solo iba a buscar gentoo-release :) – thomasa88

+0

Tengo una variante alternativa recientemente. Estoy descubriendo administradores de paquetes con este 'yum: = $ (shell {tipo yum;} 2>/dev/null)' y con 'ifdef' puedes verificar si la variable está vacía o no, y luego establecer algo como' RHEL: = true ' – holms

+39

Alguien debería mencionar que las directivas solo funcionan si no están indentadas ... – arsenbonbon

23

Usted puede simplemente utilizar test comando para probar si el archivo existe, p. ej .:

test -f myApp && echo File does exist 

-f file Verdadero si el archivo existe y es un archivo normal.

-s file Verdadero 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 

El test es equivalente a [ comando. Consulte: help [ o help test para obtener más sintaxis.

+1

Hubiera votado en contra, pero no advirtió que '-s' es un caso especial para' existe y tiene un tamaño mayor que cero'. La pregunta tal como está escrita es independiente del tamaño, por lo que la existencia debe verificarse usando 'test -e' para un archivo o' -d' para un directorio. Los archivos vacíos pueden ser especialmente útiles como (a falta de un término mejor) indicadores/centinelas, que podrían ser bastante relevantes para 'make'. –

+0

Gracias por la sugerencia. Se modificó '-f' de manera predeterminada, ya que es más común de usar. – kenorb

+0

¿Cómo puedo obtener 'test' en Windows? – thowa

3

solución de una línea:

solución
[ -f ./myfile ] && echo exists 

Una línea con la acción de error:

[ -f ./myfile ] && echo exists || echo not exists 

ejemplo utilizado en mis make clean directivas:

clean: 
    @[ -f ./myfile ] && rm myfile || true 

Y make clean siempre funciona sin ningún tipo de error mensajes!

+0

simplemente haga @rm -f myfile. Debido a la bandera "-f", "rm" saldrá con 0 independientemente de si el archivo existe o no. –

5
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 la ejecución:

bash> make 
/usr/bin/perl exists. 
/nofile does not exist. 
Cuestiones relacionadas