Makefile: el archivo existe, verificación no consistente

Makefile: el archivo existe, verificación no consistente
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 checksin make clean, make checksiempre devuelve "Hola existe".

Al hacer a make cleany luego a make check, no devuelve "Hola existe".

Nota: en ambos casos, ls -ltrin gendevuelve 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_nameexiste cuando se lee el Makefile, el checkobjetivo 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, checknecesidades file_namey 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

información relacionada