#shell #makefile #gnu-make #gnu
Вопрос:
Я хочу сделать счетчик на некоторое время в своем файле makefile. Скажите мне, что я делаю не так, почему число в СЧЕТЧИКЕ не растет? начало.с :
<------>@$(EECHO) Starting server...
<------>COUNTER=0
<------>@while [ ! -f ${CS_LOG_FILE} ]; do
<------> echo Wait for the start server... ;
<------> sleep 1 ;
<------> COUNTER = COUNTER 1 :
<------> echo ${COUNTER} ;
<------> $(if $(shell if [ "$(COUNTER)" != "10" ]; then
<------> echo "stop"; fi), $(error it seems that '${NAME}' is not found in ${CS_LOG_FILE}))
<------>done
<------>@$(EECHO) Starting server completed...
Комментарии:
1. Вам действительно нужно предоставить полный файл makefile. Если это набор команд для рецепта, обратите внимание, что
COUNTER=0
он будет выполняться в собственной оболочке-вы видели, что не хватает нескольких завершающих обратных косых черт.
Ответ №1:
Здесь много проблем.
Существует фундаментальное недоразумение: вы пытаетесь смешать функции make, переменные и операции оболочки. Эти двое не бегут одновременно. Они выполняются последовательно: сначала расширяются все функции и переменные make, ЗАТЕМ по результатам этого расширения вызывается оболочка, и она выполняется в совершенно отдельном процессе.
Таким образом, конструкция оболочки, подобная while
циклу, не может устанавливать или использовать функции, такие как if
, error
и т. Д., Потому что к моменту запуска цикла оболочки ВСЕ функции и переменные make были расширены, а оболочка работает где-то в другом месте.
Таким образом, в вашем примере make сначала развернет строку, которую вы указали, что даст результат:
while [ ! -f somefile ]; do
echo Wait for the start server... ;
sleep 1 ;
COUNTER = COUNTER 1 :
echo ;
$(error it seems that '${NAME}' is not found in ${CS_LOG_FILE}))
done
что, конечно, приведет к сбою, когда он расширит error
функцию еще до того, как будет вызвана оболочка.
Вы должны написать все это как сценарий оболочки. Вы должны использовать конструкции оболочки, а не создавать конструкции. Помните, что каждый $
, который вы хотите передать в оболочку, должен быть удвоен $$
, чтобы избежать его создания. Что-то вроде:
@$(EECHO) Starting server...
@COUNTER=0;
while [ ! -f ${CS_LOG_FILE} ]; do
echo Wait for the start server... ;
sleep 1 ;
COUNTER=$(expr $COUNTER 1) ;
echo $COUNTER ;
if [ $COUNTER -eq 10 ]; then
echo it seems that '${NAME}' is not found in ${CS_LOG_FILE};
exit 1;
fi;
done
@$(EECHO) Starting server completed...