在 Windows msys2 下編譯 scryer-prolog

  • 2022 年 7 月 25 日
  • 筆記

by chesium 2022/7/24 深夜

參考://github.com/mthom/scryer-prolog/blob/master/README.md

採用 msys2 環境編譯

On Windows, Scryer Prolog is easier to build inside a msys2 environment as some crates may require native C compilation. However, the resulting binary does not need msys2 to run. When executing Scryer in a shell, it is recommended to use a more advanced shell than mintty (the default msys2 shell). The Windows Terminal works correctly.

  1. 下載msys2官網,並安裝
    • 安裝耗時較長
    • 不要安裝在C:\Program Files等路徑包含空格的位置,不然後續編譯中會報錯。
    • (可選)配置Windows Terminal終端:(最好加上管理員許可權,如採用 gsudo
    <...>\msys2_shell.cmd -defterm -no-start
    
  2. 給 msys2 安裝diffutilsm4,不然後續編譯會報錯:
    pacman -S diffutils
    pacman -S m4
    
  3. 安裝 Rust(到 Windows 系統中即可),參照官網(安裝時選2) Customize installation,將默認為x86_64-pc-windows-msvc的基礎編譯工具更換為x86_64-pc-windows-gnu,其他選項採用默認。參考),並添加到 msys2 的環境變數中:
    export PATH=$PATH:/c/Users/<用戶名>/.cargo/bin
    
  4. 同樣的,將 Windows 下gcc.exe所在的文件夾也添加到 msys2 的環境變數中,(不然後續編譯會報錯)格式見上。若未安裝,可自行查找安裝教程。
  5. 克隆程式碼庫://github.com/mthom/scryer-prolog.git至任意文件夾(最好到msys2的home/<username>文件夾里),將 msys2 終端cd到該目錄中。
  6. 編譯:在 msys2 終端中執行 cargo run --release,如果嫌輸出資訊太少感覺卡住了可以加上-vv選項
    • 編譯過程耗時較長,其中最後的opensslgmp-mpfr-sys編譯耗時最長,前面講到的「不做就會報錯」的「報錯」基本都是在編譯gmp-mpfr-sys時產生的。
  7. 編譯完成後<程式碼庫路徑>/target/release/scryer-prolog.exe"即為輸出。(就是一個單文件,無需額外的庫文件了)

最後輸出的單.exe文件有133MB,我覺得太大了,更成熟的SWI-Prolog只佔用44MB(v8.4.0版本)。

作者的README中還提到可以為 scryer-prolog 生成一個.msi安裝包,不過我試了一下,生成的安裝包就只是簡單地把scryer-prolog.exe複製到了C:\Program Files中的一個文件夾里,沒啥意義。