Red Hat Linux下make报错'target pattern contains no %',HP Unix可正常运行
问题:Red Hat Linux下make报错"target pattern contains no '%'",HP Unix可正常运行
错误场景
在Red Hat Linux环境执行make -f Makefile release时触发错误,相同操作在HP Unix环境可正常完成。
错误输出
make -f Makefile release /users/src/Excalibur/hertz/make/ProjectRules:115: *** target pattern contains no '%'. Stop.
相关代码片段
- ProjectRules文件第115行规则
$(COB_OBJS): $(COBSRCDIR)/$$(@:.o=.cbl) $(COB) -xcv $(COBSRCDIR)/$(@:.o=.cbl)
- ProjectMacros文件末尾的变量定义
# we need this in order to have the generic lib and exec rules LIB = .foob EXEC = .foob DBSERV = .foob COB_EXEC = .foob COB_OBJS = .foob COB_LIB_OBJS = .foob COB_LIB = .foob SHLIB = .foob SHLIB_OBJS = .foob COB_SERV = .foob DCESERV = .foob
- 手动验证变量结果(bash环境)
$ echo $COB_OBJS -bash: COB_OBJS: unbound variable $ echo $COBSRCDIR /users/src/Excalibur/hertz/src/cob $ echo $COB cob -g -a -v -C SOURCEFORMAT=FREE -C noalter -C noanim -C noseg -C notrunc -C nonestcall -C nocheckdiv -C noodoslide -C bound
问题分析与解决
核心原因
COB_OBJS变量在make环境中未被正确赋值:
- 当前
COB_OBJS被设置为.foob这个占位符,展开后规则变为.foob: $(COBSRCDIR)/$$(@:.o=.cbl),既不是合法的模式规则(缺少%),也不是普通规则(依赖中的$@对固定目标.foob无意义),导致make报错。 - HP Unix环境正常的原因大概率是该环境下
COB_OBJS被正确替换为实际的目标文件列表(如file1.o file2.o),或者HP的make工具对此类无效规则容错性更高。
解决步骤
- 修正
COB_OBJS赋值:.foob是占位符,需在makefile的其他位置或执行make时,将其替换为实际的COBOL目标文件列表(例如cob_module1.o cob_module2.o)。检查ProjectMacros或其他被引用的makefile,确认是否有覆盖COB_OBJS的逻辑。 - 验证make环境变量:在ProjectRules中添加
$(info COB_OBJS in make: $(COB_OBJS)),执行make时查看实际的变量值(bash环境的echo $COB_OBJS无法反映make内部的变量状态)。 - 确认规则有效性:当
COB_OBJS为有效目标列表时,当前的静态模式规则写法是合法的,可正常匹配每个.o文件对应的.cbl源文件进行编译。
内容的提问来源于stack exchange,提问作者Praveen K C
相关产品推荐
相关产品推荐

