如何让 Wireguard-Android make 文件在 Windows 上运行?
Posted
技术标签:
【中文标题】如何让 Wireguard-Android make 文件在 Windows 上运行?【英文标题】:How do I get Wireguard-Android make file to function on Windows? 【发布时间】:2020-05-25 23:37:44 【问题描述】:我正在尝试在我的 Windows 机器上构建 wireguard-android 源,通过反复试验逐步解决问题。
我安装了 CMake 和 Make,我遇到的第一个问题是 uname
(mingw64) 报告的“错误”值,与 Google 托管的 golang filenames 不匹配。
我已编辑(破解)make 文件以指向 Windows 版本 (amd64) 的真实文件名。问题是 Windows 版本的扩展名为 .zip
而不是 .tar.gz
,并且 zip 的结果似乎与管道命令不兼容。
原始命令:
curl "https://dl.google.com/go/go$(DESIRED_GO_VERSION).$(shell uname -s | tr '[:upper:]' '[:lower:]')-$(NDK_GO_ARCH_MAP_$(shell uname -m)).tar.gz" | tar -C "$(dir $@)" --strip-components=1 -xzf -
我尝试的更改: (使用 if-else 是因为它还需要在 mac 上运行)
ifeq "msys" "$(shell uname -o | tr '[:upper:]' '[:lower:]')"
# Note: when enclosed in the ifeq, the ARCH_MAP part no longer worked
# Note: using tar with the zip fails, because we cant untar a zip (signal 13)
# Note: using unzip with the zip fails with confusing paths
curl "https://dl.google.com/go/go$(DESIRED_GO_VERSION).windows-amd64.zip" | unzip -C "$(dir $@)" --strip-components=1 -xzf -
else
curl "https://dl.google.com/go/go$(DESIRED_GO_VERSION).$(shell uname -s | tr '[:upper:]' '[:lower:]')-$(NDK_GO_ARCH_MAP_$(shell uname -m)).tar.gz" | tar -C "$(dir $@)" --strip-components=1 -xzf -
endif
如果使用解压缩会导致错误:
解压:找不到或打开 C:\wireguard-android\app\build\intermediates\cmake\debug\obj\armeabi-v7a/../generated-src/go-1.13.7/, C:\wireguard -android\app\build\intermediates\cmake\debug\obj\armeabi-v7a/../generated-src/go-1.13.7/.zip 或 C:\wireguard-android\app\build\intermediates\cmake\调试\obj\armeabi-v7a/../generated-src/go-1.13.7/.ZIP.
% Total % Received % Xferd 平均速度 时间 时间 时间 当前 下载上传总花费的剩余速度
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 127M 0 5419 0 0 26694 0 1:23:47 --:--:-- 1:23:47 26694
curl: (23) 书写体失败 (34 != 1357)
make: *** [C:\wireguard-android\app\build\intermediates\cmake\debug\obj\armeabi-v7a/../generated-src/go-1.13.7/.prepared] 错误 9
使用 tar 会导致错误:
curl "https://dl.google.com/go/go1.13.7.windows-amd64.zip" | tar -C "C:\wireguard-android\app\build\intermediates\cmake\debug\obj\armeabi-v7a/../generated-src/go-1.13.7/" --strip-components=1 -xzf -
% Total % Received % Xferd 平均速度 Time Time Time 当前 Dload Upload Total 花左速度
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0gzip: stdin 有多个条目--rest 被忽略 焦油:孩子死于信号 13 tar:错误不可恢复:现在退出
0 127M 0 108k 0 0 248k 0 0:08:47 --:--:-- 0:08:47 248k
curl: (23) 书写体失败 (738 != 1357)
make: *** [C:\wireguard-android\app\build\intermediates\cmake\debug\obj\armeabi-v7a/../generated-src/go-1.13.7/.prepared] 错误 2
我应该如何让这个命令工作? (使用 tar 或 zip/解压缩) 有人向我指出,也许我需要的是 Android 发行版,而不是 Windows 发行版。在那种情况下,我会假设我需要 armeabi-v7a,但我只能看到 ARMv6 和 ARMv8 包。我应该使用什么发行版?
【问题讨论】:
【参考方案1】:我已经设法解决了这个问题,我正在回答我自己的问题而不是删除,因为我认为这最终会帮助另一个开发人员。
首先澄清一下:
您似乎应该包含目标平台的 Go 库(即 Android 的 ARM),但如果您尝试这样做,您将收到错误,即在构建时文件不可执行。 (所以构建平台就是要匹配的版本,即这里的Windows) 由于 Google 以 Zip 格式提供 Windows 库(而其他平台为 tar.gz),因此您不能使用tar
命令。
由于无法从 curl 流中读取 zip(索引位于文件末尾),您需要下载文件然后解压缩。有人建议使用jar
命令,但是这在 cmake/make 中不起作用
zip 文件将被解压缩到您选择的任何路径内的子目录“go”中。因此,您需要修改路径
Windows 上的某些命令不接受 ..
作为路径中间,因此我不得不修改 CMakeLists 文件以使用绝对路径
Makefile 的更改结尾:(从 .prepared/mkdir 语句之后)
# Warning the (lack-of) indentation here is critical https://***.com/a/4483467/984830
# Note: I've hardcoded the windows filename below, so you'll need to do an `if` (like in my question) if you want to support other platforms as well
curl -o "$(BUILDDIR)/go-$(DESIRED_GO_VERSION)/gofile.zip" "https://dl.google.com/go/go$(DESIRED_GO_VERSION).windows-amd64.zip"
unzip -o "$(BUILDDIR)/go-$(DESIRED_GO_VERSION)/gofile.zip" -d "$(dir $@)"
rm -f "$(BUILDDIR)/go-$(DESIRED_GO_VERSION)/gofile.zip"
patch -p1 -f -N -r- -d "$(dir $@)go/" < goruntime-boottime-over-monotonic.diff
touch "$@"
$(DESTDIR)/libwg-go.so: export PATH := $(BUILDDIR)/go-$(DESIRED_GO_VERSION)/go/bin/:$(PATH)
$(DESTDIR)/libwg-go.so: $(BUILDDIR)/go-$(DESIRED_GO_VERSION)/.prepared go.mod
go build -tags linux -ldflags="-X golang.zx2c4.com/wireguard/ipc.socketDirectory=/data/data/$(ANDROID_PACKAGE_NAME)/cache/wireguard" -v -trimpath -o "$@" -buildmode c-shared
CMakeLists 文件的更改结尾:(替换 add_custom_target 部分)
# added a new variable to get the parent dir without using .. in the path
get_filename_component(destdirparent "$CMAKE_LIBRARY_OUTPUT_DIRECTORY/.." ABSOLUTE)
# referred to the variable on the last line of this statment
add_custom_target(libwg-go.so WORKING_DIRECTORY "$CMAKE_CURRENT_SOURCE_DIR/libwg-go" COMMENT "Building wireguard-go" VERBATIM COMMAND make
ANDROID_ARCH_NAME=$ANDROID_ARCH_NAME
ANDROID_C_COMPILER=$ANDROID_C_COMPILER
ANDROID_TOOLCHAIN_ROOT=$ANDROID_TOOLCHAIN_ROOT
ANDROID_LLVM_TRIPLE=$ANDROID_LLVM_TRIPLE
ANDROID_SYSROOT=$ANDROID_SYSROOT
ANDROID_PACKAGE_NAME=$ANDROID_PACKAGE_NAME
CFLAGS=$CMAKE_C_FLAGS\ -Wno-unused-command-line-argument
LDFLAGS=$CMAKE_SHARED_LINKER_FLAGS\ -fuse-ld=gold
DESTDIR=$CMAKE_LIBRARY_OUTPUT_DIRECTORY
BUILDDIR=$destdirparent/generated-src
)
原始文件在此处供参考:Makefile & CMakeLists 并在 Github 上镜像
【讨论】:
如果您可以包含您已更改的代码的确切部分,那将非常有帮助。 “从 .prepared/mkdir 语句之后”不够清楚。 对不起@ataravati,我会做出改变以澄清这一点,但已经太久了,我也不记得了。 (我经历了多次反复试验和错误)。然而,上面的示例是完整的工作更改 实际上,我想通了。我现在唯一的问题是我不知道如何在 Windows 上使用 Linux 命令运行 Makefile。这是我需要使用的make.exe
的特定版本吗?
我不记得版本,但我认为这并不重要,或者通常我会在答案中包含它。要运行它,我认为它是我安装的 GnuWin32
好的,谢谢!我会想办法的。以上是关于如何让 Wireguard-Android make 文件在 Windows 上运行?的主要内容,如果未能解决你的问题,请参考以下文章