Makefile не устанавливает переменную среды GOOS

Ниже я пишу 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 в командной строке напрямую, это работает!

Каждая команда в song-build-lin выполняется в отдельной подоболочке. Добавьте точку с запятой ; и обратную косую черту `\` после каждой строки, чтобы сгруппировать выполнение в одной подоболочке

ifnotak 22.05.2019 11:26

Я изменил команды на set GOOS=linux;\ set GOARCH=amd64;\ , но все равно не работает!

Vahid Jafari 22.05.2019 12:00

Если вы используете msys/make, то ваша SHELL — это /bin/sh. Он имеет другой синтаксис для назначения переменных среды. т.е. удалить "набор".

Matt 22.05.2019 16:10

Или используйте env, например. env GOOS=linux GOARCH=amd64 $(GOBUILD)...

Adrian 22.05.2019 16:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
4
1 112
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я нашел ответ, наконец,

Я запускаю команду 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, я хотел бы учиться и совершенствоваться в этом.

Другие вопросы по теме