从项目 Makefile 中检测 GOPATH

ana*_*nik 1 makefile go

如果GOPATH不设置,go程序编译是不可能的。但是许多go项目是使用 Makefile 构建的,因为go还缺少提取git修订、设置版本等的功能。因此应该可以自动从 Makefile 检测 GOPATH。

假设我手动设置了我的 GOPATH 一次go get -d

go get -d github.com/zyedidia/micro/cmd/micro
Run Code Online (Sandbox Code Playgroud)

现在,如果我打开另一个会话,cd进入github.com/zyedidia/micro/cmd/micro并执行make build,构建将失败:

...
cmd/micro/micro.go:20:2: cannot find package "layeh.com/gopher-luar" in any of:
    /usr/lib/go-1.7/src/layeh.com/gopher-luar (from $GOROOT)
    ($GOPATH not set)
Makefile:15: recipe for target 'build' failed
make: *** [build] Error 1
Run Code Online (Sandbox Code Playgroud)

那么,如果GOPATH没有设置,我该如何设置它Makefile并确保此时有go环境?

这不起作用:

GOPATH ?= ../../../..
Run Code Online (Sandbox Code Playgroud)

更新:以下代码有效,但未检测到父目录包含src,binpkgdirs。

export GOPATH ?= $(abspath $(dir ../../../../..))
Run Code Online (Sandbox Code Playgroud)

export需要变换make变量到环境变量,?=make只有它的变量没有设置,abspathdir描述如下:

小智 9

我遇到了同样的问题,这是我的解决方案:

ifndef $(GOPATH)
    GOPATH=$(shell go env GOPATH)
    export GOPATH
endif
Run Code Online (Sandbox Code Playgroud)