Немного туп(л,)
85 subscribers
192 photos
27 videos
46 links
Маленький бложег С++ программиста, увлекающегося Rust'ом. Не столько про пргрмрвне, а вообще.
Download Telegram
Channel photo updated
Ну привет. Меня не зовут, я сам прихожу Пашечка.
Мне, во-первых, надоело в несколько чатов копировать свои истории, а во-вторых, я подумал, что они не то чтобы прям всем интересны 🌚
Поэтому мой шитпостинг будет теперь здесь.

В названии, картинке и описании канала небольшая игра слов: "let L tuple" можно прочитать почти как "little tuple" 🌚 И это немного тупо, да х)
Для тех, кто не знает ни меня, ни про меня:
Я - С++ программист, субъективно middle уровня, а объективно, надо выгнать меня мести улицы. В свободное время увлекаюсь попытками написать что-то на Rust'е. Что обидно, интересуюсь я Rust'ом примерно с 2014 года, но что-то более менее рабочее могу написать с 2019 только 🌚 Лоботряс и лентяй ибо.

На данный момент я работаю на предприятии ВПК РФ, всякие тренажёры разрабатываем, системы трёхмерной визуализации, симуляции, и прочее. По идее, деятельность моего отдела крайне близка к геймдеву, но лично я больше занимаюсь околосистемными вещами, многопоточностью, системой сборки, прикручиванием сторонних библиотек и их отладкой. Ну и у нас в отделе я проповедник плюсового стандарта, хотя и далеко не спец в его толковании)

Хочу свалить куда-то, где основным языком будет Rust, но пока не получается.
👍1
#truestory #cpp #jobbing

Ну а теперь история, ради которой этот канал был создан, и она про отладку сторонних библиотек.

Мы используем boost. Но мало того, что мы используем boost, мы используем старый boost, а именно версии 1.62, потому что он поставляется с Astra Linux 1.6. А Астра наша приоритетная целевая ОСь. (На самом деле под виндой у нас boost v1.64, но сути это не меняет)

И вот затащили мы некоторое время назад open-license-manager, в составе которого библиотека licensecc и генератор лицензий lccgen. И вот последний тоже зависит от boost'а. Ограничений на версию в CMakeLists.txt не установлено, а в документации проекта сказано использовать >= 1.57, и с нашей старой версией (напомню, что это 1.62) оно в принципе собирается, но только если отключить сборку тестов, но кому эти тесты нужны, правда?
Однако, при запуске, падает во время разбора аргументов командной строки (используется boost::program_options). Опытным путём выяснили, что если подкинуть версию boost'а 1.71, то падения пропадают. Кажется, даже тесты собираются, но это не точно, они же нинужны, поэтому я не перепроверял.

В принципе, мы генератор лицензий заказчикам не отдаём, поэтому собрали это дело только под окошками с новым boost'ом, забив на сертификацию, и всё бы ничего, но вот теперь потребовалось заиметь генератор и под Астру...
#jobbing

Маленькое отступление: почему Астра, это проблема при выборе зависимостей.

Astra Linux Special Edition, это операционная система для использования в критических инфраструктурах с повышенными требованиями к безопасности и защите данных. Она сертифицирована в ФСБ, ФСТЭК, и где-то там ещё, короче имеет все возможные отечественные сертификаты, что позволяет использовать её для работы с документами под грифом вплоть до "особой важности". Наше ПО тоже проходит такую же сертификацию (хотя скорее всего "облегчённую", не до конца уверен). А для того, чтобы получить сертифицированный продукт, необходимо использовать только сертифицированные инструменты и сторонние библиотеки. Теоретически можно самостоятельно собрать и новый boost, и новый cmake, и новое что угодно, но это тоже придётся сертифицировать. А сертификация стоит денег, и количество этих денег зависит от количества сертифицируемого кода. То есть, хочешь собирать больше зависимостей - плати больше денег. Поэтому мы сильно ограничены в инструментах.

Как-то я прикидывал, что нам будет стоить собрать по нормальному, по правильному, новые драйвера для AMD GPU, и вышло всё очень объёмно с тонной ненужных в рантайме зависимостей. Пришлось собирать кое-как, и при установке наших драйверов, по факту, портится система.
Немного туп(л,)
#truestory #cpp #jobbing Ну а теперь история, ради которой этот канал был создан, и она про отладку сторонних библиотек. Мы используем boost. Но мало того, что мы используем boost, мы используем старый boost, а именно версии 1.62, потому что он поставляется…
Возвращаемся к lccgen и boost.

Утилита lccgen среди аргументов принимает список фич (features), которые добавляются в лицензию. То есть вы можете выдать лицензию только на ваш продукт, а можете разрабатывать дополнительные платные плагины, и формировать лицензию для некоторого набора этих плагинов. Эти фичи задаются через coma-separated list: -f Feat1,Feat2,Feat3. И исключение выбрасывается здесь:
po::store(
po::command_line_parser(opts) // Создаём парсер. opts - это вектор строк, куда собраны все ещё не обработанные аргументы
.options(project_desc) // Добавляем описание (для вывода хэлпа и привязки переданных аргументов к их описанию)
.run(), // Запускаем парсер
vm); // Перекладываем данные в variables_map

Падение происходит только если пользователь указал список фич, все остальные аргументы обрабатываются нормально. Поэтому, чтобы осознать, что не так, надо найти описание для списка фич:
// В каком-то хэдере
#define PARAM_FEATURE_NAMES "feature-names"

// Конкретно описание опций
po::options_description license_desc("license issue options");
// [...]
license_desc.add_options()
// [...]
(PARAM_FEATURE_NAMES ",f", po::value<boost::optional<std::string>>(),
"Feature names: comma separate list of project features to enable. if not specified will be taken as project "
"name.")
// [...]
;

Господи, как же это сделано неудобно! Функтор на функторе, блджад! Какой же clap офигенный на этом фоне!
Немного поменяю форматирование и уберу лишнее, оставив только суть:
license_desc.add_options()(
"feature-names,f" // Имя ключа
po::value<boost::optional<std::string>>(), // Тип данных аргумента
"<option-description>" // Описание
);

К слову, это единственный параметр, который принимает значение optional<string>, в остальных обычный string. Почему авторы так сделали? Не знаю. Но лучше бы они так не делали.
👍1