0

我有一个生成文件,其中包含如下语句:

TOPICS = dmic
SRV_MODE =
ifeq "$(SRV_FLAG)"   "ON"
        SRV_MODE =  2
endif
vpath d%_srv.h $(CNT_PATH)

USER_PRE_TARGETS := $(foreach topic,$(TOPICS),$(topic)_srv.h)

dmic_srcs = $(wildcard $(CCWSCA)/dmic/src/*.c) \
              $(wildcard $(CCWSCA)/dmic/src/*.ppc)

dmic_srv.h: $(dmic_srcs)
        srvgen dmic $(SRV_MODE)

users_topic =
users_topic := $(shell ls -tr $(CCWPA)/$(CCBB)/Makefile.pre* | \
        tail -1 | awk 'BEGIN{FS="Makefile.pre."}{printf("%s\n", $$2);}')

USER_PRE_TARGETS := $(foreach topic,$(users_topic),d$(topic)_srv.h)

运行构建后,我收到如下消息:

gmake: Entering directory `/veluser2/vel/abp/bvijays/proj/c9mi790V64OG/cmi9dl'
echo dmic
dmic
srvgen dmic 2
Working on directory : /veluser2/vel/abp/bvijays/bb/cmi9dl/v79_0/dmic/src
Working on directory : /velhome/vel/ccvel/ccvel/bb/cmi9dl/v79_0/dmic/src
foreach: No match.
gmake: *** [ddmic_srv.h] Error 1
gmake: Target `pre' not remade because of errors.
gmake: Leaving directory `/veluser2/vel/abp/bvijays/proj/c9mi790V64OG/cmi9dl'

所以似乎发出的 foreach 命令有问题?由于我是这些makefile的新手,有人可以建议如何调试makefile吗?

4

1 回答 1

1

这有点混乱,如果不了解更多关于运行它的环境,就很难诊断。但是让我们先了解一些基础知识:

  • 您只定义了目标 ( dmic_srv.h),因此当您运行不带参数的 GNU make 时,它​​将使用该目标。
  • 使标头依赖于源文件是非常不寻常的,我怀疑这就是你想要做的。但是你正在生成代码,所以你在那里没问题。
  • GNU make 中有两种不同的赋值。Plain=有惰性求值,但:=强制立即求值。这会影响您$(foreach )运行的环境。
  • 您有 的两个定义USER_PRE_TARGETS,但永远不要在任何地方使用它。补充:鉴于$(foreach )这些定义中存在所有命令,您可以删除这些命令,看看它是否会变得更好。
于 2009-12-19T01:55:30.137 回答