Makefile 循环中赋值问题

he3913 2009-06-18 06:53:26
有下面的makefile,循环中赋值有问题


LOCAL_INC:include
SUBDIRS := cmm api cli ctr lic
CURRDIR :=
CURRFB :=
PRJINC := $(CURRDIR)/$(LOCAL_INC)
LINKPATH:= $(CURRFB) $(PRJINC)

LOOPCNT := 1
ALLCNT := $(words $(SUBDIRS))

linkmd:linkpre
while [ $(LOOPCNT) -le $(ALLCNT) ]; do \
CURRFB = $(word $(LOOPCNT), $(SUBDIRS)) ; \
CURRFB += $(CURRDIR)/$(CURRFB)/$(LOCAL_INC)/*.H
@echo linking files...
-ln $(LINKPATH)
LOOPCNT=`expr $(LOOPCNT) + $n`
done

linkpre:
CURRDIR=$(shell pwd)
.PHONY: linkmd linkpre


循环中CURRFB LOOPCNT无法取得变量的数值,求教应如何修改
...全文
470 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymtom 2009-06-20
  • 打赏
  • 举报
回复
[code=BatchFile]
SUBDIRS := cmm api cli ctr lic
LOOPCNT := 1
ALLCNT := $(words $(SUBDIRS))

all:
@loopcnt=$(LOOPCNT); \
while [ $${loopcnt} -le $(ALLCNT) ]; do \
echo "loopcnt: $${loopcnt}"; \
loopcnt=`expr $${loopcnt} + 1`; \
done; \
LOOPCNT=$${loopcnt}; \
echo '$$$${LOOPCNT}: ' "$${LOOPCNT}"; \
echo '$${LOOPCNT}: ' "${LOOPCNT}"; \
echo '$$(LOOPCNT): ' "$(LOOPCNT)"
# 输出为:
# loopcnt: 1
# loopcnt: 2
# loopcnt: 3
# loopcnt: 4
# loopcnt: 5
# $${LOOPCNT}: 6
# ${LOOPCNT}: 1
# $(LOOPCNT): 1
[/code]
从结果分析:
Makefile里的变量比如LOOPCNT在开始处理target之后,是不会被赋值的。
因为LOOPCNT=$${loopcnt}这类语句是给shell变量赋值。
看了下面的例子一定,大家都会觉得很糊涂。
[code=BatchFile]
SUBDIRS := cmm api cli ctr lic
LOOPCNT := 1
ALLCNT := $(words $(SUBDIRS))

all:
@LOOPCNT=$(LOOPCNT); \
while [ $${LOOPCNT} -le $(ALLCNT) ]; do \
echo "LOOPCNT: $${LOOPCNT}"; \
LOOPCNT=`expr $${LOOPCNT} + 1`; \
done; \
LOOPCNT=$${LOOPCNT}; \
echo '$$$${LOOPCNT}: ' "$${LOOPCNT}"; \
echo '$${LOOPCNT}: ' "${LOOPCNT}"; \
echo '$$(LOOPCNT): ' "$(LOOPCNT)"
[/code]

再看看下面的例子,大家应该什么都明白了
[code=BatchFile]
FOO = FOO_000

all:
FOO=FOO_001
echo $(FOO)

FOO=FOO_002; \
echo $(FOO)

FOO=FOO_003; \
echo $${FOO}

FOO=FOO_004
echo $(FOO)
echo $${FOO}
[/code]
once_and_again 2009-06-19
  • 打赏
  • 举报
回复

没看 题 ,是赋值还是 拼接?

${A}b
he3913 2009-06-19
  • 打赏
  • 举报
回复
循环内为shell规则,等号左右不能有空格

he3913 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pottichu 的回复:]
你试试

LOOPCNT=$(($(LOOPCNT)) + ($n))

我现在没有 linux 环境,试不了。
[/Quote]

结果:
LOOPCNT=; \
/bin/sh: -c: line 2: syntax error: unexpected end of file
make: *** [linkmd] Error 2

不止这个,上面的
CURRFB = $(word $(LOOPCNT), $(SUBDIRS)) ; \
CURRFB 也取不到后边表达式的值
echo可以看到结果,但是就是不能赋值给CURRFB
pottichu 2009-06-18
  • 打赏
  • 举报
回复
你试试

LOOPCNT=$(($(LOOPCNT)) + ($n))

我现在没有 linux 环境,试不了。
he3913 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pottichu 的回复:]
LOOPCNT=`expr $(LOOPCNT) + $n`

这个加法运算似乎有点问题。 现在没办法验证,明天验证了再来回复。
[/Quote]
改成下面也是一样的
LOOPCNT=`expr $(LOOPCNT) + 1`

用echo察看表达式值是2,但是就是不能赋值给 LOOPCNT
pottichu 2009-06-18
  • 打赏
  • 举报
回复
LOOPCNT=`expr $(LOOPCNT) + $n`

这个加法运算似乎有点问题。 现在没办法验证,明天验证了再来回复。

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧