猿问

GNU 制作简单扩展变量和自动变量

我有一个用于 Go 项目的相当简单的 makefile,我希望能够运行类似于:make release-all


为了为几个不同的平台(例如 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 ...

因此,据我所知,:=这不会导致$@在分配时对其进行评估。这有可能以某种方式实现吗?如果没有,我基本上想要做的就是遍历操作系统列表中的每个项目,然后遍历每个体系结构,直到我构建了所有选项。如果不明确指定每个架构/操作系统组合,这至少是可能的吗?


慕哥9229398
浏览 186回答 1
1回答

猛跑小猪

假设您的命令有效,这将处理迭代:GOOSES = darwin windows linuxGOARCHS = amd64 386build:define templatebuild: 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)))))
随时随地看视频慕课网APP

相关分类

Go
我要回答