para makeopts make fichero existe español entre ejecutar directorio diferencia crear con compilar como makefile

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.