我正在尝试根据原始主机所在的操作系统来执行不同的命令。该过程的一部分涉及docker构建,因此我认为使用$(OS)
字符串不会有所帮助。
我当前的想法是在我的make文件中将环境变量设置为uname并将其作为环境变量传递给docker compose
copy:
cp docker-compose.override.yml.dist docker-compose.override.yml
cp .env.dist .env
dev: copy restart
docker-compose exec cli sh
create: export TARGET=$(shell sh -c uname)
create: copy restart
TARGET="$(TARGET)" docker-compose exec -T cli make build
echo $(TARGET)
echo $(TARGET)
build: export TARGET=$(shell sh -c uname)
build:
ifeq ($(TARGET),Darwin)
cp terra/static.go.dist terra/static.go
go run builder/main.go
rm -rf coverage.out
rm -rf dist/${CLI_VERSION}/osx
mkdir -p dist/${CLI_VERSION}/osx
GOOS=darwin GOARCH=amd64 CGO_ENABLED=0 go build -a -installsuffix cgo -o dist/${CLI_VERSION}/osx/mjolnir
ls -la dist/${CLI_VERSION}/osx/mjolnir
endif
不幸的是,这失败,并显示以下输出:
TARGET="Darwin" docker-compose exec -T cli make build
make: Nothing to be done for 'build'.
echo Darwin
Darwin
echo Darwin
Darwin
我将感谢您指出我做错了什么。
这里的典型设置是为每个目标平台有一个单独的Make目标。
TARGET := $(shell uname)
build: build-$(TARGET)
build-Darwin:
...
GOOS=darwin go build ...
一旦有了,就可以在命令中显式指定该构建目标。
create: copy restart
docker-compose run cli make build-$(TARGET)
您还可以将Make变量作为命令行参数传递,这比环境变量更容易通过Docker层。
create: copy restart
docker-compose run cli make build TARGET=$(TARGET)