Makefile:21: *** 在第一个目标之前开始配方。停止。

4

我正在尝试构建一个make文件来从快照遥测加载插件...当我使用命令sudo make build时,它显示了Makefile:21: *** recipe commences before first target. Stop.这个错误...在make文件中,我添加了

export GOROOT=/usr/local/go
export GOPATH=/home/intel/Downloads/snap-tele/gopath
export PATH=$PATH:/usr/local/go/bin:/home/intel/Downloads/snap-tele/gopath/src/github.com/Masterminds/glide
echo $PATH

当我执行 cat -e -t -v Makefile 命令时,我的 makefile 文件如下所示,其中 ^I 表示制表符,$ 表示行尾符:
^Iexport GOROOT=/usr/local/go$
^Iexport GOPATH=/home/intel/Downloads/snap-tele/gopath$
^Iexport PATH=$PATH:/usr/local/go/bin:/home/intel/Downloads/snap-tele/gopath/src/github.com/Masterminds/glide$
^Iecho $PATH$
$
default:$
^I$(MAKE) deps$
^I$(MAKE) all$
deps:$
^Ibash -c "./scripts/deps.sh"$
test:$
^Ibash -c "./scripts/test.sh $(TEST_TYPE)"$
test-legacy:$
^Ibash -c "./scripts/test.sh legacy"$
test-small:$
^Ibash -c "./scripts/test.sh small"$
test-medium:$
^Ibash -c "./scripts/test.sh medium"$
test-large:$
^Ibash -c "./scripts/test.sh large"$
test-all:$
^I$(MAKE) test-small$
^I$(MAKE) test-medium$
^I$(MAKE) test-large$
check:$
^I$(MAKE) test$
all:$
^Ibash -c "./scripts/build.sh"$
$

可能出现的问题在哪里?据我所知,我已经给出了正确的制表位。
1个回答

1

几点需要注意:首先,将期望的目标/配方制定为以下形式:

target: [deps...]
<tab> recipe 1
<tab> recipe 2

只有当目标需要重新构建时,它才会运行配方。您没有指定目标,但是您确实指定了以制表符开头的行(配方)。Make正在抱怨您没有目标的配方(正如它应该的那样)。
然而,话虽如此,似乎您不希望将您的行作为配方的一部分运行(无论如何都不会起作用,因为导出的变量不能在一个配方行和另一个配方行之间或目标之间记住)。
您可能想要执行以下操作:
export GOROOT=/usr/local/go
export GOPATH=/home/intel/Downloads/snap-tele/gopath
export PATH:=${PATH}:/usr/local/go/bin:/home/intel/Downloads/snap-tele/gopath/src/github.com/Masterminds/glide
$(info PATH=${PATH})

没有任何前置制表符。缺少制表符意味着make将在make解析阶段将命令解释为makefile解释器的一部分。请注意,echo是一个shell命令,make无法理解,因此我用make的$(info ...)替换了它,这是等效的。

编辑:抱歉,我错过了对$PATH的访问--Make会将其解释为$P后面跟着字面上的ATH。在这种情况下,您应该使用${PATH}。您还应该使用:=而不是=以避免递归赋值(参见https://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_6.html#SEC59


export是一个make指令,它将导出的变量提供给所有子进程,特别是子make。OP显然将其与shell的export混淆了,但它很可能适合预期的目的。 - Mike Kinghan
makefile中的export指令还允许shell访问变量。因此,执行export XX:=yy后,再执行all:; echo $$XX将输出yy - HardcoreHenry
(虽然我刚刚检查过,但无法确认这是否适用于旧的或非GNU制造商) - HardcoreHenry
1
我尝试了你们说的一切...但仍然是同样的错误。 - yashaswini jayshankar
你使用的make版本是什么(make --version)? - HardcoreHenry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接