特定目标的Makefile环境变量

时间:2019-05-06 15:15:59

标签: go makefile

我正在研究一个go项目,该项目具有如下所示的Makefile。请注意,“发布”目标设置了两个环境变量,以便“构建”目标针对特定体系结构(可能不是构建系统的体系结构)进行交叉编译。

# Generates a container release artifact.
release: export GOOS=linux
release: export GOARCH=amd64
release: build
  docker build ...

# Generates an executable for local use.
build: test
  go build ...

test: fmt vet
  go test ./...

...

问题在于,“去测试”命令也检测到GOOSGOARCH的环境变量,导致该步骤从cross-platform testing apparently is not supported开始失败。

换句话说,这就像我要清除“测试”目标的环境变量,但是下面的示例似乎并未按预期取消设置变量:

unexport GOOS
unexport GOARCH
test: fmt vet
    go test ./...

我可以删除“构建”目标的“测试”依赖关系,它可以正常工作,但这似乎是错误的方法,因为如果测试失败,我不想构建或发布二进制文件。

我可以以某种方式修改Makefile,以使GOOSGOARCH环境变量由“发布”目标设置并由“构建”目标使用,而不由从属“测试”目标使用吗?

也许还有其他方法可以交叉编译以发布并仍将测试作为依赖项运行,而不会使事情复杂化(例如通过Docker进行构建等)?请注意,由于发布和构建目标有多个标志,因此make目标比上面的示例要复杂一些。

3 个答案:

答案 0 :(得分:1)

为什么不做这样的事情?它只会在执行go期间设置这些环境变量。

    # Generates a container release artifact.
release: build
  docker build ...

# Generates an executable for local use.
build: test
  GOOS=linux GOARCH=amd64 go build ...

test: fmt vet
  go test ./...

...

答案 1 :(得分:1)

我会这样:

non_local_traffic: yes

答案 2 :(得分:0)

我只是意识到我可以在麻烦的测试命令本身中取消设置环境变量:

test: fmt vet
    GOOS= GOARCH= go test ./...

通过这种方式,“ go test”命令将始终使用本地系统的操作系统和体系结构(应如此!)。

Thx @KonstantinItskov获得灵感