对于Go项目,我有一个非常简单的makefile,并且我希望能够运行类似于以下内容的文件:
全部发布

为了为两个不同的平台(例如Windows,Linux,darwin)构建版本。

我的make文件当前如下所示:

GOOSES = darwin windows linux
GOARCHS = amd64 386
.PHONY: release-all $(GOOSES) $(GOARCHS)
release: $(GOOSES)

$(GOOSES): GOOS := app $@
$(GOOSES): $(GOARCHS)

$(GOARCHS): GOARCH := $@
$(GOARCHS): build

build:
GOOS=$(GOOS) GOARCH=$(GOARCH) go install ...

当我实际尝试构建时,我得到:
GOOS= GOARCH= go install ...

因此,据我所知:=不会导致$@在赋值时进行评估。这可能以某种方式达到吗?如果没有,我基本上要做的就是遍历OS列表中的每个项目,然后遍历每种体系结构,直到构建完所有选项为止。至少在没有明确指定每个体系结构/操作系统组合的情况下,这是否可能?

最佳答案

假设您的命令有效,它将处理迭代:

GOOSES = darwin windows linux
GOARCHS = amd64 386

build:

define template
build: build_$(1)_$(2)
.PHONY: build_$(1)_$(2)
build_$(1)_$(2):
    GOOS=$(1) GOARCH=$(2) go install ...
endef

$(foreach GOARCH,$(GOARCHS),$(foreach GOOS,$(GOOSES),$(eval $(call template,$(GOOS),$(GOARCH)))))

07-27 20:05