英文:
GNU Make Simply Expanded Variables and Automatic Variables
问题
我有一个相当简单的Go项目的makefile,我想要能够运行类似于:
make release-all
以便为几个不同的平台(例如Windows、Linux、Darwin)构建发布版本。
我的makefile目前看起来是这样的:
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 ...
所以据我所知,:=
没有导致$@
在赋值时被评估。有没有可能以某种方式实现这个?如果不行,我基本上只想在每个操作系统列表中迭代每个项目,然后在构建所有选项之前迭代每个架构。这样做是否可能,而不需要明确指定每个架构/操作系统组合?
英文:
I have a fairly simple makefile for a Go project and I want to be able to run something akin to:
make release-all
in order to build releases for a couple of different platforms (e.g. windows, linux, darwin).
My make file currently looks like this:
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 ...
When I actually try to build though, I get:
GOOS= GOARCH= go install ...
So as far as I can tell the :=
isn't causing the $@
to be evaluated on assignment. Is this possible to acheive somehow? If not, all I basically want to do is iterate over each item in list of OS'es and then over each of the architectures until I've built all the options. Is that at least possible without specifying each architecture/os combo explicitly?
答案1
得分: 2
假设你的命令有效,这将处理迭代:
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)))))
假设您的命令有效,这将处理迭代:
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)))))
英文:
Assuming that your command works, this will handle the iteration:
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)))))
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论