makefile - GNU Make 简单扩展变量和自动变量

标签 makefile go cross-compiling gnu-make

我有一个相当简单的 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 ...

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

最佳答案

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

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

关于makefile - GNU Make 简单扩展变量和自动变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18263144/

相关文章:

linux - make不删除中间文件

c - 缺少分隔符。使用 C 中的 Makefile 停止错误

shell - makefile shell 和管道

go - 为 Debian 打包 Go 应用程序

http - Go - 接受 http post 多部分文件

arm - eabihf hf代表什么?

eclipse - 在Eclipse中设置环境变量以与Android NDK一起使用

go - 将项目附加到最大大小 slice 时的附加行为

c++ - libcurl4-openssl-dev :armhf cannot be installed when libcurl4-openssl-dev is already installed

gcc - 为什么我不能使用GCC编译ARM BE8 ELF?