Makefile未设置GOOS环境变量

4
我编写了以下Makefile,用于构建适用于不同平台的 Golang 代码。(我的操作系统是 Windows 10,通过命令提示符运行 Makefile)
GOCMD   =  go
GOBUILD =  $(GOCMD)  build
GOFILES =   $(wildcard *.go)
SONG_PATH =  ./song-service
SONG_PATH_OUTPOUT =  ./song-service/cmd
SONG_BINARY_NAME_LIN =  songservice_lin

song-build-lin:
    set GOOS=linux
    set GOARCH=amd64
    $(GOBUILD)  -o "$(SONG_PATH_OUTPOUT)/$(SONG_BINARY_NAME_LIN)" -v "$(SONG_PATH)/$(GOFILES)"

当我运行make song-build-lin时,它没有错误地运行,但GOOS变量未设置。 但是,当我直接在命令提示符中运行set GOOS = linux时,它可以工作!

3
song-build-lin 中的每个命令都在单独的子 shell 中执行。在每行末尾添加分号 ; 和反斜杠 \\ 将多个命令组合到一个子 shell 中。 - ifnotak
1
我将命令更改为set GOOS=linux;\ set GOARCH=amd64;\,但仍然无法工作! - Vahid Jafari
2
如果您正在使用msys/make,则您的SHELL是/bin/sh。它有不同的语法来分配环境变量,即删除“set”。 - Matt
1
或者使用 env,例如 env GOOS=linux GOARCH=amd64 $(GOBUILD)... - Adrian
2个回答

4

我终于找到了答案,

我使用了VSCode终端运行make命令,而我使用的终端类型是命令提示符。如果你将终端类型更改为Git bash,则命令将正常工作。


我在使用Git Bash运行命令set GOOS=linux,但它没有起作用, 后来我找到了另一个答案,在命令提示符上运行以下命令: go env -w GOOS=linux 这对我有用。 - AJAY MAURYA

1
这是一个很好的问题和讨论。我被迫在工作中使用Windows进行开发。我的几个队友使用Windows,还有几个人想用Linux工作但无法做到,我们刚刚得到了一些需要编译可执行文件的Linux服务器。最近我发现了Makefile教程网站https://makefiletutorial.com/,他们有一个关于导出变量的部分。在我的Windows机器上,我能够使用shell,cygwin。下面是我能够使用的Makefile编译...

# compile - cross compile all platforms
compile:
    @echo " === Compiling for every OS and Platform === "
    make compile-linux
    make compile-win 
    make compile-mac
    @echo " === COMPLETED! === "

# compile-linux - compile and create a linux executable for 64bit architecture
# NOTE: this sets the GOOS and GOARCH just for this makefile rule
compile-linux: export GOOS=linux
compile-linux: export GOARCH=amd64
compile-linux:
    go build -o bin/executable-linux.exe

# compile-win - compile and create a windows executable for 64bit architecture 
compile-win: export GOOS=windows
compile-win: export GOARCH=amd64
compile-win:
    go build -o bin/executable-win.exe

# compile-mac - compile and create a mac os executable for 64bit architecture 
compile-mac: export GOOS=darwin
compile-mac: export GOARCH=amd64
compile-mac:
    go build -o bin/executable-mac

这对我来说似乎有效,使用PowerShell 7和/或Windows命令行,以及使用MacOS的我的团队成员。
这是通用的,可以在几乎任何地方添加使用。

对于这个解决方案(尽管已经有2年以上的答案),可能是这样的...

GOCMD   =  go
GOBUILD =  $(GOCMD)  build
GOFILES =   $(wildcard *.go)
SONG_PATH =  ./song-service
SONG_PATH_OUTPOUT =  ./song-service/cmd
SONG_BINARY_NAME_LIN =  songservice_lin

song-build-lin: export GOOS=linux
song-build-lin: export GOARCH=amd64
song-build-lin:
    $(GOBUILD)  -o "$(SONG_PATH_OUTPOUT)/$(SONG_BINARY_NAME_LIN)" -v "$(SONG_PATH)/$(GOFILES)"

我希望知道这对你和其他人是否有效,如果有其他改进的地方,请告诉我。我不是一个非常擅长Makefile的人,我很想学习和改进它。

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