【问题标题】:How to cross-compile Stockfish 13 from windows 10 to armv8?如何将 Stockfish 13 从 Windows 10 交叉编译到 armv8?
【发布时间】:2021-02-21 17:57:26
【问题描述】:

Stockfish13,发布于 2021 年 2 月 19 日,是我写这几行时最强大的国际象棋引擎。您可以为 windows、linux、mac os 和 android 下载它。然而,在我写这些行的时候,android二进制文件下载链接指向Stockfish 12而不是13。(Stockfish经常发生这种情况,因为android二进制文件不是人们最需要的。)因为Stockfish是开源的( github here),我们如何在 Windows 10 计算机上为 Android 手机交叉编译 Stockfish 13 ? (就我而言,是运行 Android 11 的三星 Galaxy S21 Ultra。)

【问题讨论】:

    标签: android makefile android-ndk windows-10 cross-compiling


    【解决方案1】:

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

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

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

    现在我们从StockFishDIr\srcMakeFile;我们会稍微修改一下。

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

    EXE = stockfish
    

    进入

    EXE = stockfish_13_armv8_xcomp_win10x64
    

    给它一个有意义的名字。

    其次,我们定位armv8的出现(它是三星Galaxy S21 Ultra的ARCH;如果你有另一部Android手机,也许你应该寻找'armv7'并因此适应以下内容)关于编译器:即我们替换位

        ifeq ($(arch),armv8)
            CXX=aarch64-linux-android21-clang++
            STRIP=aarch64-linux-android-strip
        endif
    

        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
    

    (请注意,我将 CXX 行中最初的 android21 替换为 android30。这是因为三星 Galaxy s21 Ultra 运行的是 Android 11,其真实版本号为 android30。如果你有一部 Android 手机另一个android版本,相应地调整行。)

    现在,在编译之前,我们需要最后一个文件:net 文件(技术上,net = 网络 = 神经网络 = Stockfish 使用的神经网络的权重文件)。 “通常”(啊啊),在 linux 设置下(我在这里所做的一切几乎都在 Linux 上运行mutatis mutandis),我们只需执行"MakeDir\bin\make.exe" profile-build ARCH=x86-64,它会在需要的地方下载网络文件,我们甚至不会打扰我们。可悲的是,这里运行"MakeDir\bin\make.exe" profile-build ARCH=x86-64由于某种原因不起作用,我们需要自己手动下载net文件。因此,我们必须在 Makefile 中查找 net 文件是如何下载的。 Makefile 中重要的一点是:

    # 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是由grep在头文件evaluate.h(在StockFishDIr\src里面)里面的字符串EvalFileDefaultName定义的,感兴趣的线是:

    #define EvalFileDefaultName   "nn-62ef826d1a6d.nnue"
    

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

    当然,这个地址将来可能会改变,但你明白这个想法。现在我们把net文件放在StockFishDIr\src

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

    "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
    

    (根据您的 Android 手机调整此处的 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:根据您的Android手机在这里也调整aarch64-linux-android30位。)

    现在,您的二进制文件stockfish_13_armv8_xcomp_win10x64 完全可用。您可以在手机上与 StockFish 13 下棋,然后受苦! ;)

    【讨论】:

      猜你喜欢
      • 2014-01-16
      • 2021-07-24
      • 2021-06-02
      • 2021-11-20
      • 2022-06-12
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 2021-05-03
      相关资源
      最近更新 更多