Monday, January 30, 2017

在 OS X 下編譯 GnuPG 2

現在 GnuPG 1.4 classic 似乎不維護了,在下載網頁都沒連結 XD ... 現在看起來在 stable release 取而代之的是 2.0 系列。在 2.0 系列進行了模組化的設計,把一些功能抽成函式庫,因次編譯時要先分別編譯那些函式庫,再編譯 GnuPG 本體,稍微比較麻煩一點。

首先要下載原始碼檔案,這部分就變成要下載很多包: https://www.gnupg.org/download/

在 2.0.30 中,除了 GnuPG 本體之外,還要:

  • libgpg-error
  • libgcrypt
  • libksba
  • libassuan
  • nPth
  • Pinentry

除了 GnuPG 提供的程式之外,另外還要 GNU Pth: https://www.gnu.org/software/pth/

安裝順序需要依照相依性來安排,整個建置指令如下所示。

$ cd pth-2.0.7/
$ ./configure --prefix=${PREFIX}
$ make
$ make install
$ cd npth-1.3/
$ ./configure --prefix=${PREFIX}
$ make
$ make install
$ cd libgpg-error-1.26/
$ ./configure --prefix=${PREFIX}
$ make
$ make install
$ cd libksba-1.3.5/
$ ./configure --prefix=${PREFIX} --with-libgpg-error-prefix=${PREFIX}
$ make
$ make install
$ cd libassuan-2.4.3/
$ ./configure --prefix=${PREFIX} --with-libgpg-error-prefix=${PREFIX}
$ make
$ make install
$ cd libgcrypt-1.7.6/
$ ./configure --prefix=${PREFIX} --with-libgpg-error-prefix=${PREFIX} --with-pth-prefix=${PREFIX}
$ make
$ make install

下面這個步驟會建置輸入密碼用的介面程式,在這邊我使用 TTY 模組 (就是傳統的直接在終端機畫面輸入) 來輸入密碼,在終端機畫面上還有一個 NCurses 模組可以選擇,不過個人不太習慣。

$ cd pinentry-1.0.0/
$ ./configure --prefix=${PREFIX} --disable-pinentry-gtk2 --disable-pinentry-gnome3 --disable-pinentry-qt --disable-pinentry-qt5 --disable-pinentry-curses --enable-pinentry-tty --with-libgpg-error-prefix=${PREFIX} --with-libassuan-prefix=${PREFIX}
$ make
$ make install

接下來要建置 GnuPG 的本體:

$ cd gnupg-2.0.30/
$ ./configure --prefix=${PREFIX} --with-libgpg-error-prefix=${PREFIX} --with-pth-prefix=${PREFIX} --with-libgcrypt-prefix=${PREFIX} --with-libassuan-prefix=${PREFIX} --with-ksba-prefix=${PREFIX} --with-pinentry-pgm=${PREFIX}/bin/pinentry

組態好之後直接進行 make; make install 會出現一些關於 intmax_t 宣告上的錯誤,是因為使用到了錯誤的 stdint.h 所導致。錯誤訊息看起來像是這樣:

unknown type name 'intmax_t'
    extern intmax_t

避過的方法是修改產生出來的 Makefile 中關於 stdint.h 的路徑,步驟是:

  1. 編輯 gl/Makefile
  2. 找到這行: ABSOLUTE_STDINT_H = "///Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0/include/stdint.h"
  3. 換成這樣: ABSOLUTE_STDINT_H = "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/stdint.h"

路徑需要跟著 Xcode 安裝的 SDK 路徑所調整。

接著在繼續進行 make; make install 即可。

$ make
$ make install