Remove UPNP support & do some cleanup.
[novacoin.git] / doc / crosscompiling_building Windows binary under Unix.txt
1 \feffДанный способ должен подходить для любой Unix системы: Linux, FreeBSD, MacOS X
2 При написании этого руководства использовался Linux Mint 17.1 ( http://linuxmint.com/ )
3 1) Подготовка системы для кросскомпиляции.
4
5  sudo apt-get install git bison cmake flex g++ gperf ruby scons libghc-zlib-dev  libghc-zlib-bindings-dev
6
7 2) Установка MXE и зависимостей
8  cd /home/<ваше имя>/
9  git clone https://github.com/mxe/mxe.git
10  
11
12 2.1) gcc
13  cd /home/<ваше имя>/mxe
14  make gcc zlib
15
16 Проверка того, что установка gcc прошла успешно:
17 В папке /home/<ваше имя>/mxe/usr/bin должен появиться файл i686-w64-mingw32.static-gcc и i686-w64-mingw32.static-g++
18 И при запуске ./i686-w64-mingw32.static-gcc -v должно выдаваться
19 ......
20 Thread model: win32
21 gcc version 4.9.2 (GCC)
22
23 В папке /home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/lib должен быть файл:
24 libz.a
25
26 2.2) Openssl
27  
28  cd /home/<ваше имя>/mxe
29  make openssl
30
31 Проверка что установка Openssl прошла успешно:
32 В папке /home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/lib должны появиться два файла
33 -libssl.a
34 -libcrypto.a
35 В папке mxe/usr/i686-w64-mingw32.static/include должна появиться папка openssl
36
37 2.3) Boost
38
39  cd /home/<ваше имя>/mxe
40  make boost
41
42 Проверка что установка Boost прошла успешно:
43 В /home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/lib папке должны появиться файлы:
44 -libboost_имябиблиотеки_mt.a (libboost_atomic-mt.a и другие подобные файлы)
45 -libboost_имябиблиотеки_mt-d.a (libboost_atomic-mt-d.a и другие подобные файлы)
46
47 В папке /home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/include должна появиться папка boost
48
49 2.4) Berkeley DB
50 -Скачайте http://download.oracle.com/berkeley-db/db-6.0.20.tar.gz
51 -Распакуйте в домашнюю папку
52 -Откройте файл /home/<ваше имя>/db-6.0.20/src/dbinc/win_db.h
53 -Измените 
54 #include <WinIoCtl.h>
55 на
56 #include <winioctl.h>
57 -Сохраните файл
58 -Откройте терминал
59  cd /home/<ваше имя>/db-6.0.20/build_unix
60  export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
61  ../dist/configure --host=i686-w64-mingw32.static --enable-mingw --enable-cxx --disable-shared --disable-replication
62  make
63
64 Проверка, что установка Berkeley DB прошла успешно:
65 В папке /home/<ваше имя>/db-6.0.20/build_unix должны появиться файлы:
66 libdb.a
67 libdb_cxx.a
68
69 2.5) qrencode
70 -Скачайте http://download.sourceforge.net/libpng/libpng-1.6.15.tar.gz?download
71 -Распакуйте в домашнюю папку
72 -Откройте терминал
73
74  export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
75  cd /home/<ваше имя>/libpng-1.6.15
76  ./configure --host=i686-w64-mingw32.static --disable-shared
77  make
78  cp .libs/libpng16.a .libs/libpng.a
79
80 Проверка что libpng собралась успешно:
81 в папке /home/<ваше имя>/libpng-1.6.15/.libs должен быть файл:
82 libpng.a
83
84 -Скачайте http://fukuchi.org/works/qrencode/qrencode-3.4.4.tar.gz
85 -Распакуйте в домашнюю папку
86 -Откройте терминал
87  export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
88  cd /home/<ваше имя>/qrencode-3.4.4
89
90  LIBS="../libpng-1.6.15/.libs/libpng.a ../mxe/usr/i686-w64-mingw32.static/lib/libz.a" \
91  png_CFLAGS="-I../libpng-1.6.15" \
92  png_LIBS="-L../libpng-1.6.15/.libs" \
93  ./configure --host=i686-w64-mingw32.static --enable-static --disable-shared --without-tools
94
95  make
96
97 Проверка что qrencode успешно собралась:
98 в папке /home/<ваше имя>/qrencode-3.4.4/.libs должен быть файл:
99 libqrencode.a
100
101 2.6 Qt 5 и Qt 4
102
103 Qt 4
104 -Откройте терминал
105
106  cd /home/<ваше имя>/mxe
107  make qt
108
109 Проверка что Qt4 собрался правильно:
110 -Откройте терминал
111 -Введите следующие команды
112  export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
113  i686-w64-mingw32.static-qmake-qt4 -v
114
115 -Должно появиться в ответ
116 QMake version 2.01a
117 Using Qt version 4.8.6 in /home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/qt/lib
118
119 Qt 5
120 -Откройте терминал
121
122  export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
123  cd /home/<ваше имя>/mxe
124  make qtbase qttools qttranslations
125
126 Проверка что Qt5 собрался правильно:
127 -Откройте терминал
128 -Введите следующие команды
129  export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
130  i686-w64-mingw32.static-qmake-qt5 -v
131
132 -Должно появиться в ответ
133 QMake version 3.0
134 Using Qt version 5.4.0 in /home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/qt5/lib
135
136 3. Компиляция
137
138 3.1 Скачиваем исходники
139 -Перейдите в домашнюю папку
140 -Откройте терминал
141
142  git clone https://github.com/novacoin-project/novacoin.git
143
144 3.2 Собираем novacoind 
145 -Откройте файл makefile.mingw в текстовом редакторе.(При написании инструкции использовался Pluma 1.8.1)
146 -Вставьте 
147 CC=$(CROSS)gcc
148 CXX=$(CROSS)g++
149 -Добавьте  строчку USE_ASM:=1
150 -Поменяйте текущие INCLUDEPATHS, LIBPATHS, LIBS на:
151
152 BOOST_SUFFIX?=-mt
153
154 INCLUDEPATHS= \
155  -I"$(CURDIR)" \
156  -I"/home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/include" \
157  -I"/home/<ваше имя>/" \
158  -I"/home/<ваше имя>/db-6.0.20/build_unix" \
159  
160 LIBPATHS= \
161  -L"$(CURDIR)/leveldb" \
162  -L"/home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/lib" \
163  -L"/home/<ваше имя>/db-6.0.20/build_unix" \
164
165 LIBS= \
166   -l leveldb \
167   -l memenv \
168   -l boost_system$(BOOST_SUFFIX) \
169   -l boost_filesystem$(BOOST_SUFFIX) \
170   -l boost_program_options$(BOOST_SUFFIX) \
171   -l boost_thread$(BOOST_SUFFIX) \
172   -l boost_chrono$(BOOST_SUFFIX) \
173   -l db_cxx \
174   -l ssl \
175   -l crypto \
176   -l z
177 -Поменяйте LDFLAGS=-Wl,--dynamicbase -Wl,--nxcompat на 
178 LDFLAGS=-Wl,--dynamicbase -Wl,--nxcompat -Wl,--large-address-aware -static
179
180 -Поменяйте в последних строчках makefile.mingw
181 g++ -c $(CFLAGS) -o $@ $<
182 на
183 $(CXX) -c $(CFLAGS) -o $@ $<
184
185 g++ $(CFLAGS) $(LDFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS)
186 на
187 $(CXX) $(CFLAGS) $(LDFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS)
188
189 -Если вы хотите использовать LevelDB как базу блоков то измените:
190 USE_LEVELDB:=0 
191 на
192 USE_LEVELDB:=1
193 (выше USE_IPV6:=1)
194 Откройте файл /home/<ваше имя>/novacoin/src/leveldb/Makefile
195 Вставьте ниже строчки CXXFLAGS += -I. -I./include $(PLATFORM_CXXFLAGS) $(OPT) следующие строки:
196
197 CC=$(CROSS)gcc
198 CXX=$(CROSS)g++
199 Сохраните файл
200
201 Снова возвращаемся в файл makefile.mingw, измените 
202 cd leveldb; make; cd ..
203 на 
204 cd leveldb; TARGET_OS=NATIVE_WINDOWS make CROSS=i686-w64-mingw32.static- libleveldb.a libmemenv.a; cd ..
205
206 Ещё измените
207 obj/txdb-leveldb.o: leveldb/libleveldb.lib
208 на
209 obj/txdb-leveldb.o: leveldb/libleveldb.a
210
211 Если вы хотите использовать BerkeleyDB как базу блоков, то просто удалите строчку USE_LEVELDB:=1
212
213 -Сохраните измененный файл makefile.mingw
214
215 -Откройте терминал
216 cd /home/<ваше имя>/novacoin/src
217 export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
218 make CROSS=i686-w64-mingw32.static- -f makefile.mingw
219 strip novacoind.exe
220
221
222 Во время линковки будут выдаваться подобные сообщения:
223 libboost_thread_win32-mt.a(thread.o): duplicate section `.rdata$_ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_9gregorian9bad_monthEEEEE[__ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_9gregorian9bad_monthEEEEE]' has different size
224 Игнорируйте их. На работоспособность программы это никак не влияет
225
226
227 3.3 Собираем Novacoin QT
228
229 Внимание: Если вы хотите собирать Novacoin Qt с LevelDB, но пропустили шаг со сборкой novacoind.exe, то 
230 -Измените Makefile в папке leveldb также как в пункте 3.2
231 -Откройте терминал и выполните следующие команды:
232 export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
233 cd /home/<ваше имя>/novacoin/src/leveldb
234 TARGET_OS=NATIVE_WINDOWS make CROSS=i686-w64-mingw32.static- libleveldb.a libmemenv.a;
235
236 -Откройте файл /home/<ваше имя>/novacoin/novacoin-qt.pro в текстовом редакторе(при написании инструкции использовался Pluma 1.8.1)
237 -Ниже 
238 # Dependency library locations can be customized with:
239 #    BOOST_INCLUDE_PATH, BOOST_LIB_PATH, BDB_INCLUDE_PATH,
240 #    BDB_LIB_PATH, OPENSSL_INCLUDE_PATH and OPENSSL_LIB_PATH respectively
241 замените прописанные пути к зависимостям на
242
243 BOOST_LIB_SUFFIX=-mt
244 BOOST_INCLUDE_PATH=/home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/include
245 BOOST_LIB_PATH=/home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/lib
246 BDB_INCLUDE_PATH=/home/<ваше имя>/db-6.0.20/build_unix
247 BDB_LIB_PATH=//home/<ваше имя>/db-6.0.20/build_unix
248 OPENSSL_INCLUDE_PATH=/home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/include
249 OPENSSL_LIB_PATH=/home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/lib
250 QRENCODE_INCLUDE_PATH=/home/<ваше имя>/qrencode-3.4.4
251 QRENCODE_LIB_PATH=/home/<ваше имя>/qrencode-3.4.4/.libs
252
253 Так же измените(если ещё не изменено) 
254 LIBS += -lshlwapi
255 genleveldb.commands = cd $$PWD/src/leveldb && CC=$$QMAKE_CC CXX=$$QMAKE_CXX TARGET_OS=OS_WINDOWS_CROSSCOMPILE $(MAKE) OPT=\"$$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_RELEASE\" libleveldb.a libmemenv.a && $$QMAKE_RANLIB $$PWD/src/leveldb/libleveldb.a && $$QMAKE_RANLIB $$PWD/src/leveldb/libmemenv.a
256
257 на
258  
259 LIBS += -lshlwapi
260 #genleveldb.commands = cd $$PWD/src/leveldb && CC=$$QMAKE_CC CXX=$$QMAKE_CXX TARGET_OS=OS_WINDOWS_CROSSCOMPILE $(MAKE) OPT=\"$$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_RELEASE\" libleveldb.a libmemenv.a && $$QMAKE_RANLIB $$PWD/src/leveldb/libleveldb.a && $$QMAKE_RANLIB $$PWD/src/leveldb/libmemenv.a
261
262 Если в файле нет такой строчки CONFIG += static , то добавьте её.
263
264 Измените 
265 win32:QMAKE_LFLAGS........................
266 на 
267 win32:QMAKE_LFLAGS *= -Wl,--large-address-aware -static 
268
269 Измените 
270 win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\\lrelease.exe
271 на
272 win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease
273
274 Измените
275 LIBS += -lboost_system$$BOOST_LIB_SUFFIX -lboost_filesystem$$BOOST_LIB_SUFFIX -lboost_program_options$$BOOST_LIB_SUFFIX -lboost_thread$$BOOST_THREAD_LIB_SUFFIX
276 на
277 LIBS += -lboost_system$$BOOST_LIB_SUFFIX -lboost_filesystem$$BOOST_LIB_SUFFIX -lboost_program_options$$BOOST_LIB_SUFFIX -lboost_thread_win32$$BOOST_THREAD_LIB_SUFFIX
278
279 Измените
280 windows:LIBS += -lboost_chrono$$BOOST_LIB_SUFFIX -Wl,-Bstatic -lpthread -Wl,-Bdynamic
281 на
282 windows:LIBS += -lboost_chrono$$BOOST_LIB_SUFFIX
283
284 -Сохраните измененный файл novacoin-qt.pro
285 -Откройте терминал и выполните следующие команды
286
287 Qt4 + транзакционный индекс LevelDB
288
289 export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
290 cd /home/<ваше имя>/novacoin
291 i686-w64-mingw32.static-qmake-qt4 "USE_IPV6=1" "USE_LEVELDB=1" "USE_ASM=1" novacoin-qt.pro
292 make -j n -f Makefile.Release  (вместо n количество ядер вашего процессора, которые вы хотите выделить под сборку)
293
294 Qt4 + транзакционный индекс BDB
295
296 export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
297 cd /home/<ваше имя>/novacoin
298 i686-w64-mingw32.static-qmake-qt4 "USE_IPV6=1" "USE_ASM=1" novacoin-qt.pro
299 make -j n -f Makefile.Release  (вместо n количество ядер вашего процессора, которые вы хотите выделить под сборку)
300
301 Qt5 + транзакционный индекс LevelDB
302
303 export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
304 cd /home/<ваше имя>/novacoin
305 i686-w64-mingw32.static-qmake-qt5 "USE_IPV6=1" "USE_LEVELDB=1" "USE_ASM=1" novacoin-qt.pro
306 make -j n -f Makefile.Release  (вместо n количество ядер вашего процессора, которые вы хотите выделить под сборку)
307
308 Qt5 + транзакционный индекс BDB
309
310 export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
311 cd /home/<ваше имя>/novacoin
312 i686-w64-mingw32.static-qmake-qt5 "USE_IPV6=1" "USE_ASM=1" novacoin-qt.pro
313 make -j n -f Makefile.Release  (вместо n количество ядер вашего процессора, которые вы хотите выделить под сборку)
314
315
316 Если всё сделано правильно, то файл novacoin-qt.exe будет находится в папке /home/<ваше имя>/novacoin/release
317 Во время линковки будут выдаваться подобные сообщения:
318 libboost_thread_win32-mt.a(thread.o): duplicate section `.rdata$_ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_9gregorian9bad_monthEEEEE[__ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_9gregorian9bad_monthEEEEE]' has different size
319 Игнорируйте их. На работоспособность программы это никак не влияет 
320
321 Если вы хотите уменьшить размер бинарных файлов, то
322 1) Перейдите на сайт http://upx.sourceforge.net/#downloadupx
323 2) Скачайте программу в соответсвии с вашей системой
324 3) Распакуйте программу в папку с бинарными Novacoin файлами.
325 4) Введите в терминале
326 ./upx -9 novacoind.exe
327 затем
328 ./upx -9 novacoin-qt.exe
329
330 И ваши novacoind и novacoin-qt станут меньше ~ в 3 раза.