Введение
Решая в целом тривиальные задачи, приходится сталкиваться с нетривиальными проблемами, и эта история, собственно, об этом.
В кои-то веки, решив написать код для себя любимого, проработал проект, установил окружение, прописал в проекте boost и пошёл писать модули.
Ничто не предвещало беды, но в процессе написания кода было обнаружено, что модуль, который запрашивал у интернета погоду, получал вместо описанного в API json'а следующее: "400 The plain HTTP request was sent to HTTPS port". Уж чем руководствовался разработчик сайта, не перенаправивший запрос без персональных данных, не знаю, но видимо хакеры хотят украсть сведения о погоде в деревне так сильно, что спать и есть не могут.
И тут я сделал манёвр, который стоил мне 50 лет. Точнее, пары бессонных ночей, так как работать тоже надо. Ничтоже сумнящийся, подключил boost::asio::ssl, написал тестовый код, который должен был проверить что теперь есть контакт, но тут моя бровь поднялась вверх в первый раз: проект перестал собираться, потому что в системе не было OpenSSL.
Совсем открытием это конечно не было. В рабочих проектах мы писали код с использованием этого чуда, но сборкой занимался сервак, так как за каждым чихом перекомпилировать и пересобрать кодовую базу на рабочих станциях никто не желал, а на сервере всё заботливо было установлено. Все это позволяло пользоваться хедерами и лениться в плане ручной компиляции... Штош, дома нет сисадмина Лёхи, пришлось решать проблему ручками.
Что вас ждёт
Поиски.
Установка неожиданных вещей.
Настройка зоопарка.
Планирование установки.
Компиляция (много компиляции).
Причёсывание установки.
Интеграция в проект.
Поиски
Описываю, чтобы не пришлось этим заниматься вам. При поиске обнаружите два стула. На одном - сайты, испещерённые рекламой конкурентов оранжевого ютуба и обещаниями того, что в бинарниках вирусов нет (в установщиках кнопка доната есть, а цифровых подписей, чтоб антивирь не ругался, нет). На другом - официальный репозиторий, размещённый на официальном сайте проекта, вызывающий вьетнамские флешбэки о красноглазой студенческой молодости, но внушающий какое-то доверие.
Я предлагаю тебе взять красную таблетку и пройти за мной в кроличью нору.
Найди удобное место, открой консоль, склонируй репозиторий и погнали.
Установка неожиданных вещей
Изучив крайне информативную инструкцию, вы с толкнётесь с парочкой мыслей:
в 2022 году кто-то использует perl в успешном и развивающемся до сих пор проекте;
для проекта написанного на языке Си необходим ассемблер, ибо без него собирается не так споро;
о makefile создатели знают, но вместо них сборкой занимается perl, и тестированием, может быть ещё тапки приносит но это не точно.
В этот момент я отошёл за кофе и, когда пришёл в себя эмоционально, вернулся к процессу. Довольно приличным для себя нашёл Strwberry Pearl, предлагаемый в инструкции, да и NASM упомянутый в инструкции установился легко.
Веселье ждало позже.
Настройка зоопарка
Установив программки я выяснил ряд подводных камней:
Система не видит NASM.
Система знает про пути perl'а но тот perl который пытается выполнить ваши скрипы - это не тот perl который вы установили.
У меня были эти проблемы, и если вам что есть по этому поводу сказать, то приглашаю в комментарии.
Нам нужно поправить заблуждения системы о системных переменных.
Первая беда будет ждать в path системы:
NASM в процессе установки не умеет прописывать себя в путях так что третья строка снизу была добавлена вручную;
Perl умеет себя прописывать в путях системы но по какой то причине полностью рабочий исполняемы файл perl'а валяется в пользовательских бинарниках у git'а и вызывается вперёд нужного;
многие скрипты, необходимые perl'у, имеют в своём же расположении тёзку с расширением .bat и не вызываются нормально.
Последнее решается размещением расширения .pl в переменной pathext и перемещением его перед расширением .bat.
Далее понадобится перезапустить ПК, так как до сих пор это единственный путь, который гарантирует что переменные системы обновились.
На этом можем проверить факт того, что наши штуки установлены и настроены.
К сожалению, такой же прикол с перлом не пройдёт, так как помним, что в гите живёт его злобный брат-близнец, и надо убедится, что запускается нужный.
Если результат дальнейших действий как на картинках выше - успех
По шагам:
Запускаем перл в консоли.
В диспетчере задач находим процесс перла и заказываем подсмотреть где он живёт (мне удобнее через вкладку "подробности").
Если открывается путь, куда мы устанавливали его - радуемся.
А теперь можно прийти к последнему шагу настройки странных вещей - дополнительные пакеты perl:
Text::Template необходим для того, чтобы компилятор справился со своей работой;
Test::More нужен для того, чтобы можно было проверить: проходят ли полученные бинарники тесты.
Не стоит обманываться сообщением о том, что модуль уже есть. Скорее всего, он будет скачиваться и устанавливаться.
Ставить ли модуль тестов, это, конечно, дело индивидуальное, но если тесты есть, то зачем ими пренебрегать?
Планирование установки
Этап не обязательный, но лучше о нём подумать сразу, а не когда будет каша на диске.
Так как мы думаем про серьёзный проект, то понадобятся варианты, как на статической, так и на динамической сборке. Варианты для отладки и для разных систем - всё это надо как то складывать.
Для других платформ, например ARM, нужно будет создать дополнительные каталоги и выполнить команды по аналогии.
Сам же каталог скорее временный, так как библиотеки удобнее хранить в одном месте, и лично в моём случае, openssl переедет поближе к boost и другим используемым библиотеками, но позже.
Компиляция (много компиляции)
Дальше пойдут инструкции по сборке под конкретные варианты компиляции. При необходимости вы можете пролистать до нужных вам.
x64 Release dll
Здесь и в дальнейшем буду пользоваться приложением терминала Microsoft, но все терминалы, которые нужны для компиляции, доступны из меню Пуск в разделе установленной Visual Studio.
Для начала нужно открыть Терминал разработчика для x64 платформы и перейти в каталог репозитория, скачанного в самом начале.
А теперь понадобится perl. С помощью него настроим переменные сборки и подставим подготовленные каталоги для складирования данных компилятором.
Не нужно забывать, что пути нужно подставлять свои, и будет счастье. На следующем шаге возможно познать дзен, так как компилироваться это будет достаточно долго.
После команды nmake пройдёт ориентировочно 40 минут компиляции. Между первым и вторым кадром прошло 35 минут.
Дальше запуск тестов.
Чудные 20-30 минут тестов стоит провести за чем-нибудь более приятным, чем рябь от консоли.
Теперь нужно решить проблему девственно чистых папок, заготовленных под готовые библиотеки и дать команду компилятору.
Ждать на этом процессе меньше, но это не финал мытарств со сборкой данной версии. Надо прибрать за собой.
Вот теперь мы как пионеры - поработали и прибрали за собой.
x64 Release lib
Для статической библиотеки, находясь в каталоге репозитория, ввести настройки конфигурации для новой сборки. Как и в прошлый раз пользуемся перлом.
Необходимо указать каталог выходных файлов и добавить в конце ключ no-shared, это позволит собрать библиотеку для статической линковки.
Дальше шаги повторяют сборку динамической версии.
После команды nmake чем-нибудь займите себя, так как время сборки кардинально меньшим не станет.
Хотя в этом случае звёзды благоволили и сборка прошла за 20 минут, но никто не отменял тесты.
Тесты пройдены, пора устанавливать.
Команда установки обзавелась дополнительным суффиксом и хоть сработает и без него, но полученный результат не сработает в проекте так как надо.
Можно по выполнении команды убедиться что всё переместилось в нужный нам каталог.
Побираемся, так как нефиг захламляться, да и последующим сборкам мешать будет.
x64 Debug dll
Процесс в целом довольно длительный и требует терпения, так что в этот раз, весь набор команд, необходимых для работы с конкретным вариантом сборки, я отправил в один пайплайн, который получился довольно увесистым.
perl Configure VC-WIN64A --debug --prefix=E:\soft\libs\movebox\dll\x64\debug --openssldir=E:\soft\libs\movebox\SSL && nmake && nmake test && nmake install_sw && nmake clean
Всё что выше - одна строка, и одной строкой же отправляется в консоль разработчика. При этом обратите внимание, что появился ключ debug в первой команде, и мы поменяли выходной каталог для библиотеки. Ключ для статической библиотеки здесь убран.
Вообще пайплайны устроены так, что если указан && между командами, то программы по данным меду собой не связаны, но следующие запускаются только если предыдущие выполнились без ошибок, что позволяет узнать когда процесс пошёл не туда. С учётом того, что почти все команды, объединенные в пайп, длительные, и ловить каждые пару минут, закончилось оно или нет бывает проблематично, то запустить и забыть на часик другой про окно - довольно удобно.
Что приятно, так это то, что последующие шаги мы так же упростим а текущая команда подготовила место для работы после себя.
x64 Debug lib
Надеюсь, к этому моменту вы прониклись ленивостью, так как четвёртая компиляция пройдёт в такой же ускоренной манере.
perl Configure VC-WIN64A --debug --prefix=E:\soft\libs\movebox\lib\x64\debug --openssldir=E:\soft\libs\movebox\SSL no-shared && nmake && nmake test && nmake install_sw && nmake clean
В командах поменялись пути и добавлен ключ статической библиотеки, остаётся ждать.
Теперь мы закончили с билдом x64 платформы полностью и можно переходить к x86.
X86 all in one
Всё что нужно проделать для x86 платформы объединим в один скрипт.
perl Configure VC-WIN32 --debug --prefix=E:\soft\libs\movebox\lib\x86\debug --openssldir=E:\soft\libs\movebox\SSL no-shared && nmake && nmake test && nmake install_sw && nmake clean && perl Configure VC-WIN32 --prefix=E:\soft\libs\movebox\lib\x86\release --openssldir=E:\soft\libs\movebox\SSL no-shared && nmake && nmake test && nmake install_sw && nmake clean && perl Configure VC-WIN32 --debug --prefix=E:\soft\libs\movebox\dll\x86\debug --openssldir=E:\soft\libs\movebox\SSL && nmake && nmake test && nmake install_sw && nmake clean && perl Configure VC-WIN32 --prefix=E:\soft\libs\movebox\dll\x86\release --openssldir=E:\soft\libs\movebox\SSL && nmake && nmake test && nmake install_sw && nmake clean
Мешанина выше - это однострочный скрипт, который сделает всю необходимую работу по компиляции к размещению готового варианта библиотек. Но убедитесь, что запускаете вы его из под нужной консоли разработчика и в директории репозитория open ssl
И только после того, как убедитесь, что все условия соблюдены, запускаете нашу лошадку вывозить компиляцию.
Tips: Для большинства проектов достаточно собрать пару debug-release для конкретно вашей платформы и только в одном формате dll или lib.
Теперь пустых директорий в заготовленной папке у нас нет. Можно приступить к следующему шагу.
Причёсывание установки
После полностью прошедшего процесса установки и компиляции стоит почистить временные файлы
Папка ssl более не понадобится. Следующим шагом следует переместить библиотеку на постоянное место жительства. В случае с текущим компом, подобные библиотеки находятся в стандартном каталоге visual studio
Ну и библиотеки будут жить в папке libs
Переносим из временной папки библиотеки в заботливо созданную под это дело папку с названием библиотеки и версии. Так же переименуем папки с версиями для статической и динамической линковки - будет труднее запутаться так как lib и dll файлы будут фигурировать довольно часто, независимо от версии.
Интеграция в проект
Как видим, факт наших мучений с компиляцией не сильно впечатлил VIsual Studio, и нужно показать расположения вожделенных документов.
Так как в одном проекте нельзя одновременно подключать и статическую и динамическую версии одной и той же библиотеки, продемонстрирую пример подключения динамической версии, так как для отладки это может быть удобнее.
Нужно залезть в свойства проекта и перейти в настройки с/с++ и изменить настройки дополнительных включаемых каталогов.
В окне изменения с помощью магии макросов Visual Studio создадим универсальный путь включения.
Макросы помогут не один раз. Самое время проверить что теперь думает Visual Studio.
Ругаться стали по-другому. Теперь ошибки возникают не на уровне компиляции, а при линковке. Приблизились нас на шаг к победе.
Теперь нужно научит проект видеть исполняемые файлы dll и подключать в наш исполняемый файл вызовы нужной библиотеки.
Перво-наперво поясним компоновщику где лежат файлы вызовов функций. Добавим запись в дополнительные каталоги библиотек. Затем перейдя из вкладки общее в ввод дополним дополнительные зависимости.
libcrypto.lib;libssl.lib; - разделены ; которые нельзя забывать так что лучше через меню изменения
Теперь решение собирается и мы можем проверить что работает.
Отладка или релиз - не важно программа выдаёт:
Так как не научили проект знать о местоположении исполняемых файлов. Надо открыть свойства проекта и перейти в каталоги vс++
Нужный раздел - каталоги исполняемых файлов. Именно туда вписывают пути до библиотек dll.
И вуаля - работает.
Теперь можно успокоится и со спокойным разумом продолжить работу над проектом, а не над войной со строптивой библиотекой.
Заключение
В процессе работы несколько раз были очень подлые моменты, например, что брандмауэр системы, на пару с антивирусом, просыпались из отключки и ломали компиляцию. x86 до рабочего состояния вовсе собралась раза с 4, и в конечном счёте была доустановлена только ради гайда. В данной статье постарался осветить возможные проблемы при работе и проведении процесса. Сколько я не искал на просторах рунета нормальных инструкций по развёртыванию open ssl, не нашёл таковых, и надеюсь на отклик со стороны читателей, а также на то, что статья будет полезна хотя бы ещё паре человек на этой планете. Успехов.
Комментарии (24)
pavel_pimenov
24.07.2022 20:05+2я собираю openssl в VC++ и линкую статически https://github.com/pavel-pimenov/flylinkdc-r6xx/tree/master/openssl
Evengard
25.07.2022 00:14Почему-то раньше думал что OpenSSL под LGPL, а он оказывается под Apache 2.0...
Sazonov
24.07.2022 20:11+8А еще можно взять vcpkg и не заморачиваться.
Evengard
24.07.2022 20:17+1Вот тоже подумал. Столько геморроя, которые решаются vcpkg буквально за 5-10 минут...
Xadok
24.07.2022 20:51+6Автор буквально сам себе злой буратино. Можно взять vcpkg или conan и не писать статью, а написать лишь одну строчку.
max_dark
24.07.2022 21:11+4Для этого сейчас есть пакетные менеджеры.
Конкретно для студии - NuGet - зависимости нужных версий устанавливаются прямо из IDE
Кроссплатформенные (из тех что пробовал) - conan, vcpkg. Довольно легко интегрируются с CMake.
askharitonov
24.07.2022 21:20+4На что только люди не пойдут, чтобы не ставить Linux :-)
Но, если серьёзно, аналогичный код (кое-что поменял когда перепечатывал) у меня скомпилировался такой командой:g++ -o mytest ssl.cpp -lboost_system -lcrypto -lssl -lpthread
Debian GNU/Linux 11, нужные заголовочные файлы и библиотеки даже оказались установлены (нужны были для чего-то раньше).
hard2018
25.07.2022 09:11-3На что только люди не пойдут, чтобы не ставить Linux :-)
Через линух - кривой путь. Ещё больше колготы, если линух ещё не установлен.
Serge78rus
24.07.2022 22:38+2На следующем шаге возможно познать дзен, так как компилироваться это будет достаточно долго.
А виндовый nmake не поддерживает многопоточную компиляцию? В нормальном make это делается ключем -j N, где N — желаемое число потоков (обычно берется равным числу ядер процессора). Так сборка идет гораздо веселее.
AllKnowerHou
25.07.2022 09:38Не помню но как то добыл опенссл для винды правда без буста, до сих пор не парюсь - лежит в репозитории
DmitryShm
25.07.2022 09:41Характер "внезапно возникающих" задач говорит о том, что это всё-таки какой-то домашний проект. Если на профессиональной ниве такие проблемы прилетают внезапно --- это ж коллеги заживо съедят. Ну выберите нормальный репозиторий, в котором подобные задачи решаются штатным образом. И про порядок включения компонентов тоже договариватся ну точно не спешным порядком. И под Windows есть выбор репозиториев, кстати. Да хоть MinGW и аналоги берите, если не нравятся корпоративные решения (по характеру ваших изменений и выбору технологий под Windows мне кажется, что сторонитесь фарватера, как минимум).
amarao
Как пересобрать SSL под Windows. 15 экранов текста с картинками в посте.
Как пересобрать SSL под Linux (Debian GNU/Linux):
sudo apt-get build-dep openssl && apt-get source -b openssl
. На выходе deb'ка для установки.В процессе сборки оно выглядит страшно... Но ради этого дистрибутивы и существуют. Чтобы один раз человек сделал сложное и невозможное, а остальные пользовались.
pavel_pimenov
Сборка под винду тоже короткая, но требуется как минимум perl
call "C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Auxiliary\Build\vcvars64.bat"
perl Configure VC-WIN64A no-asm no-shared --prefix=c:\openssl-build-x64
call ms\do_win64a
nmake.exe -f makefile
amarao
Откуда у вас на машине весь этот софт? Кто его поставил? Каких версий? Откуда нужные зависимости нужных версий?
Всюду хвосты неявного происхождения.
(debian/rules для openssl - 152 строки!)
Кстати, тот самый Makefile, который топикастер искал.
Chuvi
Какой "весь"? Nmake это сборщик который вместе с Visual Studio идёт. Тут пёрл и вижла.
bombe
А Visual Studio из коробки? Извините за сарказм. Просто amarao, скорее всего, имел ввиду, что в linux ничего предварительно-дополнительно ставить не нужно и вся забота ложиться на пакетный менеджер.
mayorovp
Это только до тех пор пока вас устраивает системная версия openssl. Но если она вас устраивает — на кой вообще её пересобирать?
Serge78rus
Если не устраивает, то собрать и установить новую версию тоже не проблема:
Кстати, openssl похоже тот случай, когда кросскомпиляция из Линукса под винду проще, чем нативная компиляция под виндой:
iig
Обновлять системную либу через make install - это ведь шутка такая, да?
Serge78rus
Конечно, правильней было бы собрать пакет и установить его штатными средствами дистрибутива.
iig
Если измененя минорные - не вижу смысла чего-то переустанавливать. Если изменения серьёзные (1.0 на 1.1 например) - я бы так не делал.
amarao
С новой версией будут танцы потоньше. Надо будет притащить новый тарбол и поправить зависимости, если надо. Мой лучший инструмент для этого
gbp
.В целом, вопрос с уточнением зависимостей сохраняется в полный рост (кто-то это должен проверить и выписать), но сам процесс сборки будет целиком контролироваться cowdancer'ом (до-докеровая штука для создания окружения с заданными версиями пакетов).
В целом, это довольно сложный путь, но он а) полностью sound и reproducible, б) приводит к результатам, которые можно распространять за пределы своей машины.