【问题标题】:Build dynamic targets for different architectures using make?使用 make 为不同架构构建动态目标?
【发布时间】:2019-06-01 14:07:50
【问题描述】:

我正在寻找一种基本迭代架构列表并使用 make 构建独特架构的方法。例如,我有一个包含所有架构的变量,以及当前的静态目标。

以下是我的(简化的)逻辑。

ALL_ARCHES=amd64 arm arm64  
VERSION=$(shell git symbolic-ref --short HEAD)-$(shell git rev-parse --short HEAD)

cmd/mything/mything: cmd/mything/*.go
            CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-X main.version=$(VERSION)" -o $@ cmd/mything/*.go
...

我基本上想通过迭代ALL_ARCHES 变量来替换GOARCH=amd64,创建一个代表给定架构的唯一二进制文件。

【问题讨论】:

    标签: go makefile build compilation gnu-make


    【解决方案1】:

    假设您接受将二进制文件命名为 cmd/mything/mything-ARCH,其中 ARCH 是目标架构,您可以尝试:

    ALL_ARCHES := amd64 arm arm64   
    VERSION    := $(shell git symbolic-ref --short HEAD)-$(shell git rev-parse --short HEAD)
    
    .PHONY: all
    
    all: $(addprefix cmd/mything/mything-,$(ALL_ARCHES))
    
    cmd/mything/mything-%: cmd/mything/*.go
        CGO_ENABLED=0 GOOS=linux GOARCH=$* go build -ldflags "-X main.version=$(VERSION)" -o $@ $^
    

    $* 是自动变量,在模式规则中扩展为目标名称的词干。

    【讨论】:

    • 看起来应该可以,当我运行它时,虽然我得到了make: Nothing to be done for 'all'.,但不确定为什么?
    • 我的头撞到墙上后,我发现我的变量是错误的。 ALL_ARCHES 应该是 amd64 arm arm64 而不是 $(amd64 arm arm64)
    • 对。我应该注意到这一点,而不是盲目地复制粘贴。在我的答案中修复。顺便说一句,我还将递归扩展变量更改为简单扩展变量。在您的情况下,它可能更可取(至少对于ALL_ARCHES)。我使用了$^ 自动变量,而不是在配方中重复cmd/mything/*.go
    • 谢谢!递归扩展和简单扩展有什么区别?
    • 对于这两种类型的变量,没有比GNU make manual 更好的解释了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多