#author("2019-09-30T17:57:27+09:00","","")
#author("2019-10-18T23:59:12+09:00","","")
* 64bit Windows用のKumacoin-Qt Walletビルド方法 [#y7db10e8]

- 実績のあるビルド環境
-- Windows10 Home 64bit
-- バージョン 1709
-- OSビルド 16299.248

----
- ビルド環境構築に向けての下準備
-- Perlのインストール
Perl公式ページ:http://www.activestate.com/activeperl/downloads
-- Pythonのインストール
Python公式ページ:https://www.python.org/downloads/windows/
-- Git for Windowsのインストール
Git for Windowsの公式ページ:https://gitforwindows.org/

いずれもインストールの際に環境変数PATHへインストールしたプログラムのフォルダを追加するようにしてください。

----
- MinGW環境構築
-- mingw-get-inst-20120426の取得
--- https://sourceforge.net/projects/mingw/files/OldFiles/mingw-get-inst/mingw-get-inst-20120426/mingw-get-inst-20120426.exe/download
からインストーラをダウンロードして実行する。
--- 「use pre-packaged repository catalogs」を選択する
--- インストールパスはデフォルトの「c:\MinGW」を指定する
--- 「C Compiler」「C++ Compiler」「MSYS Basic System」にチェックを入れる
--- それ以外はデフォルトでOK
-- mingw32-gcc-4.6.2-release-c,c++,objc,objc++,fortran-sjljの取得
--- https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/mingw-builds/mingw32-gcc-4.6.2-release-c,c++,objc,objc++,fortran-sjlj.zip
からバイナリを取得して適当な場所に展開する
--- 展開すると「mingw32-gcc-4.6.2-release-c,c++,objc,objc++,fortran-sjlj\mingw」と言うフォルダが出来るので、その中身を全て「c:\MinGW\mingw32」へ上書きする
※「c:\MinGW」に上書きしないように注意!
----
- 依存ライブラリのビルドへ向けての下準備
-- 各ソースの取得
--- openssl-1.0.1j.tar.gz
https://www.openssl.org/source/old/1.0.1/openssl-1.0.1j.tar.gz
--- db-4.8.30.NC.tar.gz
http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz
--- boost_1_55_0.zip
https://sourceforge.net/projects/boost/files/boost/1.55.0/boost_1_55_0.zip/download
--- miniupnpc-1.9.tar.gz
http://miniupnp.free.fr/files/download.php?file=miniupnpc-1.9.tar.gz
-- 「c:\deps」フォルダを作成する
-- 「c:\deps」フォルダへ「openssl-1.0.1j.tar.gz」「db-4.8.30.NC.tar.gz」「boost_1_55_0.zip」「miniupnpc-1.9.tar.gz」をコピーする
----
- 依存ライブラリのビルド
-- openssl
--- プログラム一覧から「MinGW」→「MinGW Shell」を選択してシェルを起動する
(もしくはエクスプローラーで「C:\MinGW\msys\1.0」フォルダを開き「msys.bat」を実行)
--- 「deps」フォルダへ移動する
cd /c/deps
--- ソースコードを展開する
tar xfz openssl-1.0.1j.tar.gz
--- 「openssl-1.0.1j」フォルダへ移動する
cd openssl-1.0.1j
--- Configureを実行する
Configure no-shared no-dso mingw
--- ビルドする
make
-- libdb
--- プログラム一覧から「MinGW」→「MinGW Shell」を選択してシェルを起動する
(もしくはエクスプローラーで「C:\MinGW\msys\1.0」フォルダを開き「msys.bat」を実行)
すでに起動済みの場合は開いているシェルをそのまま使ってOK
--- 「deps」フォルダへ移動する
cd /c/deps
--- ソースコードを展開する
tar xfz db-4.8.30.NC.tar.gz
--- 「build_unix」フォルダへ移動する
cd db-4.8.30.NC/build_unix
--- Configureを実行する
../dist/configure --enable-mingw --enable-cxx --disable-replication --with-mutex=x86_64/gcc-assembly
--- エクスプローラーで「C:\deps\db-4.8.30.NC\build_unix」フォルダを開く
--- テキストエディタで「db.h」を開く
--- 113行目にある「pthread_t」を「u_int32_t」へ書き変える
--- ビルドする
make
-- boost
--- 「deps」フォルダにある「boost_1_55_0.zip」を展開する
(展開した結果「C:\deps\boost_1_55_0\boost_1_55_0」となってしまった場合は「C:\deps\boost_1_55_0」に修正)
--- プログラム一覧からWindowsの「コマンドプロンプト」を起動する
--- 「boost_1_55_0」フォルダへ移動する
cd C:\deps\boost_1_55_0\
--- b2.exeを生成する
.\bootstrap.bat mingw
--- ビルドする
.\b2.exe --build-type=complete --with-chrono --with-filesystem --with-program_options --with-system --with-thread toolset=gcc variant=release link=static threading=multi runtime-link=static stage
-- Miniupnpc
--- プログラム一覧から「MinGW」→「MinGW Shell」を選択してシェルを起動する
(もしくはエクスプローラーで「C:\MinGW\msys\1.0」フォルダを開き「msys.bat」を実行)
すでに起動済みの場合は開いているシェルをそのまま使ってOK
--- 「deps」フォルダへ移動する
cd /c/deps
--- ソースコードを展開する
tar xfz miniupnpc-1.9.tar.gz
--- 展開された「miniupnpc-1.9」フォルダの名前を「miniupnpc」へ変更する
mv miniupnpc-1.9 miniupnpc
--- 「miniupnpc」フォルダへ移動する
cd miniupnpc
--- ビルドする
mingw32-make -f Makefile.mingw init upnpc-static
----
- QTのビルドへ向けての下準備
-- 「c:\qt」フォルダを作成する
-- ソースの取得
https://download.qt.io/archive/qt/4.8/4.8.5/qt-everywhere-opensource-src-4.8.5.zip
-- 「c:\qt」フォルダへ「qt-everywhere-opensource-src-4.8.5.zip」をコピーする
----
- QTのビルド
-- 「qt」フォルダにある「qt-everywhere-opensource-src-4.8.5.zip」を展開する
(展開した結果「C:\qt\qt-everywhere-opensource-src-4.8.5\qt-everywhere-opensource-src-4.8.5」となってしまった場合は「C:\qt\qt-everywhere-opensource-src-4.8.5」に修正)
-- 「c:\qt\qt-everywhere-opensource-src-4.8.5」のフォルダ名を「c:\qt\4.8.5」へ変更する
-- プログラム一覧からWindowsの「コマンドプロンプト」を起動する
すでに起動済みの場合は開いているコマンドプロンプトをそのまま使ってOK
-- 環境変数PATHに「c:\MinGW\bin」と「C:\MinGW\msys\1.0\bin」を追加
set PATH=%PATH%;c:\MinGW\bin;C:\MinGW\msys\1.0\bin
-- 「4.8.5」フォルダへ移動する
cd C:\qt\4.8.5
-- Configureを実行する
.\configure.exe -release -opensource -confirm-license -static -no-sql-sqlite -no-qt3support -no-opengl -qt-zlib -no-gif -qt-libpng -qt-libmng -no-libtiff -qt-libjpeg -no-dsp -no-vcproj -no-openssl -no-dbus -no-phonon -no-phonon-backend -no-multimedia -no-audio-backend -no-webkit -no-script -no-scripttools -no-declarative -no-declarative-debug -no-style-plastique -no-style-cleanlooks -no-style-motif -no-style-cde -nomake demos -nomake examples
-- ビルドする
mingw32-make
----
- kumacoin-qtビルドへ向けての下準備
-- 「c:\kumacoin-build」フォルダを作成する
----
- kumacoin-qtのビルド
-- プログラム一覧からWindowsの「コマンドプロンプト」を起動する
すでに起動済みの場合は開いているコマンドプロンプトをそのまま使ってOK
-- 環境変数PATHに「c:\qt\4.8.5\bin」と「c:\MinGW\bin」と「C:\MinGW\msys\1.0\bin」を追加
set PATH=%PATH%;c:\qt\4.8.5\bin;c:\MinGW\bin;C:\MinGW\msys\1.0\bin
-- 「kumacoin-build」フォルダへ移動する
cd c:\kumacoin-build
-- Githubからkumacoinのソースを取得する
git clone https://github.com/kumacoinproject/kumacoin.git
-- テキストエディタで「c:\kumacoin-build\kumacoin\kumacoin-qt.pro」を開いて以下を修正する
--- ファイル先頭の方にある「CONFIG += no_include_pwd」の次の行に「CONFIG += static」を追加する
--- 40行目付近にある「win32:QMAKE_LFLAGS *= -Wl,--dynamicbase -Wl,--nxcompat」を「win32:QMAKE_LFLAGS *= -Wl,--dynamicbase -Wl,--nxcompat -static」へ変更する
--- 10行目付近にある空白行に以下の10行を追記する
 BOOST_LIB_SUFFIX=-mgw46-mt-s-1_55
 BOOST_INCLUDE_PATH=C:/deps/boost_1_55_0
 BOOST_LIB_PATH=C:/deps/boost_1_55_0/stage/lib
 BDB_INCLUDE_PATH=C:/deps/db-4.8.30.NC/build_unix
 BDB_LIB_PATH=C:/deps/db-4.8.30.NC/build_unix
 OPENSSL_INCLUDE_PATH=C:/deps/openssl-1.0.1j/include
 OPENSSL_LIB_PATH=C:/deps/openssl-1.0.1j
 MINIUPNPC_LIB_SUFFIX=-miniupnpc
 MINIUPNPC_INCLUDE_PATH=C:/deps
 MINIUPNPC_LIB_PATH=C:/deps/miniupnpc
--- 変更内容を保存して「c:\kumacoin-build\kumacoin\kumacoin-qt.pro」を閉じる
-- 「kumacoin」フォルダへ移動する
cd c:\kumacoin-build\kumacoin
-- qmakeを実行する
qmake "USE_UPNP=1" kumacoin-qt.pro
-- ビルドする
mingw32-make -f Makefile.Release
-- ビルドに成功していれば「:\kumacoin-build\kumacoin\release」フォルダに「kumacoin-qt.exe」が出来ています。
お疲れさまでした!

----

- トラブルシューティング
-- undefined reference to `WinMain@16'
これはmingw32で使用できない関数を用いているという意味だがmingwのバグらしい。エラー文は''{APPNAME:=XXXXX.exe}''となっているので''XXXXX.c''を確認すると空のファイルが作成されてテストに失敗している。空のファイルを削除しmakeし直すとできます。

-- 文を忘れたがautoがなんとか書いてあるエラー
C++11環境のコードが含まれているのでコンパイラに教えないといけない。そしてGNU拡張されているので「QMAKE_CXXFLAGS += -msse2」の次の行に「QMAKE_CXXFLAGS += -std=gnu++0x」を加える。

-- ld.exe: cannot find -lboost_***
BoostにリンカーのPATHが通っていない。BOOST_LIB_PATHが効かないようなので通常のPATHに追加する。

-- undefined reference to `boost::filesystem::detail::copy_file
std=c++11を追加することで発生するエラー。解法 https://stackoverflow.com/questions/35007134/c-boost-undefined-reference-to-boostfilesystemdetailcopy-file 。フラグ追加するやり方がオススメ、忘れるのが'''kumacoin-qt.pro'''に''DEFINES += BOOST_NO_CXX11_SCOPED_ENUMS''追加すること。

-- ビルド成功し起動するとスプラッシュ画面が表示されるものの''Error initializing database environment''と言われ、db.logに''PANIC: Operation not permitted''と出力されるエラー
BerkeleyDBでpthread-win32使用時に定期的に起こる問題らしい、しかしよくわからない。ソースを初めからビルドし直したらエラーが消えた。

- berkeleydDB5.3.28を使用する場合
-- 本家サイトからDLするには登録作業が必要になるので某コインのソースに取り込まれたものを使用する。 
-- ソースを取得しhttps://github.com/iadix/iadixcoin、「db-5.3.28.NC」を '''C:/deps''' へ移動。
-- MinGW Shellを起動し '''db-4.8.30.NC/build_unix''' へ移動し ''configure'' を行う。
-- db.h の '''pthread_t''' を '''u_int32_t''' に変える、ここまではDB4.8.30と同じ。
-- 次に '''src/os/os_pid.c''' の49~62行を以下のように書き換える。
 	if (tidp != NULL) {
 #if defined(DB_WIN32)
		*tidp = GetCurrentThreadId();
 #elif defined(HAVE_MUTEX_UI_THREADS)
		*tidp = thr_self();
 #elif defined(HAVE_PTHREAD_SELF)
		*tidp = pthread_self();
 #else
		/*
		 * Default to just getpid.
		 */
		*tidp = 0;
 #endif
 	}
-- そしてmakeする。kumacoin-qt.proの変更も忘れずに。
----
- kumacoind.exe のビルド
-- 上記依存ライブラリのビルドまで行う。(Qtのビルドは不要です)
-- src/以下のmakefile.mingwを編集する
--- パスとライブラリについてはビルドした現物と名前を合わせる
 INCLUDEPATHS= \
  -I"D:/deps/boost_1_55_0" \
  -I"D:/deps/db-4.8.30.NC/build_unix" \
  -I"D:/deps/openssl-1.0.1j/include"
 LIBPATHS= \
  -L"D:/deps/boost_1_55_0/stage/lib" \
  -L"D:/deps/db-4.8.30.NC/build_unix" \
  -L"D:/deps/openssl-1.0.1j"
 LIBS= \
  -l boost_system-mgw82-mt-s-1_55 \
  -l boost_filesystem-mgw82-mt-s-1_55 \
  -l boost_program_options-mgw82-mt-s-1_55 \
  -l boost_thread-mgw82-mt-s-1_55 \
  -l db_cxx \
  -l ssl \
  -l crypto
--- 28行目の DEBUGFLAGS に -fpermissive を追加
 DEBUGFLAGS=-g -fpermissive
--- 38行目のライブラリパスの指定を以下のようにする
  INCLUDEPATHS += -I"d:/deps"
  LIBPATHS += -L"d:/deps/miniupnpc"
--- 'OBJS= \' に以下の行を足す
 	obj/jh.o \
	obj/keccak.o \
	obj/groestl.o \
	obj/skein.o \
	obj/bmw.o \
	obj/blake.o \

--- 99行目付近に以下の2行を書き足す(g++の手前はtabを入れること)
 obj/%.o: %.c $(HEADERS)
	g++ -c $(CFLAGS) -o $@ $<'

--- makefile.mingw を保存する
-- MinGW のコンソールで src ディレクトリに移動し、mingw32-make -f makefile.mingw を実行する