在echo内部使用字符串时,Makefile覆盖配方错误



我有以下Makefile,在使用all目标时出错。我不确定问题的根本原因是什么。

APSTOP= ../..
VERSION=2.12.8
SVERSION=2.12
SCALAC= /afs/package/scala/scala-${VERSION}/common/bin/scalac
APSLIB = ${APSTOP}/lib/aps-library-${SVERSION}.jar
COOLCOMPILERDIR= /afs/project/cool/scala
SCALAFLAGS= -cp .:${APSLIB}
SCALACFLAGS= ${SCALAFLAGS}
APS2SCALA = ${APSTOP}/bin/aps2scala
APS2SCALAFLAGS = -p ..:${APSTOP}/base -G
SCALASRC = cool-symbol.handcode.scala cool-semant-driver.scala cool-handcode.scala cool-noinherit-semant-driver.scala
SCALAGEN = cool-symbol.scala cool-tree.scala 
cool-noinherit-semant.scala  cool-dynamic-semant.scala
SCALACOPY= basic.scala A2I.scala 
CoolTokens.scala CoolScanner.scala CoolOptions.scala 
CoolParser.scala 
SCALAHAND = CoolCompiler.scala
EXAMPLEDIR = ../examples
.PHONY: all clean src
src : ${SCALASRC}
all : ${SCALAGEN}
all : cool_symbol_implicit.class 
cool_tree_implicit.class 
cool_noinherit_semant_implicit.class 
cool_dynamic_semant_implicit.class
%.scala : ../%.aps 
${APS2SCALA} ${APS2SCALAFLAGS} $*
cool-symbol.scala : ../cool-symbol.aps
${APS2SCALA} ${APS2SCALAFLAGS} --omit SYMBOL --omit gensym cool-symbol
%_implicit.class : %.scala
${SCALAC} ${SCALACFLAGS} $*.scala
cool_symbol_implicit.class : cool-symbol.scala cool-symbol.handcode.scala
${SCALAC} ${SCALACFLAGS} cool-symbol.scala cool-symbol.handcode.scala
cool_tree_implicit.class : cool-tree.scala cool_symbol_implicit.class
${SCALAC} ${SCALACFLAGS} cool-tree.scala
cool_noinherit_semant_implicit.class : cool-noinherit-semant.scala
${SCALAC} ${SCALACFLAGS} $<
cool_dynamic_semant_implicit.class : cool-dynamic-semant.scala
${SCALAC} ${SCALACFLAGS} $<
%.scala : RCS/%.scala,v
co $<
.PHONY: %.run
%.run : %.class
scala ${SCALAFLAGS} $*
.PHONY: %.compile
%.compile : %.scala
scalac ${SCALACFLAGS} $*.scala
.PHONY: %.semant
%.semant : ${EXAMPLEDIR}/%.cool Semant.class
scala ${SCALAFLAGS} CoolCompiler $<
.PHONY: %.debug
%.debug : ${EXAMPLEDIR}/%.cool Semant.class
scala ${SCALAFLAGS} CoolCompiler -s $<
COOLCOMPILERSCALA = 
cool-symbol.scala cool-symbol.handcode.scala cool-tree.scala 
cool-handcode.scala ${SCALACOPY} 
cool-dummy-semant-driver.scala ${SCALAHAND}
${SCALACOPY} :
echo "import cool_implicit._" | cat - ${COOLCOMPILERDIR}/$@ > $@
CoolParser.scala :
echo "import cool_implicit._" | cat - ${COOLCOMPILERDIR}/$@ > $@.tmp
sed 's/result.set_inheritablep(/t_Tree.s_inheritablep(result,/' 
< $@.tmp > $@
cool-parser-${SVERSION}.jar : ${COOLCOMPILERSCALA}
@rm -f *.class
${SCALAC} -deprecation ${SCALACFLAGS} ${COOLCOMPILERSCALA}
jar cvf $@ *.class
install: cool-parser-${SVERSION}.jar
cp cool-parser-${SVERSION}.jar ../../lib/.
clean:
rm -f *.class ${SCALAGEN} ${SCALACOPY} *.jar

错误:

Makefile:79: warning: overriding recipe for target 'CoolParser.scala'
Makefile:76: warning: ignoring old recipe for target 'CoolParser.scala'
make: Nothing to be done for 'src'.

这不是错误:如果是错误,构建就会失败。此生成成功。错误消息中包含***。这只是对makefile中一个奇怪的事情的警告。

要理解它,你只需要看看makefile中make抱怨的行,然后阅读它打印的消息。

您有这个变量集:

SCALACOPY= basic.scala A2I.scala 
CoolTokens.scala CoolScanner.scala CoolOptions.scala 
CoolParser.scala

所以这个变量包含CoolParser.scala

接下来在Makefile第76行,您将看到以下内容:

${SCALACOPY} :
echo "import cool_implicit._" | cat - ${COOLCOMPILERDIR}/$@ > $@

这定义了告诉make如何构建变量SCALACOPY中的所有目标(包括CoolParser.scala(的规则。

然后在Makefile第79行,您可以看到:

CoolParser.scala :
echo "import cool_implicit._" | cat - ${COOLCOMPILERDIR}/$@ > $@.tmp
sed 's/result.set_inheritablep(/t_Tree.s_inheritablep(result,/' 
< $@.tmp > $@

这告诉makeANOTHER规则也要构建CoolParser.scala,您已经为其提供了规则;make会删除第一条规则并使用第二条规则,但它也会给你一条警告信息,告诉你这件事,因为这很不寻常,通常不是你想做的:

Makefile:79: warning: overriding recipe for target 'CoolParser.scala'
Makefile:76: warning: ignoring old recipe for target 'CoolParser.scala'

最新更新