背景
最近研究了一下WrieGuard, 研究的第一步是先部署一个环境试用一下。在Debian 11 x64上部署的服务器环境,Windows上有安装包下载。这些使用都没有问题。但在Apple的终端上遇到问题了。App Store上在中国区没有这个软件。
官方提供了源码可以自己编译。
编译问题
执行shell脚本
go env -w GO111MODULE = "on"
go env -w GOPROXY = "https://goproxy.cn,direct"
这个脚本是方便安装依赖模块
在Intel芯片上编译没有问题, 但是在Apple Silicon芯片(实际使用的是 M2)上编译失败
提示信息为
Command ExternalBuildToolExecution failed with a nonzero exit code
问题分析
问题详细信息见下图
WireGuardGoBridgemacOS是一个makefile管理的项目
打开对应的makefile文件,初步确定
[ -n "" ] 这个显示就是错误的原因, 对应的源码为 [ -n "$(REAL_GOROOT)" ]
这说明REAL_GOROOT这个变量有问题
这个变量的来源是
REAL_GOROOT := $(shell go env GOROOT 2>/dev/null)
在shell里(系统默认的zsh)执行go env GOROOT, 是没有问题的.
但是在makefile里却有问题。 这个问题的原因目前我不清楚, 虽然已经设置了Path. 后续有时间时, 要研究一下make里的shell函数.
临时方案
这个问题的根本原因是makefile文件找不到go
目前,我有一个临时解决方案
把makefile中的go 替换为/opt/homebrew/bin/go
这样就可以了(目前一共只有两处)
解决方案
修改Sources/WireGuardKitGo/Makefile文件
把12行 内容为
export PATH := $(PATH):/usr/local/bin:/opt/homebrew/bin
修改为
PATH := $(PATH):/usr/local/bin:/opt/homebrew/bin
SHELL := env PATH=$(PATH) /bin/bash