
check: gen
# ls -ltr file_name*
ifeq ($(shell test -s file_name && echo -n yes),yes)
Do something with file_name and file_name1
else
Do something else with file_name1
endif
# Will generate file_name and file_name1. Depending on the implementation , file_name can be empty sometimes.
gen:
<some command to generate file_name and file_name1>
clean:
-rm -rf file_name*
Cuando hago make check
sin make clean
, make check
siempre devuelve "Hola existe".
Al hacer a make clean
y luego a make check
, no devuelve "Hola existe".
Nota: en ambos casos, ls -ltr
in gen
devuelve una impresión de archivo no vacía.
Respuesta1
ifeq ($(shell test -e file_name && echo -n yes),yes)
se evalúa cuando Make lee el Makefile, no cuando se ejecutan los comandos. Por lo tanto, si file_name
existe cuando se lee el Makefile, el check
objetivo se ejecutará echo "Hello exists"
; de lo contrario, no.
Los Makefiles realmente deberían describirse en términos de archivos tanto como sea posible; en su caso, check
necesidades file_name
y file_name1
, eso es lo que se debe especificar:
check: file_name file_name1
<run your checks>
file_name file_name1:
<some command to generate file_name and file_name1>
clean:
rm -f file_name file_name1
Las comprobaciones en sí pueden involucrar cualquier comando que pueda ejecutar en su shell, incluidas las pruebas de los archivos, pero no puede condicionar partes del Makefile a criterios que cambian durante el procesamiento del Makefile (al menos, no fácilmente). En tu caso, podrías hacer algo como
check: file_name file_name1
test -s file_name && <do something with both files>
! test -s file_name && <do something with only file_name1>
o más explícitamente, con escapes porque esto debe ejecutarse en una única invocación de shell:
check: file_name file_name1
if [ -s file_name ]; then \
<do something with both files> \
else \
<do something with file_name1> \
fi