LINUX.ORG.RU

plibsys — кросс-платформенная системная библиотека на C

 , , ,


10

7

Недавно ко мне обратились с вопросом, не хочу ли я написать новость об одной из разрабатываемых библиотек (plibsys). В принципе, я не против, поэтому эксклюзивно для LOR.

Что такое plibsys?

plibsys — это кросс-платформенная системная библиотека, написанная на чистом C. Основной упор был изначально сделан на портируемость и поддержку широкого спектра компиляторов. Для достижения этих целей у библиотеки отсутствуют (небольшим исключением является SCO OpenServer 5 ввиду отсутствия на ней потоков) какие-либо зависимости — используются только те вызовы, которые доступны в целевой ОС. Также никакого ассемблера и использования прочих недокументированных возможностей. Для сборки нужен только рабочий компилятор и CMake.

Изначально библиотека писалась для запуска потоков и работы с сокетами, но постепенно функционал расширялся по мере необходимости. На данный момент есть следующий функционал:

  • Платформо-независимые типы данных
  • Потоки и средства синхронизации: мьютексы, условные переменные, блокировки чтения-записи, спинлоки, атомарные операции
  • Межпроцессное взаимодействие: семафоры, разделяемая память, кольцевой буфер
  • Сокеты (UDP, TCP) с поддержкой IPv4 и IPv6
  • Хэш-функции: MD5, SHA-1, SHA-2, SHA-3, GOST (R 34.11-94)
  • Бинарные деревья: несбалансированное, красно-черное, АВЛ
  • Загрузка разделяемых библиотек
  • Работа с памятью: mmap, установка собственного аллокатора
  • Замер времени исполнения (по возможности — в высоком разрешении)
  • Базовая работа с файлами и директориями
  • Парсер файлов INI
  • Макросы для определения архитектуры ЦПУ, ОС и компилятора
  • Различные вспомогательные структуры данных типа связанного списка, хэш-таблицы, обработка строк

На все есть документация.

Поддерживаемые платформы и компиляторы

Абсолютно все модули покрыты Unit-тестами. Есть интеграция с CI (Travis, AppVeyor), где прогоняется большое число разнообразных конфигураций. Также для улучшения качества кода и снижения числа ошибок используется сервис статического анализа кода Coverity. Для оценки покрытия тестами используется Codecov.

На данный момент поддерживаются следующие платформы:

  • GNU/Linux
  • macOS
  • Windows, Cygwin, MSYS
  • FreeBSD, NetBSD, OpenBSD, DragonFlyBSD
  • Solaris
  • AIX
  • HP-UX
  • Tru64
  • OpenVMS
  • OS/2
  • IRIX
  • QNX Neutrino, BlackBerry 10
  • UnixWare 7
  • SCO OpenServer 5
  • Haiku
  • Syllable
  • BeOS

Также работоспособность библиотеки проверена на следующих компиляторах и архитектурах:

  • MSVC (x86, x64) 2003 и выше
  • MinGW (x86, x64)
  • Open Watcom (x86)
  • Borland (x86)
  • GCC (x86, x64, PPC32be, PPC64be/le, IA-64/32, IA-64, Alpha, HPPA2.0-32, MIPS32, AArch32, SPARCv9)
  • Clang (x86, x64, PPC32be)
  • Intel (x86, x64)
  • QCC (x86, AArch32)
  • Oracle Solaris Studio (x86, x64, SPARCv9)
  • MIPSpro (MIPS32)
  • XL C (PPC64le)
  • DEC C (Alpha)
  • PGI (x86, x64)
  • Cray (x64)

Особенности работы библиотеки, сборки и тестирования на разных платформах с разными компиляторами подробно рассмотрены в Wiki.

Что дальше?

Библиотека по-тихоньку продолжает развиваться, хотя, к сожалению, свободного времени не так много. Например, недавно была добавлена поддержка для систем Cray.

Планирую сделать родной пакет для Debian. В общем-то, он готов, надо только протестировать. В связи с этим, если кто-то сможет выступить в качестве поручителя (он же sponsor в терминологии Debian) для проверки и заливки пакета — буду рад.

Если у кого-то есть доступ к каким-то машинам и компиляторам, которых нету в списке, и есть возможность организовать удаленный доступ для портирования — буду рад. В данный момент было бы интересно проверить под HP-UX с компилятором HP C/aC++. Или на машинах уровня BlueGene с компилятором IBM XL. Или на AmigaOS.

Пожелания, комментарии (конструктивные и не очень) и поток сознания (в меру) по библиотеке приветствуются :)

>>> Подробности

Ответ на: комментарий от HardCode

Формально, С89 не подойдет из-за отсутствия 64-битного целого. Но неформально тот же gcc поддерживает его с бородатых времен.

Все равно не ответ на вопрос. Какой флаг идет компилятору? Если никакого, то это не чистый Си, а его модификация gnu99. Значит будете иметь большой геморрой, если кто-то напишет gcc специфичную команду типа ({ ... }). См. https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/C-Extensions.html

Лучше всего где-то конкретно указать -std=c99, иначе будете огребать костыли поддержки типа #ifdef GCC/Clang

PPP328 ★★★ ()
Ответ на: комментарий от waker

iconv

все виндузёвые программистики примерно вот так и палятся. iconv, ini-файлы, 16-битные кодировки. иконв небось чтобы из windows-1251 конвертировать, да?

у вас там конечно свой маня-мирок, с иконвами, ини-файлами и всем остальным, а у других libc уже давно польностью совместима с utf-8 и иконв не нужен. можете наверное готовиться к тому, что этот иконв скоро самим придётся поддерживать потому что остальные на него забьют.

anonymous ()
Ответ на: комментарий от waker

в подобных библиотеках нахрен не нужны списки, хеш-таблицы, и прочий мусор. это не относится к системщине.

саму библиотеку то как напишешь без списков и хеш-таблиц?)))

stevejobs ★★★★☆ ()
Ответ на: комментарий от krotozer

2.8.11 — должна подходить.

Смог воспроизвести. Действительно, старая версия CMake ведет себя немного по-другому на одной и той же команде. Поправил в репе.

HardCode ()
Ответ на: комментарий от stevejobs

На кой хрен для работы библиотеки нужны списки и хеш-таблицы? Предоставлять интерфейс к ним да, но внутри их использовать не нужно, внутри реализация их и не более того.

Dron ★★★★★ ()
Ответ на: комментарий от Iron_Bug

ну да, и CMake напрягает. проект невелик, автотулзы в нём не помешают.

Честно говоря, достаточно давно, оно изначально было на autotools. Но я все-таки замучался с ними, постоянно следить за версиями этих скриптов, особенно проблема сборки под Windows. Потом перешел на CMake и субъективно - стало легче. Не ради холивара, но autotools потихоньку начали закапывать даже самые преданные фанаты.

HardCode ()
Ответ на: комментарий от vasily_pupkin

На всех указанных платформах (кроме OpenVMS) CMake заводится. Со всеми компиляторами работает.

HardCode ()

Автор, удачи проекту! Впечетляет перечень target систем.

(на ЛОРе реакция, конечно, предсказуемая - не обращайте внимания)

Ribtoks ()
Последнее исправление: Ribtoks (всего исправлений: 1)
Ответ на: комментарий от Ribtoks

Автор, удачи проекту! Впечетляет перечень target систем.

Спасибо!

(на ЛОРе реакция, конечно, предсказуемая - не обращайте внимания)

На самом деле, в какой-то мере полезно :) Уже справедливо указали на несколько недочетов, есть что поправить.

HardCode ()
Ответ на: комментарий от Dron

В смысле, внутри их использовать не нужно? Как ты вообще программировать будешь без структур данных и алгоритмов над ними? Вот надо тебе какой-то список файлов сортированный организовать. Значит для этого у тебя должен быть реализован обобщенный тип данных «список», обобщенный элемент списка (в данном случае специализированный до ссылок на структ файла) реализующий метод попарного сравнения, и алгоритм, делающий сортировку над списками. И это на каждой строчке нужно. А если ты все равно написал свою библиотеку структур данных и алгоритмов, то смысл её у себя внутрях притыривать, лучше заэкспозить наружу, вдруг кому еще пригодится

stevejobs ★★★★☆ ()
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от kirk_johnson

Что тебе ещё нужно, чтобы назвать это «контейнером»?

Я тут не вижу, что назвать контейнером. Вижу макросы, из которых контейнер лепится каждый раз когда он нужен. И потроха торчат везде.

Ты можешь сделать проще на C?

Нет, о том и речь - в си это не делается, только эмуляция.

Какое?

Адресная арифметика не в массиве.

anonymous ()
Ответ на: комментарий от Iron_Bug

проект невелик, автотулзы в нём не помешают

Да-да, чтоб размер вырос вдвое, время сборки - втрое. И сразу ясно: солидный проект. Знаем эту автомагию :D

anonymous ()
Ответ на: комментарий от anonymous

Так в си же и не сделаешь универсальный контейнер.

еще как сделаешь. все и делают, собственно.

в си можно даже ооп сделать, или вообще черта в ступе, только придется намазать все это макросами хорошенько (и может быть какой-то препроцессор сделать) и заполнять/поддерживать метаданные врунчную

stevejobs ★★★★☆ ()
Ответ на: комментарий от gag

И недавно даже первый пользователь здесь на лоре появился: MuZHiK-2, благодаря которому я узнал о либе.

Да, я в итоге на ней пока остановился. Вроде работает. Из того, что я откопал для тредов - вроде самая бескостыльная реализация. Остальной функционал хз, не используем. Может сокеты попозже попробую.

MuZHiK-2 ★★★★ ()
Ответ на: комментарий от HardCode

Та лучше всего на чистом make. Остальную хрень пока на разные штуки поставишь, можно стать седым. А make/gmake почти везде есть из реп.

vasily_pupkin ★★★★★ ()
Ответ на: комментарий от vasily_pupkin

make на Windows не обязательно есть.

anonymous ()
Ответ на: комментарий от Iron_Bug

там могут найтись заинтересованные люди.

Туда от силы раз в месяц 1 человек заходит.

utf8nowhere ★★ ()

Подправил предупреждение о readdir_r() на новых версиях glibc. Если кто что еще найдет - пишите, пофиксим.

HardCode ()
Ответ на: комментарий от HardCode

Прошу прощения, я подумал, что это ещё один stdlib, прочитав «системная библиотека». В таком случае можно было бы сравнить структуры данных и криптокод с другими реализациями (uthash, OpenSSL, libsodium и т.д.).

Deleted ()
Ответ на: комментарий от stevejobs

саму библиотеку то как напишешь без списков и хеш-таблиц?)))

а что, они для нужд самой библиотеки где-то нужны? где именно?

waker ★★★★★ ()
Ответ на: комментарий от Dron

Чё ты злой такой

что меня выдало? вроде добрый сегодня...

waker ★★★★★ ()
Ответ на: комментарий от anonymous

все виндузёвые программистики примерно вот так и палятся.

мне даже не приходило в голову скрывать от тебя факт, что я пишу под windows (в т.ч.)

waker ★★★★★ ()
Ответ на: комментарий от stevejobs

прошелся по списку модулей, вроде нет ничего, где нужны списки, деревья, и т.п.

waker ★★★★★ ()
Ответ на: комментарий от vasily_pupkin

Так cmake - это же панацея. Берешь и делаешь себе make-файлы, например.

«Any standard UNIX-style make program can build the project through the default make target.» https://cmake.org/cmake/help/latest/generator/Unix Makefiles.html

С прописыванием кросскомпляторов возьни не больше, чем на чистых makefiles, зато сразу из коробки генерация проектов под кучу платформ и сред, от xcode до ninja

Deleted ()
Ответ на: комментарий от Deleted

Прошу прощения, я подумал, что это ещё один stdlib, прочитав «системная библиотека». В таком случае можно было бы сравнить структуры данных и криптокод с другими реализациями (uthash, OpenSSL, libsodium и т.д.).

Я подозреваю, что в специально заточенных на криптографию библиотеках используют всякие ухищрения вплоть до ассемблерных вставок, так что я сомневаюсь в целесообразности данного мероприятия.

HardCode ()
Ответ на: комментарий от Harald

ну то, что оно под 2003 студией конпиляется, еще не значит, что будет со всеми заявленными фичами под XP и тем более 98 работать

есть ещё DJGPP и DOS

samy_volosaty ★★★★★ ()
Последнее исправление: samy_volosaty (всего исправлений: 1)
Ответ на: комментарий от samy_volosaty

есть ещё DJPP и DOS

Я в курсе :) Но что-то руки никак не дошли. В свое время почти начал работу над портом под Ultrix, но тоже из-за времени тоже не сложилось.

HardCode ()
Ответ на: комментарий от yoghurt

И чем оно лучше GLib?

Оно в целом неплохое, но в последние пару лет стало очень тяжеловесным и направление развития пошло куда-то в сторону. Но отличия тоже есть. Например, у GLib выпилили приоритеты потоков, не помню, чтобы у них были спинлоки. Деревья у них только RB. Нету ГОСТового хэша. Если правильно помню, в GLib не было никогда shared memory, не было системных семафоров. В последнее время у них из-за новых зависимостей повыпилились почти все системы кроме Linux/Windows/Mac. Ну а из нового: для сборки теперь нужен Питон.

Это так, чисто на вскидку.

HardCode ()
Ответ на: комментарий от stevejobs

только придется намазать все это макросами хорошенько (и может быть какой-то препроцессор сделать) и заполнять/поддерживать метаданные врунчную

Это и называется «не сделаешь».

Когда для использования инструмента нужно два диссера защитить и результат каждой компиляции просматривать вручную после отработки препроцессора - то такой инструмент не нужен (при наличии альтернативы).

anonymous ()
Ответ на: комментарий от anonymous

Бинарникам CC что ли присваивается?

Я не знаю, как это технически реализовано. Исходники закрыты. Полагаю, что если бы знал, это относилось бы к ДСП или даже СС. Во втором случае не имел бы права даже упоминать.

krotozer ()
Ответ на: комментарий от anonymous

а чо за альтернатива? просто если у него там жоский эмбедед, то что кроме си остается, фортран?

stevejobs ★★★★☆ ()
Ответ на: комментарий от Iron_Bug

от рута на «нормальном GNU/Linux» лучше вообще ничего не делать

Честно говоря, там накосячили в предыдущей группе разработчиков. Оно ставится в каталог /usr, а параметры в конфигах прописываются там же... Сейчас делается всё, чтобы разложить всё по нужным местам, как это предписано и в «виндах», и в «линухах», но проект очень большой. Так быстро не исправить. В какой-то момент оно вообще не потребует root-а для работы.

krotozer ()
Ответ на: комментарий от anonymous

а у других libc уже давно польностью совместима с utf-8 и иконв не нужен

У всех — по разному. У нас по наследству ядро проекта пашет под WIN в CP1251, под всем остальным — в KOI8-R. И лишь GUI в UTF-8. Чтобы постепенно всё это поменять, была написана собственная библиотека конвертера, которая в теории (таблицы настолько не заполнялись) способна работать даже с UTF-16 и UTF-32. Я уж не говорю про все стандартные 8-битные кодировки, UTF-8 и непосредственный Unicode.

Библиотека написана тоже на голом СИ, но требует C++ компилятора, чтобы уметь принимать и отдавать строки в std::string. Дополнительная обёртка работает ещё и с QString. Библиотека просто реактивна, а её объект в памяти висит в единственном экземпляре всегда.

Так что, «чудеса самостроя» ещё бывают. Зато не нужны никакие конвертеры вообще.

krotozer ()
Ответ на: комментарий от HardCode

autotools потихоньку начали закапывать даже самые преданные фанаты

Вся фигня в том, что CMake по сути генерит всё те же Makefile.

В этом отношении мне нравится QBS: он ничего не генерит. Он рассчитывает и сам собирает. Сам вызывает компиляторы, линковщики, прекомпиляторы Qt и т.д. Там действительно лишь один файл [имя].qbs. Даже [имя].pro не используются.

Но он не универсален именно из-за самого Qt. Вот бы его, но без подобной зависимости.

krotozer ()
Ответ на: комментарий от stevejobs

в си можно даже ооп сделать, или вообще черта в ступе, только придется намазать все это макросами хорошенько (и может быть какой-то препроцессор сделать) и заполнять/поддерживать метаданные врунчную

У меня есть такой класс в проекте по обработке географических координат. Он сопрягается местами с ядром проекта, потому задействованы приватные свойства. Так вот, это не класс. Это структура с методами, конструкторами, статическими свойствами, переопределёнными операторами. :)

Фигня, конечно. Можно было и простой класс наваять. Но код, её использующий, сократился почти в двеннадцать раз. Так что, всё можно сделать на СИ, но чаще это просто не нужно. Велосипеды же.

krotozer ()
Ответ на: комментарий от waker

Ну общий контекст сообщения твоего мне показался злым )

Dron ★★★★★ ()
Ответ на: комментарий от krotozer

Это структура с методами, конструкторами, статическими свойствами, переопределёнными операторами.

нельзя ли посмотреть, для общего развития? особливо на конструктор.

arkhnchul ★★ ()
Ответ на: комментарий от arkhnchul

нельзя ли посмотреть, для общего развития? особливо на конструктор.

Код этих структур (их несколько) секретом не является. Завтра смогу его выложить в какую-нибудь пастилку.

Хотя конструктор объявляется как функция, но без типа и с именем самой структуры. В общем-то как конструктор класса. Очень удобно это использовать для автозаполнения структуры значениями «по умолчанию».

krotozer ()

Изобрёл велосипед glib.

CYB3R ★★★★★ ()
Ответ на: комментарий от kirk_johnson

Каких проблем? Какие проблемы пытались решить авторы boost, сделав адовый комбайн?

Проблем вида притащил мне фичи нового стандарта и другой сахар. На мой старый как г мамонта компилятор и платформу

lberserq ()
Ответ на: комментарий от arkhnchul

нельзя ли посмотреть, для общего развития? особливо на конструктор.

Там ничего сложного-то и нет. Одна рутина, чтоб не делать её потом. https://codepaste.net/775xbn Тут, правда, статики нет, она в другой части кода есть, но там уже выкладывать не могу. Просто значения структуры с префиксом static.

krotozer ()
Ответ на: комментарий от lberserq

Проблем вида притащил мне фичи нового стандарта и другой сахар. На мой старый как г мамонта компилятор и платформу

А разве не наоборот? Сначала это всё появилось в boost и лишь потом перекочевало в стандарт. Собственно, boost потому и существует.

krotozer ()
Ответ на: комментарий от lberserq

Почему это нельзя было сделать в рамках независимых библиотек?

kirk_johnson ★☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.