【问题标题】:Correct change of the variable in the makefile in the while loop在while循环中正确更改makefile中的变量
【发布时间】:2021-05-19 15:00:48
【问题描述】:

我想在我的 makefile 中为 while 循环创建一个计数器。告诉我我做错了什么,为什么 COUNTER 中的数字没有增长? 开始.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...

【问题讨论】:

  • 您确实需要提供完整的makefile。如果这是配方的命令集,请注意 COUNTER=0 将在其自己的 shell 中运行 - 您看到缺少一些尾部反斜杠。

标签: shell makefile gnu-make gnu


【解决方案1】:

这里有很多问题。

有一个根本性的误解:您试图混入 make 函数和变量以及 shell 操作。两者不会同时运行。它们依次运行:FIRST 所有的 make 函数和变量都被展开,THEN shell 会根据展开的结果被调用,并在一个完全独立的进程中运行。 p>

因此,像 while 循环这样的 shell 构造不能设置或使用像 iferrormake 函数,因为通过当 shell 循环运行时,所有的 make 函数和变量都被扩展并且 shell 正在其他地方运行。

因此,在您的示例中,make 将扩展您提供的 FIRST 字符串,结果为:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-26
    • 2013-09-13
    • 2018-06-10
    • 2022-07-07
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    相关资源
    最近更新 更多