Правильное изменение переменной в файле makefile в цикле while

#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...