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