вторник, 26 сентября 2017 г.

Как собрать altcoin-qt под Windows? Еще раз о компиляции.

Сегодня мы с вами рассмотрим каким образом можно собрать из исходников или проще говоря скомпилировать кошелек (wallet) практически любого AltCoin'а. В предыдущей статье, которая вышла на Яндекс.Дзене - Руководство. Как собрать ccminer из исходников под Windows? я уже рассматривал сборку из исходников, там мы использовали MSVC (Visual Studio 2013) для сборки ccminer. Теперь пришло время рассмотреть как же собрать кошелек для криптовалют под Windows. Почему именно altcoin-qt? Как вы уже поняли - это обобщенное название. Структура большинства монет состоит из нескольких исполняемых файлов - непосредственно демона (altcoind), консольного кошелька или же просто консольного средства управления демоном (altcoin-cli) и кошелька с графическим интерфейсом (altcoin-qt). В частности "комплект" популярного кошелька Bitcoin Core также состоит из этих трех компонентов.

Зачем это может понадобиться, спросите вы. Ведь в большинстве случаев скачать готовую сборку в виде exe'шника можно на официальном сайте проекта или на многочисленных форумах и т.п. Ну во-первых, это более безопасно. Собранный самостоятельно кошелек из скачанных с официального Git репозитория разработчика исходников, как вы понимаете, гораздо безопаснее чем некий exe'шник с непонятного форума, во-вторых - конечно же у любого разработчика есть раздел releases, но, например, релиза собранного релиза со свежими изменениями еще нет, а вам очень хочется получить их. В-третьих, уже собранная релизная версия может не включать в себя каких-то функций, которые есть в dev или night сборках, а здесь вы можете запросто включить их. Ну и в четвертых, сборка из исходников может быть познавательна в образовательных целях, кто знает, может вы всерьез решите заняться программированием и добавите в ПО какую-то существенно полезную функцию, упрощающую его использование. Вообщем вариантов ответа на вопрос "зачем" тут масса. Если вы читаете эту статью - значит вам уже стало интересно.

Сразу скажу, что сборка подобных вещей под Windows занятие не из легких. В мире Linux подобное делается в разы проще, если упрощенно, т.е. не затрагивая установку зависимостей, хотя она тоже делается с помощью нескольких простых команд, для сборки проекта в Linux, как правило, необходимо выполнить всего три простых команды - git clone, ./configure и make. Первая из которых предназначена для клонирования репозитория, т.е. скачивания исходников, вторая и третья для конфигурации и непосредственно сборки. Так что для тех кому по каким-либо причинам придется делать подобные вещи достаточно часто - проще установить Linux (поверьте, это не так сложно и достаточно удобно в целом), если же вы ярый приверженец Windows и эта ваша единственная ОС, тогда читаем дальше.

Говоря о сложностях при сборке под Windows необходимо учитывать, что хотя большинство altcoin'ов представляют собой кроссплатформенное ПО (т.е. теоретически его можно собрать на любой ОС - Linux, Windows, MacOS и т.п.), сделать это под Windows не так просто. И первым камнем преткновения здесь становятся зависимости от библиотек, которые также нужно скачивать отдельно и собирать из исходников. Плюс разнообразие версий компиляторов и отсутствие единых стандартов при конфигурации сборки. В результате чего сборку под Windows можно назвать не совсем тривиальным процессом. А как же разработчики, спросите вы? Неужели они проходят все те же этапы, т.е. для сборки релизной версии своего ПО ставят Windows, собирают под него свой тулчейн (toolchain) и т.п.? В большинстве случаев - нет. В мире Linux опять же все проще, за счет использования такой вещи как кросскомпиляция. Там это удобно. Грубо говоря, поставив соответствующий toolchain для сборки под Windows на Linux платформу, на выходе мы будем получать exe'шники и dll'ки, вместо исполняемых ELF-файлов и .so библиотек. Не все так просто, но в общем случае собрать что-то под Linux'ом (даже предназначающееся для использования в другой ОС) зачастую бывает проще, чем выполнить аналогичную задачу под Windows. Однако, мы ведь не боимся сложностей?


Скажу сразу, что для того чтобы достигнуть того что будет описано в этой статье - у меня ушли примерно сутки рабочего времени (по чуть-чуть, по чуть-чуть, но получилось), т.к. со многими нюансами я и сам был не знаком, а что-то пришлось осваивать прямо на ходу. Ну что ж, начнем готовить нашу сборочную платформу. Вам понадобится Windows 7 и выше, можно x86, можно x64, т.к. собирать мы будем 32-bit'ные сборки. Также вам понадобится умение работать с консолью и несколько утилит, которые я описывал в этой статье. Итак, обязательно ставим:

  1. Архиватор 7-zip или WinRar, если он у вас еще не установлен.
  2. Git for Windows - средство для работы с Git репозиториями.
  3. Far Manager - консольный файловый менеджер.
Ссылки на все это ПО вы можете найти в статье по ссылке выше, также настоятельно рекомендуется прочитать раздел "Курс молодого бойца Far Manager" в ней и попробовать выполнить в Far'е простейшие операции, такие как, смена диска на панели, копирование файлов, создание папок, редактирование файлов и т.п. Сразу учитесь делать это при помощи хоткеев, старайтесь не пользоваться мышкой при совершении этих действий. Это существенно поможет вам сэкономить время в будущем. Также, если вы решили следовать этой инструкции - давайте возьмем за правило, все описанное в ней выполнять обязательно . Т.е. если сказано что нужно взять Far Manager - возьмите Far Manager, даже если вы любите Total Commander. Если сказано, скачать компилятор или toolchain именно такой версии - значит нужно именно такой, не надо брать последнюю версию / самый свежий релиз и т.п. Потому что в результате у вас может ничего не получиться. Не нужно полагаться на собственную "интуицию" и думать в ключе "так тоже заработает, ведь это практически то же самое" - это не всегда верно и поможет вам избежать многих ошибок. Скажем так, перед началом сборки я тоже читал в интернете различные статьи, кстати, вот наиболее полезные из них:


И когда разбирался со всем этим не всегда был внимателен к деталям. В результате куча времени была потрачена на поиск и устранение "детских ошибок", когда, например, весь проект у нас был собран с gcc 4.9.2 (posix) версии, а одна из библиотек случайно (из-за неправильно настроенной переменной окружения PATH) с использованием gcc 6.3.0 (win32), в результате на этапе линковки получались достаточно неинформативные ошибки, выловить которые было достаточно сложно. Имейте ввиду, что система сборки проекта сама по себе достаточно сложная, все просто когда вы компилируете программу состоящую из нескольких десятков или сотен исходных файлов, но когда в дело идет целая система сборки огромного проекта, который использует различные библиотеки, разные части проекта написаны на различных языках и собираются разными компиляторами, причем со своими ключами и т.п., все гораздо сложнее. Ну что ж ... пожалуй начнем. 

Подготовка окружения

К этому моменту я считаю что у вас уже установлено ПО из списка выше и ваша ОС - это Windows 7 и выше. Если у вас на ПК уже были установлены какие-то среды компиляции и т.п. - имейте ввиду, что они могут вызвать неявные ошибки и в этом случае вам придется либо устранить их, либо начать сборку с нуля на свежеустановленной ОС. Чтобы избежать этого лучше всего так и сделать, например, установив такую же копию ОС в бесплатный VirtualBox. Однако, имейте ввиду, что лучше делать все на реальном ПК, потому что так быстрее. Также, желательно чтобы все файлы окружения и исходники ПО размещались на SSD, это может повысить скорость компиляции. 

1. Запускаем Far Manager и создаем в корне диска C:\ папки deps и Qt. В первую мы будем складывать различные зависимости (исходники библиотек), во второй собирать статическую сборку Qt. Все дистрибутивы, да и вообще все что мы скачиваем - будем скачивать в папку deps, т.к. так будет удобнее в будущем. Вся подсистема сборки будет завязаны именно на эти папки, поэтому лучше изначально использовать именно эти пути.

Собирать мы с вами будем кошелек монеты Interzone, вот соответствующая тема на BitcoinTalk. Если в двух словах, то это один из форков Dash'а на алгоритме c11. Но здесь мы не будем вдаваться в подробности, т.к. монета выбрана просто для примера. Тем кто изучает это руководство впервые - советую проделать все описанные в нем шаги именно для Interzone, чтобы вы поняли как это работает.

Да, еще, в процессе работы мы будем использовать несколько окон. Первое - это командная строка Windows, второе - это командная строка MSYS (его мы установим чуть позже). третья - это окно Far Manager. Когда мы будем вводить какие-то команды и т.п., я буду предварительно указывать где именно мы из вводим. Если это не указано дополнительно, то подразумевается что мы их вводим в командной строке Far'а. 

2. Скачаем исходники Interzone. Для этого создадим папку itz в корне диска c:\ и опять же находясь в коре выполним в Far Manager следующую команду: 
git clone https://github.com/projectinterzone/ITZ itz
На всякий случай на первый раз покажу в виде скриншота:


В результате последние исходники будут скачаны и размещены в папке c:\itz .

3. Устанавливаем консоль MSYS отсюда. Обратите внимание, на самом деле это дистрибутив проекта MinGW (Minimalist GNU for Windows), но нам потребуется только MSYS оттуда. Как мы и договаривались, качать мы будем все в папку c:\deps (зависимости), поэтому запускаем файл mingw-get-setup.exe и в инсталляторе MinGW installation manager -> All packages -> MSYS выбираем следующие пакеты:

  • msys-base-bin
  • msys-autoconf-bin
  • msys-automake-bin
  • msys-libtool-bin

Путь по-умолчанию C:\MinGW и все галочки на первом шаге инсталлятора оставляем по-умолчанию и нажимаем кнопку Install, а вот уже на втором шаге помечаем галочками нужные пакеты:

Здесь на самом деле важно не сделать ничего лишнего. Т.е. на вкладке Basic Install мы ничего не трогаем, нигде больше, особенно все что касается MinGW тоже. Просто нажимаем по All packages, переходим в раздел MSYS и выбираем 4 указанных выше пакета. Некоторые галочки там уже будут стоять, их не снимаем. Новых тоже не выставляем, только эти четыре. Также убедитесь в том что галочки на пакетах msys-gcc и msys-w32api не стоят. Если вы что-то перепутали, закройте инсталлятор и запустите его снова. Если все верно, выбираем в меню Installation -> Apply changes и затем снова нажимаем кнопку Apply. После того как все помеченные пакеты будут скачаны и установлены закрываем инсталлятор. Признаком того что вы все сделали правильно является содержимое папки C:\MinGW\bin , там должен быть один исполняемый файл mingw-get.exe . Если там есть что-то еще - значит вы напутали с галочками на предыдущем шаге, в этом случае удаляем C:\MinGW\ полностью и повторяем все вышеописанное более внимательно.

4. Далее мы создаем два файла msys_shell.cmd и cmd_shell.cmd в корне C:\ со следующим содержимым:

msys_shell.cmd
set PATH=%PATH%;C:\mingw32\bin;C:\Qt\5.3.2_Static\bin
C:\MinGW\msys\1.0\msys.bat
cmd_shell.cmd
set PATH=%PATH%;C:\mingw32\bin;C:\Qt\5.3.2_Static\bin
start cmd
И запускаем их:

Здесь (1) - это окно MSYS, (2) - это окно CMD, (3) - это окно Far. В них мы и будем работать. Фактически и (1) и (2) представляют собой командную строку, только в первом случае командным интерпретатором является bash, а во втором - стандартный командный интерпретатор cmd.exe из Windows.

< продолжение следует, статья достаточно объемная и написать ее за один вечер нереально >

7 комментариев :

  1. Ответы
    1. Пока, к сожалению, не удается выделить время на написание продолжения, да и интересующихся темой, честно говоря не очень много. Но продолжение обязательно будет ...

      Удалить
  2. еще как интересно, только уже почти месяц прошел, а продолжения нету(

    ОтветитьУдалить
  3. Доброго времени суток.Проникся вашими гайдами по компиляции и решил попробовать себя в этом деле,так как надоело в некоторых темах быть опоздавшим.Делал всё строго по гайду,и под конец компиляции майнера в VS,начало сыпать ошибки.Как с вами связаться?Хотелось бы понять,что я делаю не так.Заранее благодарен.

    ОтветитьУдалить
  4. Мда, время только зря потратил, на установку всякого софта и его настройку, написали бы, что только первая часть, не заморачивался бы.... пошел курить форумы по темам...

    ОтветитьУдалить
    Ответы
    1. Продолжение статьи обязательно будет, правда сроки этого пока весьма туманны.

      Удалить