在 while 循环中正确更改 makefile 中的变量

Correct change of the variable in the makefile in the while loop

我想在我的 makefile 中为 while 循环创建一个计数器。告诉我我做错了什么,为什么 COUNTER 中的数字没有增长? start.s :

<------>@$(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...

这里有很多问题。

存在一个根本性的误解:您试图混合使用 make 函数和变量以及 shell 操作。两者不同时运行。他们 运行 连续地:FIRST 所有的 make 函数和变量都被展开,THEN shell 在结果上被调用那个扩展和它 运行 在一个完全独立的过程中。

因此,shell 构造如 while 循环无法设置或使用 make 函数像 iferror 等,因为到 shell 循环 运行 时,所有 make 函数和变量都已扩展,shell 是 运行在别处。

因此在您的示例中,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 函数时当然会失败,甚至在调用 shell 之前。

您必须将整个内容写成 shell 脚本。您必须使用 shell 结构,而不是 make 结构。请记住,每个要传递给 shell 的 $ 都必须加倍 $$,以便从 make 中转义。类似于:

@$(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...