7a487361b5d78f1794a04e4f1852b06ba56cb6ab
[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) Miniupnpc
70 -Скачайте http://miniupnp.free.fr/files/download.php?file=miniupnpc-1.9.20150206.tar.gz
71 -Распакуйте в домашнюю папку
72 -Переименуйте папку miniupnpc-1.9.20150206 в miniupnpc
73 -Перейдите в папку miniupnpc и создайте файл miniupnpcstrings.h
74 -Напишите в нём:
75
76 #ifndef MINIUPNPCSTRINGS_H_INCLUDED
77 #define MINIUPNPCSTRINGS_H_INCLUDED
78
79 #define OS_STRING "MSWindows/6.1.7601"
80 #define MINIUPNPC_VERSION_STRING "1.9"
81
82 #if 0
83 /* according to "UPnP Device Architecture 1.0" */
84 #define UPNP_VERSION_STRING "UPnP/1.0"
85 #else
86 /* according to "UPnP Device Architecture 1.1" */
87 #define UPNP_VERSION_STRING "UPnP/1.1"
88 #endif
89
90 #endif
91
92 и сохраните файл
93 -Откройте файл Makefile.mingw
94 -Измените строку 7:
95 измените
96  CC = gcc
97 на
98  CC=$(CROSS)gcc
99
100 -Удалите строки с 67 по 73
101
102 wingenminiupnpcstrings: wingenminiupnpcstrings.o
103
104 wingenminiupnpcstrings.o:       wingenminiupnpcstrings.c
105
106 miniupnpcstrings.h: miniupnpcstrings.h.in wingenminiupnpcstrings
107         wingenminiupnpcstrings $< $@
108
109 -Сохраните файл
110
111 -Откройте терминал
112
113  export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
114  make CROSS=i686-w64-mingw32.static- -f Makefile.mingw init upnpc-static
115
116
117 Проверка, что установка Miniupnpc прошла успешно:
118 В папке miniupnpc должен появиться файл libminiupnpc.a
119
120
121 2.6) qrencode
122 -Скачайте http://download.sourceforge.net/libpng/libpng-1.6.15.tar.gz?download
123 -Распакуйте в домашнюю папку
124 -Откройте терминал
125
126  export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
127  cd /home/<ваше имя>/libpng-1.6.15
128  ./configure --host=i686-w64-mingw32.static --disable-shared
129  make
130  cp .libs/libpng16.a .libs/libpng.a
131
132 Проверка что libpng собралась успешно:
133 в папке /home/<ваше имя>/libpng-1.6.15/.libs должен быть файл:
134 libpng.a
135
136 -Скачайте http://fukuchi.org/works/qrencode/qrencode-3.4.4.tar.gz
137 -Распакуйте в домашнюю папку
138 -Откройте терминал
139  export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
140  cd /home/<ваше имя>/qrencode-3.4.4
141
142  LIBS="../libpng-1.6.15/.libs/libpng.a ../mxe/usr/i686-w64-mingw32.static/lib/libz.a" \
143  png_CFLAGS="-I../libpng-1.6.15" \
144  png_LIBS="-L../libpng-1.6.15/.libs" \
145  ./configure --host=i686-w64-mingw32.static --enable-static --disable-shared --without-tools
146
147  make
148
149 Проверка что qrencode успешно собралась:
150 в папке /home/<ваше имя>/qrencode-3.4.4/.libs должен быть файл:
151 libqrencode.a
152
153 2.7 Qt 5 и Qt 4
154
155 Qt 4
156 -Откройте терминал
157
158  cd /home/<ваше имя>/mxe
159  make qt
160
161 Проверка что Qt4 собрался правильно:
162 -Откройте терминал
163 -Введите следующие команды
164  export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
165  i686-w64-mingw32.static-qmake-qt4 -v
166
167 -Должно появиться в ответ
168 QMake version 2.01a
169 Using Qt version 4.8.6 in /home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/qt/lib
170
171 Qt 5
172 -Откройте терминал
173
174  export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
175  cd /home/<ваше имя>/mxe
176  make qtbase qttools qttranslations
177
178 Проверка что Qt5 собрался правильно:
179 -Откройте терминал
180 -Введите следующие команды
181  export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
182  i686-w64-mingw32.static-qmake-qt5 -v
183
184 -Должно появиться в ответ
185 QMake version 3.0
186 Using Qt version 5.4.0 in /home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/qt5/lib
187
188 3. Компиляция
189
190 3.1 Скачиваем исходники
191 -Перейдите в домашнюю папку
192 -Откройте терминал
193
194  git clone https://github.com/novacoin-project/novacoin.git
195
196 3.2 Собираем novacoind 
197 -Откройте файл makefile.mingw в текстовом редакторе.(При написании инструкции использовался Pluma 1.8.1)
198 -Вставьте 
199 CC=$(CROSS)gcc
200 CXX=$(CROSS)g++
201 -Поменяйте USE_UPNP:=0 на USE_UPNP:=1
202 -Добавьте  строчку USE_ASM:=1
203 -Поменяйте текущие INCLUDEPATHS, LIBPATHS, LIBS на:
204
205 BOOST_SUFFIX?=-mt
206
207 INCLUDEPATHS= \
208  -I"$(CURDIR)" \
209  -I"/home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/include" \
210  -I"/home/<ваше имя>/" \
211  -I"/home/<ваше имя>/db-6.0.20/build_unix" \
212  
213 LIBPATHS= \
214  -L"$(CURDIR)/leveldb" \
215  -L"/home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/lib" \
216  -L"/home/<ваше имя>/miniupnpc" \
217  -L"/home/<ваше имя>/db-6.0.20/build_unix" \
218
219 LIBS= \
220   -l leveldb \
221   -l memenv \
222   -l boost_system$(BOOST_SUFFIX) \
223   -l boost_filesystem$(BOOST_SUFFIX) \
224   -l boost_program_options$(BOOST_SUFFIX) \
225   -l boost_thread$(BOOST_SUFFIX) \
226   -l boost_chrono$(BOOST_SUFFIX) \
227   -l db_cxx \
228   -l ssl \
229   -l crypto \
230   -l z
231 -Поменяйте LDFLAGS=-Wl,--dynamicbase -Wl,--nxcompat на 
232 LDFLAGS=-Wl,--dynamicbase -Wl,--nxcompat -Wl,--large-address-aware -static
233
234 -Поменяйте в последних строчках makefile.mingw
235 g++ -c $(CFLAGS) -o $@ $<
236 на
237 $(CXX) -c $(CFLAGS) -o $@ $<
238
239 g++ $(CFLAGS) $(LDFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS)
240 на
241 $(CXX) $(CFLAGS) $(LDFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS)
242
243 -Если вы хотите использовать LevelDB как базу блоков то измените:
244 USE_LEVELDB:=0 
245 на
246 USE_LEVELDB:=1
247 (выше USE_IPV6:=1)
248 Откройте файл /home/<ваше имя>/novacoin/src/leveldb/Makefile
249 Вставьте ниже строчки CXXFLAGS += -I. -I./include $(PLATFORM_CXXFLAGS) $(OPT) следующие строки:
250
251 CC=$(CROSS)gcc
252 CXX=$(CROSS)g++
253 Сохраните файл
254
255 Снова возвращаемся в файл makefile.mingw, измените 
256 cd leveldb; make; cd ..
257 на 
258 cd leveldb; TARGET_OS=NATIVE_WINDOWS make CROSS=i686-w64-mingw32.static- libleveldb.a libmemenv.a; cd ..
259
260 Ещё измените
261 obj/txdb-leveldb.o: leveldb/libleveldb.lib
262 на
263 obj/txdb-leveldb.o: leveldb/libleveldb.a
264
265 Если вы хотите использовать BerkeleyDB как базу блоков, то просто удалите строчку USE_LEVELDB:=1
266
267 -Сохраните измененный файл makefile.mingw
268
269 -Откройте терминал
270 cd /home/<ваше имя>/novacoin/src
271 export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
272 make CROSS=i686-w64-mingw32.static- -f makefile.mingw
273 strip novacoind.exe
274
275
276 Во время линковки будут выдаваться подобные сообщения:
277 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
278 Игнорируйте их. На работоспособность программы это никак не влияет
279
280
281 3.3 Собираем Novacoin QT
282
283 Внимание: Если вы хотите собирать Novacoin Qt с LevelDB, но пропустили шаг со сборкой novacoind.exe, то 
284 -Измените Makefile в папке leveldb также как в пункте 3.2
285 -Откройте терминал и выполните следующие команды:
286 export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
287 cd /home/<ваше имя>/novacoin/src/leveldb
288 TARGET_OS=NATIVE_WINDOWS make CROSS=i686-w64-mingw32.static- libleveldb.a libmemenv.a;
289
290 -Откройте файл /home/<ваше имя>/novacoin/novacoin-qt.pro в текстовом редакторе(при написании инструкции использовался Pluma 1.8.1)
291 -Ниже 
292 # Dependency library locations can be customized with:
293 #    BOOST_INCLUDE_PATH, BOOST_LIB_PATH, BDB_INCLUDE_PATH,
294 #    BDB_LIB_PATH, OPENSSL_INCLUDE_PATH and OPENSSL_LIB_PATH respectively
295 замените прописанные пути к зависимостям на
296
297 BOOST_LIB_SUFFIX=-mt
298 BOOST_INCLUDE_PATH=/home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/include
299 BOOST_LIB_PATH=/home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/lib
300 BDB_INCLUDE_PATH=/home/<ваше имя>/db-6.0.20/build_unix
301 BDB_LIB_PATH=//home/<ваше имя>/db-6.0.20/build_unix
302 OPENSSL_INCLUDE_PATH=/home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/include
303 OPENSSL_LIB_PATH=/home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/lib
304 MINIUPNPC_INCLUDE_PATH=/home/<ваше имя>/
305 MINIUPNPC_LIB_PATH=/home/<ваше имя>/miniupnpc
306 QRENCODE_INCLUDE_PATH=/home/<ваше имя>/qrencode-3.4.4
307 QRENCODE_LIB_PATH=/home/<ваше имя>/qrencode-3.4.4/.libs
308
309 Так же измените(если ещё не изменено) 
310 LIBS += -lshlwapi
311 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
312
313 на
314  
315 LIBS += -lshlwapi
316 #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
317
318 Если в файле нет такой строчки CONFIG += static , то добавьте её.
319
320 Измените 
321 win32:QMAKE_LFLAGS........................
322 на 
323 win32:QMAKE_LFLAGS *= -Wl,--large-address-aware -static 
324
325 Измените 
326 win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\\lrelease.exe
327 на
328 win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease
329
330 Измените
331 LIBS += -lboost_system$$BOOST_LIB_SUFFIX -lboost_filesystem$$BOOST_LIB_SUFFIX -lboost_program_options$$BOOST_LIB_SUFFIX -lboost_thread$$BOOST_THREAD_LIB_SUFFIX
332 на
333 LIBS += -lboost_system$$BOOST_LIB_SUFFIX -lboost_filesystem$$BOOST_LIB_SUFFIX -lboost_program_options$$BOOST_LIB_SUFFIX -lboost_thread_win32$$BOOST_THREAD_LIB_SUFFIX
334
335 Измените
336 windows:LIBS += -lboost_chrono$$BOOST_LIB_SUFFIX -Wl,-Bstatic -lpthread -Wl,-Bdynamic
337 на
338 windows:LIBS += -lboost_chrono$$BOOST_LIB_SUFFIX
339
340 -Сохраните измененный файл novacoin-qt.pro
341 -Откройте терминал и выполните следующие команды
342
343 Qt4 + транзакционный индекс LevelDB
344
345 export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
346 cd /home/<ваше имя>/novacoin
347 i686-w64-mingw32.static-qmake-qt4 "USE_UPNP=1" "USE_IPV6=1" "USE_LEVELDB=1" "USE_ASM=1" novacoin-qt.pro
348 make -j n -f Makefile.Release  (вместо n количество ядер вашего процессора, которые вы хотите выделить под сборку)
349
350 Qt4 + транзакционный индекс BDB
351
352 export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
353 cd /home/<ваше имя>/novacoin
354 i686-w64-mingw32.static-qmake-qt4 "USE_UPNP=1" "USE_IPV6=1" "USE_ASM=1" novacoin-qt.pro
355 make -j n -f Makefile.Release  (вместо n количество ядер вашего процессора, которые вы хотите выделить под сборку)
356
357 Qt5 + транзакционный индекс LevelDB
358
359 export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
360 cd /home/<ваше имя>/novacoin
361 i686-w64-mingw32.static-qmake-qt5 "USE_UPNP=1" "USE_IPV6=1" "USE_LEVELDB=1" "USE_ASM=1" novacoin-qt.pro
362 make -j n -f Makefile.Release  (вместо n количество ядер вашего процессора, которые вы хотите выделить под сборку)
363
364 Qt5 + транзакционный индекс BDB
365
366 export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
367 cd /home/<ваше имя>/novacoin
368 i686-w64-mingw32.static-qmake-qt5 "USE_UPNP=1" "USE_IPV6=1" "USE_ASM=1" novacoin-qt.pro
369 make -j n -f Makefile.Release  (вместо n количество ядер вашего процессора, которые вы хотите выделить под сборку)
370
371
372 Если всё сделано правильно, то файл novacoin-qt.exe будет находится в папке /home/<ваше имя>/novacoin/release
373 Во время линковки будут выдаваться подобные сообщения:
374 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
375 Игнорируйте их. На работоспособность программы это никак не влияет 
376
377 Если вы хотите уменьшить размер бинарных файлов, то
378 1) Перейдите на сайт http://upx.sourceforge.net/#downloadupx
379 2) Скачайте программу в соответсвии с вашей системой
380 3) Распакуйте программу в папку с бинарными Novacoin файлами.
381 4) Введите в терминале
382 ./upx -9 novacoind.exe
383 затем
384 ./upx -9 novacoin-qt.exe
385
386 И ваши novacoind и novacoin-qt станут меньше ~ в 3 раза.