
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 check
without make clean
, make check
sempre retorna "Olá existe".
Fazendo a make clean
e depois a make check
, não retorna o "Olá existe".
Nota: em ambos os casos, ls -ltr
in gen
retorna 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_name
existir quando o Makefile for lido, o check
alvo 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, check
necessidades file_name
e 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