Сборка проекта под разные версии libpqxx

В нескольких наших программных продуктах для работы с СУБД PostgreSQL используется библиотека libpqxx – клиентский API на C++. В данный момент одновременно ведется разработка сразу трех веток библиотеки – 3.0, 3.1 и 4.0.

ПО периодически дорабатывается и его необходимо обновлять серверах, где оно используется. Но на серверах собран целый зоопарк библиотек: версии 3.1, 3.0, а на старичках вообще установлена 2.6! И ведь не всегда возможно обновить библиотеку…

Значит программа должна собираться под все возможные версии libpqxx!

Ради этого используем такой трюк: на этапе конфигурирования определяем какая версия библиотеки у нас установлена, а в коде используем директивы препроцессора для условной компиляции.

В configure.in добавим следующий код:

PKG_CHECK_MODULES([LIBPQXX], [libpqxx >= 4.0],
    [AC_DEFINE(LIBPQXX_40, 1, libpqxx version) AC_DEFINE(LIBPQXX_30, 1, libpqxx version)],
    [PKG_CHECK_MODULES([LIBPQXX], [libpqxx >= 3.0],
        [AC_DEFINE(LIBPQXX_30, 1, libpqxx version)],
        [PKG_CHECK_MODULES([LIBPQXX], [libpqxx >= 2.4])]
    )]
)

Данные макросы выполняют проверку наличия версии библиотеки не ниже 2.4. Если установлена библиотека версии не менее 3.0, то будет определена константа LIBPQXX_30. Если в системе присутствует библиотека версии 4.0, то будет задана константа LIBPQXX_40.

А далее в коде с помощью директив #ifdef, #elif, #else, #endif используем те или иные блоки кода:

#ifdef LIBPQXX_30
/* код для версии 3.0 и выше */
#else
/* код для версии ниже 3.0 */
#endif

или

#ifdef LIBPQXX_40
/* код для версии 4.0 и выше */
#else
/* код для версии ниже 4.0 */
#endif

Комментарии

Оставить комментарий

Ответ на Сборка проекта под разные версии libpqxx