【问题标题】:GNU Make Simply Expanded Variables and Automatic VariablesGNU 制作简单的扩展变量和自动变量
【发布时间】:2013-08-15 22:47:05
【问题描述】:

我有一个用于 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 ...

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

【问题讨论】:

  • 简单的答案是自动变量(例如$@)在先决条件列表中不可用,但是......真的不清楚你希望这个makefile如何工作。 GOOS=darwin GOARCH=386 go install... 这样的命令真的有效吗?
  • 是的,“...”显然现在已经被编辑了,但它对于构建 go 程序来说很好。

标签: makefile go cross-compiling gnu-make


【解决方案1】:

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

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)))))

【讨论】:

  • 太棒了,非常感谢,这就像一个魅力。什么是 $(1)_$(2) 语法/功能,以便我可以阅读更多内容?
  • @simpleproof:参见canned recipesthe call function 的手册部分。
猜你喜欢
  • 1970-01-01
  • 2023-01-23
  • 2013-07-01
  • 2018-02-09
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多