有条件不执行

问题描述 投票:0回答:1

我正在尝试根据原始主机所在的操作系统来执行不同的命令。该过程的一部分涉及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

我将感谢您指出我做错了什么。

docker makefile
1个回答
0
投票

这里的典型设置是为每个目标平台有一个单独的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)
© www.soinside.com 2019 - 2024. All rights reserved.