Сборка проекта под разные версии 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