Ниже я пишу 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
в командной строке напрямую, это работает!
Я изменил команды на set GOOS=linux;\ set GOARCH=amd64;\
, но все равно не работает!
Если вы используете msys/make, то ваша SHELL — это /bin/sh. Он имеет другой синтаксис для назначения переменных среды. т.е. удалить "набор".
Или используйте env
, например. env GOOS=linux GOARCH=amd64 $(GOBUILD)...
Я нашел ответ, наконец,
Я запускаю команду make с помощью терминала VSCode, тип терминала, который я использовал, был командной строкой. Если вы измените тип терминала на Git bash, команды будут работать корректно.
Это отличные вопросы и отличная ветка.
Я вынужден использовать Windows в рабочих целях для разработки. У меня есть несколько товарищей по команде, которые используют Windows, и несколько человек, которые используют Mac, и пара человек, которые предпочли бы работать в Linux, но не могут, и у нас только что есть несколько серверов Linux, для которых нам нужно скомпилировать исполняемый файл. Недавно я наткнулся на сайт Makefile Tutorial https://makefiletutorial.com/, и там был раздел по экспорту переменных.
На моей машине с Windows я смог использовать оболочку cygwin.
Ниже приведена компиляция в файле make, который я смог использовать...
# 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, я хотел бы учиться и совершенствоваться в этом.
Каждая команда в
song-build-lin
выполняется в отдельной подоболочке. Добавьте точку с запятой;
и обратную косую черту `\` после каждой строки, чтобы сгруппировать выполнение в одной подоболочке