【问题标题】:debugging a makefile调试生成文件
【发布时间】:2009-12-18 17:45:02
【问题描述】:

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

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?

【问题讨论】:

  • 您使用的是哪个make 工具?有一个 defacto 标准,但许多都有专门的扩展。顺便说一句,该示例显示gmake,但这可能是任何东西。
  • @Thomas:gmake 通常是 GNU make,加上 $(wildcard )$(foreach ) 最好是...

标签: c unix makefile gnu-make


【解决方案1】:

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

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

【讨论】:

  • 我关心的基本上是当我运行这个 make 文件时应该生成文件 ddmic_srv.h。这个 make 文件运行正常,在其中一台服务器上生成文件 ddmic_srv.h,但不在我所在的服务器上需要它。所以我粘贴了生成文件 ddmic_srv.h 的代码应该生成的 make 文件的一部分。代码或配置肯定有一些问题。但我无法准确地弄清楚.
猜你喜欢
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多