Makefile: arquivo existe, verificação não consistente

Makefile: arquivo existe, verificação não 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*

Quando faço um make checkwithout make clean, make checksempre retorna "Olá existe".

Fazendo a make cleane depois a make check, não retorna o "Olá existe".

Nota: em ambos os casos, ls -ltrin genretorna uma impressão de arquivo não vazia.

Responder1

ifeq ($(shell test -e file_name && echo -n yes),yes)

é avaliado quando Make lê o Makefile, não quando os comandos são executados. Assim, se file_nameexistir quando o Makefile for lido, o checkalvo será executado echo "Hello exists", caso contrário não será.

Makefiles devem ser descritos em termos de arquivos, tanto quanto possível; no seu caso, checknecessidades file_namee file_name1, então é isso que deve ser especificado:

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

As verificações em si podem envolver qualquer comando que você possa executar em seu shell, incluindo testes nos arquivos, mas você não pode condicionar partes do Makefile a critérios que mudam durante o processamento do Makefile (pelo menos, não facilmente). No seu caso, você poderia fazer 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>

ou mais explicitamente, com escapes porque precisa ser executado em uma única invocação de shell:

check: file_name file_name1
        if [ -s file_name ]; then \
            <do something with both files> \
        else \
            <do something with file_name1> \
        fi

informação relacionada