macOSでもBitZenyを掘りたい

[BitZeny公式サイト](http://bitzeny.org/)ではWindows版の採掘ソフトしかバイナリ版が提供されていないので、macOSで採掘したい場合は自分でソースコードからビルドする必要があります。

色々ハマった結果、何とか動いてくれましたので、備忘録がわりに書いておきます。

(追記) 
投稿してから、既に同様の記事がQiitaに上がっていたことに気付きました……。Qiitaもしっかり探しておけばよかった。 

[BitZenyのMinerをMac OS Xでビルドして採掘する](https://qiita.com/s_ktmr/items/a69cbb964a997fcd4d03)



## 依存ライブラリ・ツールのインストール

[Homebrew](https://brew.sh/index_ja.html)でビルドに必要なライブラリ等をインストールします。 
``brew``コマンドが入っていない人は、公式サイトの手順に従って入れて下さい。

```
$ brew install curl
$ brew install autoconf
$ brew install automake
```

あとは、XcodeのCommand Line Toolsが必要だと思いますので、入っていない場合はこちらもインストールしておいて下さい。

色々試行錯誤していたので、もしかしたら上記以外にも必要なライブラリがあるかも。 
コメントや編集リクエストで教えて頂けると助かります。


## ソースコードの入手

BitZeny公式サイトに載っている、[bitzeny/cpuminer](https://github.com/bitzeny/cpuminer)をcloneします。

```
$ git clone https://github.com/bitzeny/cpuminer.git
$ cd cpuminer
```

cpuminerをビルドするときのエラーメッセージで検索していると、「cpuminerはrelease版のtarballからビルドするのがオススメだ！」的な記載をよく見ますが、bitzeny/cpuminerは 
 **masterブランチからcloneしてくるのが正解** です。

releaseに置いてあるtarballは、フォーク元のリポジトリそのままの内容らしく、ビルドしてもBitZeny採掘で使うyescryptが選択できません。


## Mac向けの修正

README通りにビルドしようとするとエラーが出て進めませんので、一部修正します。

参考: [CPU Miner & problem with libcurl](https://bitcointalk.org/index.php?topic=4823.0)

### libcurl.m4を持ってくる

cpuminerディレクトリの下にm4ディレクトリを作って、そこにlibcurl.m4をコピーします。

```
$ mkdir m4
$ cp /usr/local/Cellar/curl/7.57.0/share/aclocal/libcurl.m4 ./m4
```

コピー元のパスはお使いの環境に置き換えて下さい。 
HomebrewでCurlをインストールした場合、``/use/local/Celler/curl``の下に入っているはずです。

### Makefile.amを修正する

``Makefile.am``に``ACLOCAL_AMFLAGS = -I m4``を追加します。

``` Makefile.am
(略)
minerd_LDFLAGS	= $(PTHREAD_FLAGS)
minerd_LDADD	= @LIBCURL@ @JANSSON_LIBS@ @PTHREAD_LIBS@ @WS2_LIBS@
minerd_CPPFLAGS = @LIBCURL_CPPFLAGS@

ACLOCAL_AMFLAGS = -I m4
```

### autogen.shを修正する

``aclocal``を``aclocal -I m4``に変更します。

``` autogen.sh
#!/bin/sh

# You need autoconf 2.5x, preferably 2.57 or later
# You need automake 1.7 or later. 1.6 might work.

set -e

aclocal -I m4
autoheader
automake --gnu --add-missing --copy
autoconf
```

## ビルドする

あとはREADMEに書いてある手順と同じです。

```
$ ./autogen.sh
$ ./nomacro.pl
$ ./configure CFLAGS="-O3 -march=native -funroll-loops -fomit-frame-pointer" 
$ make
```

成功すると、cpuminerディレクトリ直下に``minerd``コマンドが作成されます。 
パスが通ってないので、パス指定付きで実行してみましょう。 
(マイニングプールのURL等は自分が使いたいものに置き換えてください。)

```
$ ./minerd  -a yescrypt -o stratum+tcp://<マイニングプールのURL:ポート番号> -u <マイニングプールのユーザー名> -p <パスワード>

[2017-12-10 20:33:06] Starting Stratum on stratum+tcp://<マイニングプールのURL:ポート番号>
[2017-12-10 20:33:06] Binding thread 0 to cpu 0
[2017-12-10 20:33:06] Binding thread 1 to cpu 1
[2017-12-10 20:33:06] Binding thread 2 to cpu 2
[2017-12-10 20:33:06] 4 miner threads started, using 'yescrypt' algorithm.
[2017-12-10 20:33:06] Binding thread 3 to cpu 3
[2017-12-10 20:33:08] Stratum requested work restart
[2017-12-10 20:33:14] Stratum requested work restart
[2017-12-10 20:33:14] thread 1: 2472 hashes, 0.41 khash/s
[2017-12-10 20:33:14] thread 3: 2469 hashes, 0.40 khash/s
[2017-12-10 20:33:14] thread 0: 2443 hashes, 0.40 khash/s
[2017-12-10 20:33:14] thread 2: 2465 hashes, 0.40 khash/s
[2017-12-10 20:33:47] thread 1: 13613 hashes, 0.42 khash/s
[2017-12-10 20:33:47] accepted: 1/1 (100.00%), 1.63 khash/s (yay!!!)
```

こんな感じのログが流れてくれば成功です。 


## 参考にしたページ

[libcurl build failure on Mac OSX 10.8.x](https://github.com/pooler/cpuminer/issues/14)
[To build from source, binary or tarball?](https://www.anintegratedworld.com/to-build-from-source-binary-or-tarball/)
[CPU Miner & problem with libcurl](https://bitcointalk.org/index.php?topic=4823.0)

## 途中ハマったエラー

同じ箇所でハマっている人が検索で辿り着けるように、出ていたエラーを書いておきます。 
どちらも上記修正で通るようになります。

### ./autogen.shで出てくるエラー

```
(略)
Makefile.am: installing './INSTALL'
Makefile.am: installing './depcomp'
configure.ac:120: error: possibly undefined macro: AC_MSG_ERROR
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.
```

### ./configureで出てくるエラー

```
(略)
checking whether we can compile AVX2 code... yes
checking for json_loads in -ljansson... yes
checking for pthread_create in -lpthread... yes
./configure: line 5610: syntax error near unexpected token `,'
./configure: line 5610: `LIBCURL_CHECK_CONFIG(, 7.15.2, ,'
```