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

Наличие 64-битного целого

Вы не ответили на вопрос. Стандарт какой?

PPP328 ★★ ()

блин, сам когда-то писал обёртку для сокетов и понимаю зачем нужен plibsys. проблема только одна: plibsys сама по себе создаёт зависимость и если в проекте используется зависимость которая использует plibsys (или аналог), то надо собрать зависимость + вложенную зависимость. потом проблема следующего уровня: одна зависимость использует apr, а вторая plibsys, и теперь надо собирать оба. в итоге количество зависимостей увеличивается, а не уменьшается.

те проблемы которые решает библиотека, как правило уже решены на стадии планирования. например сокеты на zmq, конфиги в json, потоки на pthread и т.д.

моё мнение: такие библиотеки имеют смысл как часть более крупного проекта, где они выступают в качестве вспомогательных и от такой библиотеки невозможно отказаться без отказа от «родительского» проекта, который 1) без неё не будет работать 2) активно использует вспомогательную библиотеку. если есть флаги компиляции которые это всё отключают - вообще замечательно, вырубил и забыл. статическая линковка и амльгамация тоже сильно помогают, чтобы всё это упростить, но всё равно гемор это со сборкой и портированием.

прошу считать коментарий конструктивной критикой.

anonymous ()

Debian 9 (x64)

warning: ‘readdir_r’ is deprecated [-Wdeprecated-declarations]
  if (P_UNLIKELY (readdir_r (dir->dir, &dirent_st, &dir->dir_result) != 0)) {
./puthread_test
Running 5 test cases...
** Error: PUThread::p_uthread_create_internal: failed to allocate memory **
** Error: PUThread::p_uthread_create_internal: failed to allocate memory **
** Error: PUThread::pp_uthread_get_tls_key: failed to allocate memory **
** Error: PUThread::p_uthread_current: failed to allocate memory **
** Error: PUThread::p_uthread_local_new: failed to allocate memory **
** Error: PUThread::pp_uthread_get_tls_key: failed to allocate memory **
** Error: PUThread::p_uthread_current: failed to allocate memory **
** Error: PUThread::pp_uthread_get_tls_key: failed to allocate memory **
** Error: PUThread::pp_uthread_get_tls_key: failed to allocate memory **
** Error: PUThread::pp_uthread_get_tls_key: failed to allocate memory **
** Error: PUThread::pp_uthread_get_tls_key: failed to allocate memory **
** Warning: PUThread::p_uthread_exit: p_uthread_exit() cannot be called from an unknown thread **
** Error: PRWLock::p_rwlock_new: failed to allocate memory **
./psocket_test
Running 7 test cases...
** Warning: PSocket::p_socket_set_keepalive: setsockopt() with SO_KEEPALIVE failed **
** Warning: PSocket::p_socket_set_keepalive: setsockopt() with SO_KEEPALIVE failed **

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

> Вот не понимаю я людей, которые пишут что-то для никому не интересной платформы (для зарабатывания бабла она бесполезна, для энтузиастов в качестве хобби тоже), а потом еще и гордятся этим.

Понятие интересной платформы - весьма субъективное. Мир не ограничивается тройкой Windows/Linux/Mac. Конечно, кому-то не нужно оно, но кому-то будет нужно.

Ты не догоняешь посыла: речь о том, что из миллионов программистов, десяток сидит на маргинальном SCO или HP-UX. Ты ради них тратишь свои усилия (что тоже под вопросом, ибо в жизни не поверю, что у тебя есть ВСЕ ОС, заявленные в совместимости), но при этом ты НЕ ДЕЛАЕШЬ что-то для основных платформ. Вот на эту глупость тебе и указали: неужели ты настолько тщеславен, что думаешь твой «ещё один, 16-ый стандарт многоплатформенности» кому-то нужен?!

Кроме того, речь идёт о примитивнейшей библиотеке - далеко НЕ ОНА является козырем платформы, людям нужны ПРИЛОЖЕНИЯ. И встаёт более важный вопрос: какое-такое МНОГОПЛАТФОРМЕННОЕ приложение ты пишешь, что все бросятся его использовать? Опять всё сведётся к тысяче линуксоидов и одному виндузисту. Ну вот ещё ардуинщики подтянутся. Оно того стоит? Проще И ПРАКТИЧНЕЕ взять пару-тройку распростарнённых дистров, написать сугубо Линукс-only приблуду, но написать так, чтобы на всех трёх платформах компилялось без единого предупреждения. Это будет и полезно, и не тратить столько времени на смехотворные ужимки «давайте на ZX Spectrum сделаем 64-битные целые!». Не нужно оно, «многоплатформенность» - это миф.

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

Да и есть всякие iconv специально заточенные под это.

проблема как раз в том, что iconv не везде есть, везде по разному работает, и вообще создает тонны проблем.

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

Предлагаете сидеть и ждать, пока кто-то напишет?

нет, я имел ввиду что это давно исправили.

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

Вот примерно это меня в си и бесит. Вместо пары десятков библиотек ОДИН ЖЫРНЫЙ КУСОК КОДА.

Ничто не мешает сделать пару десятков библиотек

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

Да, набор байт. glib не гарантирует что там utf-8.

ок, я неправ. извиняюсь.

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

но такой вариант периодически употребляется, даже в некоторой литературе.

например, в какой? по правилам английского языка, «is exists» это ошибка, и я не смог придумать никакого случая где это сочетание может не быть ошибкой.

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

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

придумал гипотетический случай, где «is» существительное. тогда это не ошибка :)

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

Цитируя одно из описаний: «К сожалению, библиотека APR не столь широко известна, как некоторые другие подобные продукты, а разработчики не снабдили ее обширной документацией. Это можно объяснить тем, что основное предназначение APR – оптимизировать работу популярного Web-сервера, а не быть самостоятельным продуктом.».

В платформах, конечно, есть своя экзотика, и она иногда доставляет очень сильно. Но в целом это — RedHat Enterprise Linux версий 5 и 6, да Debian 7. Винда (куда же без неё?) 7-ка и 8-ка (надеюсь, что про ХРю не вспомнят), но без 10-ки (не прокатывает сертификацию). Ну и Эльбрус ОС на 401-ой машине (4С+). В последнем случае платформа стандартным образом не признаётся скриптами сборки, из-за чего их (скрипты) приходится выпрямлять гвоздодёром. Так и тут: еле заставил либу собраться на платформе, хотя там много что нормально собирается (не надо гадить CMake-ом лишний раз!).

А теперь представьте, что продукт должен собираться из одних общих исходников на всём этом зоопарке, в котором самая современная ОС на стандартной платформе имеет GLIBC 2.13, GCC 4.7.2 и ядро 3.16 ... Сертификация, мать родная... Тормоз коммунизма!)

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

warning: ‘readdir_r’ is deprecated

Видишь - код лажает на основной же платформе, но зато IRIX поддерживается! :) Глупо и смешно.

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

да, но это не следствие использования им языка C

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

Я имел ввиду автором. Автор его в 13 году отдал на поддержку community.

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

Это следствие отсутствия нормальной пакетной инфраструктуры вокруг C. Каждый упырь делает собственные списки и хеш таблицу.

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

Так в си же и не сделаешь универсальный контейнер. Скорее это причина - нет обобщенного программирования, нет composability.

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

man tsearch, man hfind

проблема на самом деле в основном в винде.

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

А можно многочсленные примеры, хотя бы краткое исследованиие предметной облаасти? Я вот впервые такую точку зрения слышу. Да, есть всякие glib и то, что у ТСа. Но это же единичные случаии.

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

Есть что-то лучше со сравнимым функционалом?

Можно не изобретать велосипеды, и не летать в магазин на вертолёте, а освоить Automake и Configure.

В чем конкретно возникли проблемы, на какой ОС и с каким компилятором? Желательно лог, чтобы починить.

Так, пойдём тогда по порядку с самого начала. Есть архив plibsys-master.zip . Распаковываем, заходим внутрь, делаем cmake ./src, видим это:

Текст, который будет скрыт внутри спойлера

-- The C compiler identification is GNU 4.8.0
-- The CXX compiler identification is GNU 4.8.0
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/g++
-- Check for working CXX compiler: /usr/bin/g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
CMake Error at CMakeLists.txt:5 (include):
  include could not find load file:

    /root/plibsys-master/src/cmake/PlatformDetect.cmake


CMake Error at CMakeLists.txt:6 (include):
  include could not find load file:

    /root/plibsys-master/src/cmake/VisibilityDetect.cmake


CMake Error at CMakeLists.txt:10 (plibsys_detect_target_platform):
  Unknown CMake command "plibsys_detect_target_platform".


CMake Warning (dev) in CMakeLists.txt:
  No cmake_minimum_required command is present.  A line of code such as

    cmake_minimum_required(VERSION 2.8)

  should be added at the top of the file.  The version specified may be lower
  if you wish to support older CMake versions for this project.  For more
  information run "cmake --help-policy CMP0000".
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Configuring incomplete, errors occurred!

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

Понятно... Значит спойлеры тут не пашут, как оно указано в разметке...

Копируем каталог cmake в src, пускаем снова:

CMake Error at CMakeLists.txt:50 (message):
  plibsys doesn't support unknown platform linux-gcc


CMake Warning (dev) in CMakeLists.txt:
  No cmake_minimum_required command is present.  A line of code such as

    cmake_minimum_required(VERSION 2.8)

  should be added at the top of the file.  The version specified may be lower
  if you wish to support older CMake versions for this project.  For more
  information run "cmake --help-policy CMP0000".
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Configuring incomplete, errors occurred!

Копируем каталог platforms в src, и вновь пускаем:

-- Checking for lock-free atomic intrinsics
-- Performing Test PLIBSYS_ATOMIC_IMPL_GCCATOMIC
-- Performing Test PLIBSYS_ATOMIC_IMPL_GCCATOMIC - Success
-- Checking for lock-free atomic intrinsics - works
-- Check if the system is big endian
-- Searching 16 bit integer
-- Looking for sys/types.h
-- Looking for sys/types.h - found
-- Looking for stdint.h
-- Looking for stdint.h - found
-- Looking for stddef.h
-- Looking for stddef.h - found
-- Check size of unsigned short
-- Check size of unsigned short - done
-- Using unsigned short
-- Check if the system is big endian - little endian
-- Looking for float.h
-- Looking for float.h - found
-- Looking for values.h
-- Looking for values.h - found
-- Looking for limits.h
-- Looking for limits.h - found
-- Check size of size_t
-- Check size of size_t - done
-- Check size of long
-- Check size of long - done
-- Checking whether mmap has anonymous mapping
-- Performing Test PLIBSYS_MMAP_HAS_MAP_ANON
-- Performing Test PLIBSYS_MMAP_HAS_MAP_ANON - Success
-- Performing Test PLIBSYS_MMAP_HAS_MAP_ANONYMOUS
-- Performing Test PLIBSYS_MMAP_HAS_MAP_ANONYMOUS - Success
-- Checking whether mmap has anonymous mapping - yes
-- Checking whether clock_nanosleep() presents
-- Performing Test PLIBSYS_HAS_CLOCKNANOSLEEP
-- Performing Test PLIBSYS_HAS_CLOCKNANOSLEEP - Success
-- Checking whether clock_nanosleep() presents - yes
-- Checking whether nanosleep() presents
-- Performing Test PLIBSYS_HAS_NANOSLEEP
-- Performing Test PLIBSYS_HAS_NANOSLEEP - Success
-- Checking whether nanosleep() presents - yes
-- Checking whether getaddrinfo() presents
-- Performing Test PLIBSYS_HAS_GETADDRINFO
-- Performing Test PLIBSYS_HAS_GETADDRINFO - Success
-- Checking whether getaddrinfo() presents - yes
-- Checking whether POSIX thread scheduling presents
-- Performing Test PLIBSYS_HAS_POSIX_SCHEDULING
-- Performing Test PLIBSYS_HAS_POSIX_SCHEDULING - Success
-- Checking whether POSIX thread scheduling presents - yes
-- Checking whether POSIX thread stack size is supported
-- Performing Test PLIBSYS_HAS_POSIX_STACKSIZE
-- Performing Test PLIBSYS_HAS_POSIX_STACKSIZE - Success
-- Checking whether POSIX thread stack size is supported - yes
-- Checking whether POSIX read-write locks are supported
-- Performing Test PLIBSYS_HAS_POSIX_RWLOCK
-- Performing Test PLIBSYS_HAS_POSIX_RWLOCK - Success
-- Checking whether POSIX read-write locks are supported - yes
-- Checking whether socklen_t is defined
-- Performing Test PLIBSYS_HAS_SOCKLEN_T
-- Performing Test PLIBSYS_HAS_SOCKLEN_T - Success
-- Checking whether socklen_t is defined - yes
-- Checking whether struct sockaddr_storage is defined
-- Performing Test PLIBSYS_HAS_SOCKADDR_STORAGE
-- Performing Test PLIBSYS_HAS_SOCKADDR_STORAGE - Success
-- Checking whether struct sockaddr_storage is defined - yes
-- Checking whether struct sockaddr has sa_len
-- Performing Test PLIBSYS_SOCKADDR_HAS_SA_LEN
-- Performing Test PLIBSYS_SOCKADDR_HAS_SA_LEN - Failed
-- Checking whether struct sockaddr has sa_len - no
-- Checking whether struct sockaddr_in6 has sin6_scope_id
-- Performing Test PLIBSYS_SOCKADDR_IN6_HAS_SCOPEID
-- Performing Test PLIBSYS_SOCKADDR_IN6_HAS_SCOPEID - Success
-- Checking whether struct sockaddr_in6 has sin6_scope_id - yes
-- Checking whether struct sockaddr_in6 has sin6_flowinfo
-- Performing Test PLIBSYS_SOCKADDR_IN6_HAS_FLOWINFO
-- Performing Test PLIBSYS_SOCKADDR_IN6_HAS_FLOWINFO - Success
-- Checking whether struct sockaddr_in6 has sin6_flowinfo - yes
-- Check size of ((struct sockaddr *) 0)->sa_family
-- Check size of ((struct sockaddr *) 0)->sa_family - done
-- Checking whether lldiv() presents
-- Performing Test PLIBSYS_HAS_LLDIV
-- Performing Test PLIBSYS_HAS_LLDIV - Success
-- Checking whether lldiv() presents - yes
CMake Error at CMakeLists.txt:761 (set_target_properties):
  set_target_properties called with incorrect number of arguments.



        == Build configuration ==

        Platfrom:               linux
        Compiler:               gcc
        Address model:          64 bit

        Thread model:           posix
        RW lock model:          posix
        IPC model:              posix
        DIR model:              posix
        Library loader model:   posix
        Time profiler model:    posix
        Atomic model:           c11

        Platform defines:       -D_REENTRANT
        Platform CFLAGS:
        Platform LDFLAGS:
        Platform libraries:     -pthread;rt;dl

        Build static library:
        Coverage support:
        Visibility:


CMake Warning (dev) in CMakeLists.txt:
  No cmake_minimum_required command is present.  A line of code such as

    cmake_minimum_required(VERSION 2.8)

  should be added at the top of the file.  The version specified may be lower
  if you wish to support older CMake versions for this project.  For more
  information run "cmake --help-policy CMP0000".
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Configuring incomplete, errors occurred!
krotozer ()
Ответ на: комментарий от krotozer

Лезем в CMakeLists.txt и убираем проверку платформы нафиг, пускаем по-новой:

-- Checking for lock-free atomic intrinsics
-- Checking for lock-free atomic intrinsics - works
-- Checking whether mmap has anonymous mapping
-- Checking whether mmap has anonymous mapping - yes
-- Checking whether clock_nanosleep() presents
-- Checking whether clock_nanosleep() presents - yes
-- Checking whether nanosleep() presents
-- Checking whether nanosleep() presents - yes
-- Checking whether getaddrinfo() presents
-- Checking whether getaddrinfo() presents - yes
-- Checking whether POSIX thread scheduling presents
-- Checking whether POSIX thread scheduling presents - yes
-- Checking whether POSIX thread stack size is supported
-- Checking whether POSIX thread stack size is supported - yes
-- Checking whether POSIX read-write locks are supported
-- Checking whether POSIX read-write locks are supported - yes
-- Checking whether socklen_t is defined
-- Checking whether socklen_t is defined - yes
-- Checking whether struct sockaddr_storage is defined
-- Checking whether struct sockaddr_storage is defined - yes
-- Checking whether struct sockaddr has sa_len
-- Checking whether struct sockaddr has sa_len - no
-- Checking whether struct sockaddr_in6 has sin6_scope_id
-- Checking whether struct sockaddr_in6 has sin6_scope_id - yes
-- Checking whether struct sockaddr_in6 has sin6_flowinfo
-- Checking whether struct sockaddr_in6 has sin6_flowinfo - yes
-- Checking whether lldiv() presents
-- Checking whether lldiv() presents - yes

        == Build configuration ==

        Platfrom:               linux
        Compiler:               gcc
        Address model:          64 bit

        Thread model:           posix
        RW lock model:          posix
        IPC model:              posix
        DIR model:              posix
        Library loader model:   posix
        Time profiler model:    posix
        Atomic model:           c11

        Platform defines:       -D_REENTRANT
        Platform CFLAGS:
        Platform LDFLAGS:
        Platform libraries:     -pthread;rt;dl

        Build static library:
        Coverage support:
        Visibility:


CMake Warning (dev) in CMakeLists.txt:
  No cmake_minimum_required command is present.  A line of code such as

    cmake_minimum_required(VERSION 2.8)

  should be added at the top of the file.  The version specified may be lower
  if you wish to support older CMake versions for this project.  For more
  information run "cmake --help-policy CMP0000".
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Configuring done
-- Generating done
-- Build files have been written to: /root/plibsys-master

Ок, раз всё нормально, тогда пускаем make:

lcc: "/root/plibsys-master/src/pmem.h", строка 66: фатальная ошибка: не могу
          открыть исходник файл "ptypes.h"
  #include <ptypes.h>
                     ^

1 катастрофическая ошибка обнаружено при компиляции "/root/plibsys-master/src/pcryptohash.c".
Compilation terminated.
make[2]: *** [CMakeFiles/plibsys.dir/pcryptohash.o] Ошибка 1
make[1]: *** [CMakeFiles/plibsys.dir/all] Ошибка 2
make: *** [all] Ошибка 2
krotozer ()
Ответ на: комментарий от krotozer

Открываю Makefile и понимаю, что автор не в меру обажает cmake... Ищу пути, как обойти эту дурь стороной. Захожу в каталог «сорцов», удаляю нагенерированное, генерю оттуда:

-- The C compiler identification is GNU 4.8.0
-- The CXX compiler identification is GNU 4.8.0
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/g++
-- Check for working CXX compiler: /usr/bin/g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Checking for lock-free atomic intrinsics
-- Performing Test PLIBSYS_ATOMIC_IMPL_GCCATOMIC
-- Performing Test PLIBSYS_ATOMIC_IMPL_GCCATOMIC - Success
-- Checking for lock-free atomic intrinsics - works
-- Check if the system is big endian
-- Searching 16 bit integer
-- Looking for sys/types.h
-- Looking for sys/types.h - found
-- Looking for stdint.h
-- Looking for stdint.h - found
-- Looking for stddef.h
-- Looking for stddef.h - found
-- Check size of unsigned short
-- Check size of unsigned short - done
-- Using unsigned short
-- Check if the system is big endian - little endian
-- Looking for float.h
-- Looking for float.h - found
-- Looking for values.h
-- Looking for values.h - found
-- Looking for limits.h
-- Looking for limits.h - found
-- Check size of size_t
-- Check size of size_t - done
-- Check size of long
-- Check size of long - done
-- Checking whether mmap has anonymous mapping
-- Performing Test PLIBSYS_MMAP_HAS_MAP_ANON
-- Performing Test PLIBSYS_MMAP_HAS_MAP_ANON - Success
-- Performing Test PLIBSYS_MMAP_HAS_MAP_ANONYMOUS
-- Performing Test PLIBSYS_MMAP_HAS_MAP_ANONYMOUS - Success
-- Checking whether mmap has anonymous mapping - yes
-- Checking whether clock_nanosleep() presents
-- Performing Test PLIBSYS_HAS_CLOCKNANOSLEEP
-- Performing Test PLIBSYS_HAS_CLOCKNANOSLEEP - Success
-- Checking whether clock_nanosleep() presents - yes
-- Checking whether nanosleep() presents
-- Performing Test PLIBSYS_HAS_NANOSLEEP
-- Performing Test PLIBSYS_HAS_NANOSLEEP - Success
-- Checking whether nanosleep() presents - yes
-- Checking whether getaddrinfo() presents
-- Performing Test PLIBSYS_HAS_GETADDRINFO
-- Performing Test PLIBSYS_HAS_GETADDRINFO - Success
-- Checking whether getaddrinfo() presents - yes
-- Checking whether POSIX thread scheduling presents
-- Performing Test PLIBSYS_HAS_POSIX_SCHEDULING
-- Performing Test PLIBSYS_HAS_POSIX_SCHEDULING - Success
-- Checking whether POSIX thread scheduling presents - yes
-- Checking whether POSIX thread stack size is supported
-- Performing Test PLIBSYS_HAS_POSIX_STACKSIZE
-- Performing Test PLIBSYS_HAS_POSIX_STACKSIZE - Success
-- Checking whether POSIX thread stack size is supported - yes
-- Checking whether POSIX read-write locks are supported
-- Performing Test PLIBSYS_HAS_POSIX_RWLOCK
-- Performing Test PLIBSYS_HAS_POSIX_RWLOCK - Success
-- Checking whether POSIX read-write locks are supported - yes
-- Checking whether socklen_t is defined
-- Performing Test PLIBSYS_HAS_SOCKLEN_T
-- Performing Test PLIBSYS_HAS_SOCKLEN_T - Success
-- Checking whether socklen_t is defined - yes
-- Checking whether struct sockaddr_storage is defined
-- Performing Test PLIBSYS_HAS_SOCKADDR_STORAGE
-- Performing Test PLIBSYS_HAS_SOCKADDR_STORAGE - Success
-- Checking whether struct sockaddr_storage is defined - yes
-- Checking whether struct sockaddr has sa_len
-- Performing Test PLIBSYS_SOCKADDR_HAS_SA_LEN
-- Performing Test PLIBSYS_SOCKADDR_HAS_SA_LEN - Failed
-- Checking whether struct sockaddr has sa_len - no
-- Checking whether struct sockaddr_in6 has sin6_scope_id
-- Performing Test PLIBSYS_SOCKADDR_IN6_HAS_SCOPEID
-- Performing Test PLIBSYS_SOCKADDR_IN6_HAS_SCOPEID - Success
-- Checking whether struct sockaddr_in6 has sin6_scope_id - yes
-- Checking whether struct sockaddr_in6 has sin6_flowinfo
-- Performing Test PLIBSYS_SOCKADDR_IN6_HAS_FLOWINFO
-- Performing Test PLIBSYS_SOCKADDR_IN6_HAS_FLOWINFO - Success
-- Checking whether struct sockaddr_in6 has sin6_flowinfo - yes
-- Check size of ((struct sockaddr *) 0)->sa_family
-- Check size of ((struct sockaddr *) 0)->sa_family - done
-- Checking whether lldiv() presents
-- Performing Test PLIBSYS_HAS_LLDIV
-- Performing Test PLIBSYS_HAS_LLDIV - Success
-- Checking whether lldiv() presents - yes

        == Build configuration ==

        Platfrom:               linux
        Compiler:               gcc
        Address model:          64 bit

        Thread model:           posix
        RW lock model:          posix
        IPC model:              posix
        DIR model:              posix
        Library loader model:   posix
        Time profiler model:    posix
        Atomic model:           c11

        Platform defines:       -D_REENTRANT
        Platform CFLAGS:
        Platform LDFLAGS:
        Platform libraries:     -pthread;rt;dl

        Build static library:
        Coverage support:
        Visibility:


CMake Warning (dev) in CMakeLists.txt:
  No cmake_minimum_required command is present.  A line of code such as

    cmake_minimum_required(VERSION 2.8)

  should be added at the top of the file.  The version specified may be lower
  if you wish to support older CMake versions for this project.  For more
  information run "cmake --help-policy CMP0000".
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Configuring done
-- Generating done
-- Build files have been written to: /root/plibsys-master/src
Scanning dependencies of target plibsys
[  2%] Building C object CMakeFiles/plibsys.dir/pcryptohash.o
[  5%] Building C object CMakeFiles/plibsys.dir/pcryptohash-gost3411.o
[  7%] Building C object CMakeFiles/plibsys.dir/pcryptohash-md5.o
[ 10%] Building C object CMakeFiles/plibsys.dir/pcryptohash-sha1.o
[ 12%] Building C object CMakeFiles/plibsys.dir/pcryptohash-sha2-256.o
[ 15%] Building C object CMakeFiles/plibsys.dir/pcryptohash-sha2-512.o
[ 17%] Building C object CMakeFiles/plibsys.dir/pcryptohash-sha3.o
[ 20%] Building C object CMakeFiles/plibsys.dir/pdir.o
[ 23%] Building C object CMakeFiles/plibsys.dir/perror.o
[ 25%] Building C object CMakeFiles/plibsys.dir/pfile.o
[ 28%] Building C object CMakeFiles/plibsys.dir/phashtable.o
[ 30%] Building C object CMakeFiles/plibsys.dir/pinifile.o
[ 33%] Building C object CMakeFiles/plibsys.dir/plist.o
[ 35%] Building C object CMakeFiles/plibsys.dir/pmain.o
[ 38%] Building C object CMakeFiles/plibsys.dir/pmem.o
[ 41%] Building C object CMakeFiles/plibsys.dir/pprocess.o
[ 43%] Building C object CMakeFiles/plibsys.dir/pshmbuffer.o
[ 46%] Building C object CMakeFiles/plibsys.dir/psocket.o
[ 48%] Building C object CMakeFiles/plibsys.dir/psocketaddress.o
[ 51%] Building C object CMakeFiles/plibsys.dir/pstring.o
[ 53%] Building C object CMakeFiles/plibsys.dir/ptimeprofiler.o
[ 56%] Building C object CMakeFiles/plibsys.dir/ptree.o
[ 58%] Building C object CMakeFiles/plibsys.dir/ptree-avl.o
[ 61%] Building C object CMakeFiles/plibsys.dir/ptree-bst.o
[ 64%] Building C object CMakeFiles/plibsys.dir/ptree-rb.o
[ 66%] Building C object CMakeFiles/plibsys.dir/puthread.o
[ 69%] Building C object CMakeFiles/plibsys.dir/pipc.o
[ 71%] Building C object CMakeFiles/plibsys.dir/patomic-c11.o
[ 74%] Building C object CMakeFiles/plibsys.dir/pspinlock-c11.o
[ 76%] Building C object CMakeFiles/plibsys.dir/pcondvariable-posix.o
[ 79%] Building C object CMakeFiles/plibsys.dir/pmutex-posix.o
[ 82%] Building C object CMakeFiles/plibsys.dir/psemaphore-posix.o
[ 84%] Building C object CMakeFiles/plibsys.dir/pshm-posix.o
[ 87%] Building C object CMakeFiles/plibsys.dir/psysclose-unix.o
[ 89%] Building C object CMakeFiles/plibsys.dir/puthread-posix.o
[ 92%] Building C object CMakeFiles/plibsys.dir/ptimeprofiler-posix.o
[ 94%] Building C object CMakeFiles/plibsys.dir/pdir-posix.o
[ 97%] Building C object CMakeFiles/plibsys.dir/plibraryloader-posix.o
[100%] Building C object CMakeFiles/plibsys.dir/prwlock-posix.o
Linking C shared library libplibsys.so
[100%] Built target plibsys

Библиотека как-то собрана... Будем считать, что успешно...

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

Конфигурим сборку под тесты:

CMake Error: The source "/root/plibsys-master/tests/CMakeLists.txt" does not match the source "/root/plibsys-master/src/CMakeLists.txt" used to generate cache.  Re-run cmake with a different source directory.

Ну ок. Мы — люди не гордые...

-- The CXX compiler identification is GNU 4.8.0
-- Check for working CXX compiler: /usr/bin/g++
-- Check for working CXX compiler: /usr/bin/g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Boost version: 1.59.0
-- Found the following Boost libraries:
--   unit_test_framework
CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:69 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:70 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:71 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:72 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:73 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:74 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:75 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:76 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:77 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:78 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:79 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:80 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:81 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:82 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:83 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:84 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:85 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:86 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:87 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:88 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:89 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:90 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:91 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:92 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:93 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:94 (plibsys_add_test_executable)


CMake Error at CMakeLists.txt:57 (target_compile_definitions):
  target_compile_definitions called with incorrect number of arguments
Call Stack (most recent call first):
  CMakeLists.txt:95 (plibsys_add_test_executable)



        == Tests configuration ==

        Build static tests:
        Boost directory:

CMake Warning (dev) in CMakeLists.txt:
  No cmake_minimum_required command is present.  A line of code such as

    cmake_minimum_required(VERSION 2.8)

  should be added at the top of the file.  The version specified may be lower
  if you wish to support older CMake versions for this project.  For more
  information run "cmake --help-policy CMP0000".
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Configuring incomplete, errors occurred!

...Вот тут уже нервы не держат... Я мог бы сам написать под всё это дело человеческий, простой как 2x2=4 Makefile, но вот только вопрос: а настолько ли оно мне надо, когда есть Boost, который уже имеется в поставке ОС? А хотелось чего-то светлого и научного...

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

ОС, которая на базе Debian

На текущий момент это — заблуждение. Оно не Debian. Оно самобытное.

90-микро с древнющей и кастомизированной соляркой типа 2.5.1

Не, ну не так всё плохо)

cat /etc/mcst_version
2.4-rc4
05.10.2016 14:35: обновление OSLTC: 00D61: 2.0.6: тесты СТОС (OSLTC)

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

man tsearch, man hfind

Бгг. Ну давай:

First a hash table must be created using hcreate(). The argument nel specifies the maximum number of entries in the table. (This maximum cannot be changed later, so choose it wisely.) The implementation may adjust this value upward to improve the performance of the resulting hash table.

проблема на самом деле в основном в винде.

Проблема в том, что в C практически невозможна разработка маленьких пакетов зависящих от других маленьких пакетов.

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

Так в си же и не сделаешь универсальный контейнер. Скорее это причина - нет обобщенного программирования, нет composability.

man queue

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

plibsys vs другие реализации стандартной библиотеки.

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

какого хрена вы все тащитесь с этого гнусно-помойного дерьмостраховища под названием «CMake»???

неистово плюсую. cmake адъ.

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

не летать в магазин на вертолёте, а освоить Automake и Configure.

Я протестую. Читаемый одним простым исполняемым файлом типа CMake или premake декларативный конфиг куда ближе к KISS, чем автогенерируемый шелл-скрипт, который придётся распространять вместо него, используя automake.

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

Я протестую. Читаемый одним простым исполняемым файлом типа CMake или premake декларативный конфиг куда ближе к KISS, чем автогенерируемый шелл-скрипт, который придётся распространять вместо него, используя automake.

premake примитивен и ограничен, но даже у него есть область применения, в отличие от cmake.

про читаемость configure.. зачем его читать?

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

А можно многочсленные примеры, хотя бы краткое исследованиие предметной облаасти? Я вот впервые такую точку зрения слышу. Да, есть всякие glib и то, что у ТСа. Но это же единичные случаии.

Бгг. Ну поехали:

  • apr
  • boost (плюсы страдают от той же проблемы)
  • dpdk (содержит все, начиная от memory pools и заканчивая ini парсерами)
  • glib
  • libc (да-да, в стандартной библиотеке языка очень много мусора, которому там не место)
  • plibsys
  • openssl (помимо собственно SSL содержит огромную кучу кода, вроде собственных реализаций md5, crc32 и тех же многострадальных хеш-таблиц)

И это только то, что пришло в голову сразу.

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

неистово плюсую. cmake адъ.

Так, ну ладно, предыдущий оратор, который не осилил cmake и предпочитает automake и configure, собирает скаченный софт под рутом (который между прочим запускает собранные для тестов бинарники). С ним все ясно.

Ну, а с тобой-то что? Чем тебе cmake не угодил? И какой инструмент лучше?

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

premake примитивен и ограничен, но даже у него есть область применения, в отличие от cmake.

Субъективно. Их авторы наверняка считают, что области применения у них примерно одни и те же.

про читаемость configure.. зачем его читать?

Читать его незачем, но согласитесь, что cmake.exe/premake.exe один, а шеллов много (а где-то шелла и вовсе нет). Убедить пользователя Windows поставить первый проще, чем рассказывать один из множества способов достать второй.

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

неистово плюсую. cmake адъ.

+1

Когда в автолулзах достаточно сказать

$ ./configure --help

чтобы получить полный help по всем опциям сборки, в cmake нужно творить какой-то фееричный трешак с gui/tui интерфейсами.

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

Чем тебе cmake не угодил?

тем что его никто не может нормально осилить, и пишут кривые cmakelists, которые работают только у авторов на локалхостах.

И какой инструмент лучше?

почти все остальные системы сборки.

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

Нет, GNU имеет имеет функциональный аналог, но он не популярен, и это не glib.

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

я правильно понимаю, что структуры данных не будут корректно работать с shared памятью в ipc?

Не понял, о чем речь. shared memory используется как обычный кусок памяти - void*. Делайте с ней что хотите.

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

Ну, с концепцией-то я не спорю. Например, у Qt существует QBS, исполняющий ту же задачу, но он — Qt-зависимый. Мне лишь не нравится реализация идеи у CMake. А у нас в коллективе пока до написания собственной системы сборки очередь не дошла.

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

Вы не ответили на вопрос. Стандарт какой?

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

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

Спасибо за примеры! Лучше, когда есть альтернативы, какими бы они ни были. Есть что поизучать.

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

iconv ... везде по разному работает,

Можно примеры?

и вообще создает тонны проблем.

Каких? Помимо приведённого выше и необходимости в сторонней библиотеке.

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

Читать его незачем, но согласитесь, что cmake.exe/premake.exe один, а шеллов много (а где-то шелла и вовсе нет).

/bin/sh, если не ошибаюсь, входит в POSIX, а везде есть. главное избегать башизмов, и не будет проблем.

использовать автотулсы на windows ничем не лучше, чем cmake на линуксах.

Убедить пользователя Windows поставить первый проще, чем рассказывать один из множества способов достать второй.

речь не об убеждении windows пользователей установить cmake, а о том что половина софта не собирается через предоставленные cmakelists на линуксе. вероятно, на windows проблем с ним меньше, но я не сталкивался.

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

С устаревшим readdir_r - да, в курсе уже, легко поправив, раз уж в glibc так решили. Остальные сообщения во время тестов - это абсолютно нормально, так как имитируются ситуации с неверными данными. Главное в тестах результат - пройден или нет. Поэтому рекомендую запускать их через make test.

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

Где ты в cmake увидел декларативный конфиг? Тот же autoconf, только в профиль, заменили один недомакроязычок на другой и перемешали с функциональностью automake, всего и делов. В оригинале хотя бы Makefile.am можно было счиать декларативным

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

Можно примеры?

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

все можно свести к общему знаменателю, но это не так просто как может показаться.

Каких? Помимо приведённого выше и необходимости в сторонней библиотеке.

таких, что на целевой OS его может просто не быть, а тащить с собой не идеальный вариант.

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

Делайте с ней что хотите

Что можно хотеть делать с ipc памятью без структур данных? Адреса указателей разные.

В таком случае либа не особо представляет интерес. Набор разных инструментов + костыли под задачу - предпочтительней.

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