在 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 函数像 if
、error
等,因为到 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...
我想在我的 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 函数像 if
、error
等,因为到 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...