Makefile: файл существует, проверка не согласована

Makefile: файл существует, проверка не согласована
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*

Когда я делаю a make checkбез make clean, make checkвсегда возвращается «Hello exist».

При выполнении a make cleanи затем a make checkне возвращается сообщение «Hello exist».

Примечание: в обоих случаях функция ls -ltrin genвозвращает непустой файл print.

решение1

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

оценивается, когда Make читает Makefile, а не когда команды запускаются. Таким образом, если file_nameсуществует при чтении Makefile, checkцель будет запущена echo "Hello exists", в противном случае — нет.

Makefiles должны быть максимально описаны в терминах файлов; в вашем случае это checkneeds file_nameи file_name1, поэтому вот что следует указать:

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

Сами проверки могут включать любую команду, которую вы можете запустить в своей оболочке, включая тесты файлов, но вы не можете сделать части Makefile условными по критериям, которые изменяются во время обработки Makefile (по крайней мере, нелегко). В вашем случае вы могли бы сделать что-то вроде

check: file_name file_name1
        test -s file_name && <do something with both files>
        ! test -s file_name && <do something with only file_name1>

или, более явно, с экранированием, поскольку это должно выполняться в одном вызове оболочки:

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

Связанный контент