首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Stockfish 13从Windows10交叉编译到armv8?

如何将Stockfish 13从Windows10交叉编译到armv8?
EN

Stack Overflow用户
提问于 2021-02-22 01:57:27
回答 1查看 313关注 0票数 0

2021年2月19日发布的Stockfish 13是目前我写这几行文字时最强大的国际象棋引擎。你可以在windows,linux,mac os和android上下载它。然而,在我写这些代码的时候,android二进制文件的下载链接指向Stockfish 12而不是13。(这种情况经常发生在Stockfish上,因为android二进制文件并不是人们最需要的。)由于Stockfish是开源的(github here),我们如何在windows10电脑上为Android手机交叉编译Stockfish 13?(在我的例子中,是一台运行安卓11的三星Galaxy S21 Ultra。)

EN

回答 1

Stack Overflow用户

发布于 2021-02-22 01:57:27

我们需要源代码:git clone https://github.com/official-stockfish/Stockfish.git (请参阅Stockfish's github的正确地址,因为此地址可能会更改)在您的PC上。(例如,您需要Tortois Git的命令行实用程序。)让我们调用PC上StockFish文件夹(包含src作为子文件夹)的完整路径StockFishDIr

我们还需要一个交叉编译器来...交叉编译(!)将PC上的源代码转换为针对安卓操作系统的可执行文件,这意味着:可在Android操作系统上执行,即在手机上可执行。我们将使用Android-NDK,它包含工具链和交叉编译器。我们下载“最新稳定版本”的r22 (就在我写这几行代码的时候),并将其解压缩到PC上的一个文件夹中;我将PC上这个目录的完整路径(包含buildmetaprebuilttoolchains等文件夹)称为"AndroidNdkDir“。

最后,由于Stockfish的源代码中只有一个Makefile,我们需要在windows下使用make。是。只需从GnuWin32获取它,并注意您PC上的安装目录,其中包含包含make.exebin文件夹。线性分析MakeFile表明,如果下载了某个文件,交叉编译可以归结为只有一个命令行,而另一个“优化”命令行。

现在我们看一下来自StockFishDIr\srcMakeFile;我们将对其稍作修改。

首先,我们通过更改行来更改可执行文件的名称

代码语言:javascript
复制
EXE = stockfish

转到

代码语言:javascript
复制
EXE = stockfish_13_armv8_xcomp_win10x64

给它起一个有意义的名字。

其次,我们定位与编译器相关的armv8 (它是三星Galaxy S21 Ultra的ARCH;如果你有另一部安卓手机,也许你应该查找'armv7‘并相应地调整如下内容):即,我们替换位

代码语言:javascript
复制
    ifeq ($(arch),armv8)
        CXX=aarch64-linux-android21-clang++
        STRIP=aarch64-linux-android-strip
    endif

使用

代码语言:javascript
复制
    ifeq ($(arch),armv8)
        CXX=AndroidNdkDir\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android30-clang++.cmd
        STRIP=AndroidNdkDir\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android-strip.exe
endif
    endif

(请注意,我用android30替换了CXX行中的初始android21。这是因为Samung Galaxy s21 Ultra运行的是安卓11,其真实版本号是android30。如果您的android手机安装了其他android版本,请相应地调整行数。)

现在,在编译之前,我们需要最后一个部分: net文件(技术上,net = networks = neural network = Stockfish操作的神经网络的权重文件)。“正常”(啊啊),在linux的设置下(我在这里所做的工作几乎在Linux上做了必要的改动),我们只会做一个"MakeDir\bin\make.exe" profile-build ARCH=x86-64,它会在需要的地方下载网络文件,我们甚至不会麻烦它。遗憾的是,由于某些原因,在这里运行"MakeDir\bin\make.exe" profile-build ARCH=x86-64不起作用,我们需要手动下载网络文件。因此,我们必须在Makefile中查找net文件是如何下载的。Makefile中重要的一点是:

代码语言:javascript
复制
# evaluation network (nnue)
net:
    $(eval nnuenet := $(shell grep EvalFileDefaultName evaluate.h | grep define | sed 's/.*\(nn-[a-z0-9]\{12\}.nnue\).*/\1/'))
    @echo "Default net: $(nnuenet)"
    $(eval nnuedownloadurl := https://tests.stockfishchess.org/api/nn/$(nnuenet))
    $(eval curl_or_wget := $(shell if hash curl 2>/dev/null; then echo "curl -skL"; elif hash wget 2>/dev/null; then echo "wget -qO-"; fi))
    @if test -f "$(nnuenet)"; then \
            echo "Already available."; \
        else \
            if [ "x$(curl_or_wget)" = "x" ]; then \
            echo "Automatic download failed: neither curl nor wget is installed. Install one of these tools or download the net manually"; exit 1; \
            else \
            echo "Downloading $(nnuedownloadurl)"; $(curl_or_wget) $(nnuedownloadurl) > $(nnuenet);\
            fi; \
        fi;
    $(eval shasum_command := $(shell if hash shasum 2>/dev/null; then echo "shasum -a 256 "; elif hash sha256sum 2>/dev/null; then echo "sha256sum "; fi))
    @if [ "x$(shasum_command)" != "x" ]; then \
        if [ "$(nnuenet)" != "nn-"`$(shasum_command) $(nnuenet) | cut -c1-12`".nnue" ]; then \
                echo "Failed download or $(nnuenet) corrupted, please delete!"; exit 1; \
            fi \
        else \
            echo "shasum / sha256sum not found, skipping net validation"; \
        fi

我们看到文件的地址是https://tests.stockfishchess.org/api/nn/$(nnuenet)),并且变量nnuenet是通过在头文件evaluate.h (在StockFishDIr\src中)中grep字符串EvalFileDefaultName来定义的,感兴趣的行是:

代码语言:javascript
复制
#define EvalFileDefaultName   "nn-62ef826d1a6d.nnue"

因此,变量nnuenet等于字符串"nn-62ef826d1a6d.nnue“,我们要手动下载网络的地址是https://tests.stockfishchess.org/api/nn/nn-62ef826d1a6d.nnue

当然,这个地址在未来可能会改变,但您可以看到它的想法。现在,我们将网络文件放入StockFishDIr\src

现在,我们准备进行交叉编译,使用以下命令在StockFishDIr\src中执行:

代码语言:javascript
复制
"MakeDir\bin\make.exe" stockfish_13_armv8_xcomp_win10x64 COMP=ndk COMPCC="AndroidNdkDir\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android30-clang --target=aarch64-linux-android30" ARCH=armv8

(这里也可以根据你的安卓手机来调整aarch64-linux-android30的功能。)

当前面的命令正确执行时,它会在StockFishDIr\src文件夹中生成stockfish_13_armv8_xcomp_win10x64二进制文件。这个二进制文件已经可以在你的手机上使用了(例如,把它放在你的DroidFish应用程序的DroidFish\uci文件夹中),但它并不是最优的,因为它太大了,而且执行起来有点慢。因此,我们必须使用以下命令行“剥离”二进制文件,仍然在StockFishDIr\src文件夹中:

"AndroidNdkDir\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android-strip“stockfish_13_armv8_xcomp_win10x64

(现在不再有android30了,但还是有一款aarch64:根据你的安卓手机适配aarch64-linux-android30吧。)

现在,您的二进制文件stockfish_13_armv8_xcomp_win10x64完全可以使用了。你可以在你的手机上和StockFish 13玩国际象棋,然后受罪!;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66305360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档