
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 -ltr
in gen
возвращает непустой файл print.
решение1
ifeq ($(shell test -e file_name && echo -n yes),yes)
оценивается, когда Make читает Makefile, а не когда команды запускаются. Таким образом, если file_name
существует при чтении Makefile, check
цель будет запущена echo "Hello exists"
, в противном случае — нет.
Makefiles должны быть максимально описаны в терминах файлов; в вашем случае это check
needs 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