首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Makefile项目中检测GOPATH

从Makefile项目中检测GOPATH
EN

Stack Overflow用户
提问于 2017-07-23 02:54:35
回答 2查看 4K关注 0票数 1

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

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

代码语言:javascript
复制
go get -d github.com/zyedidia/micro/cmd/micro

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

代码语言:javascript
复制
...
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

因此,如果没有设置GOPATH,我如何从Makefile中设置它,并确保此时存在go环境?

这不管用:

代码语言:javascript
复制
GOPATH ?= ../../../..

UPDATE:下面的代码工作,但它没有检测到父目录包含srcbinpkg dirs。

代码语言:javascript
复制
export GOPATH ?= $(abspath $(dir ../../../../..))

需要exportmake变量转换为环境变量,?=make变量仅为未设置的变量,abspathdir在此描述:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-23 07:09:33

这是解决办法。

代码语言:javascript
复制
# detect GOPATH if not set
ifndef $(GOPATH)
    $(info GOPATH is not set, autodetecting..)
    TESTPATH := $(dir $(abspath ../../..))
    DIRS := bin pkg src
    # create a ; separated line of tests and pass it to shell
    MISSING_DIRS := $(shell $(foreach entry,$(DIRS),test -d "$(TESTPATH)$(entry)" || echo "$(entry)";))
    ifeq ($(MISSING_DIRS),)
        $(info Found GOPATH: $(TESTPATH))
        export GOPATH := $(TESTPATH)
    else
        $(info ..missing dirs "$(MISSING_DIRS)" in "$(TESTDIR)")
        $(info GOPATH autodetection failed)
    endif
endif

我学到的是:

  • 变量在单独的块中定义。
  • 在定义变量的块中不允许使用选项卡。
  • echo在这个块中不工作,需要使用$(info)
票数 0
EN

Stack Overflow用户

发布于 2017-12-19 02:23:19

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

代码语言:javascript
复制
ifndef $(GOPATH)
    GOPATH=$(shell go env GOPATH)
    export GOPATH
endif
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45261101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档