среда, 2 декабря 2009 г.

[comp.prog.thoughts] Мысли о больших библиотеках, навеянные выходом Qt 4.6

Исторически сложилось так, что в свои C++ проекты мы стараемся подключать сторонние C++ библиотеки в виде исходников. Чтобы библиотеки собирались и пересобирались вместе с самим проектом. Так у нас к проектам подключаются, например, ACE, Poco, PCRE, Crypto++. Отдельная песня с библиотеками вроде libiconv, openssl и Qt (хотя мысль о том, чтобы таки подключать libiconv и openssl в исходниках меня периодически терзает).

Но вот с большими библиотеками, вроде Qt или Boost, такой фокус, увы, вряд ли пройдет. Уж очень они большие. Даже ACE – и тот напрягает. Хотя он в разы меньше объемов Qt и Boost-а… :(

У включения сторонних библиотек к себе в проект в виде исходников есть несколько очень важных для меня достоинств.

Во-первых, сильно упрощается настройка рабочей среды под проект. Так, у меня на рабочей машине, обычно, несколько окружений под разные компиляторы (несколько версий MS VC++, автономный MinGW, cygwin). В идеале, мне не нужно настраивать в каждом из этих окружений пути к конкретным версиям ACE и Poco. Я просто делаю checkout проекта из репозитория, захожу в нужное мне окружение, запускаю компиляцию и получаю конкретную версию конкретного проекта под конкретный компилятор.

Во-вторых, появляется возможность без проблем держать кучу разных версий одной и той же библиотеки. Например, в каких-то проектах у нас используется ACE 5.6.5, в каких-то 5.6.8. В одном проекте – Poco 1.3.3p1, в другом – 1.3.5, в третьем 1.3.5 с одним нашим баг-фиксом, в четвертом 1.3.5 со вторым баг-фиксом. Где-то внешняя библиотека компилируется как статическая либа, где-то как динамическая. Где-то в Release-режиме, где-то в Debug-режиме. Все это элементарно разруливается на уровне проекта. Но гораздо сложнее все это было бы, если бы пришлось прописывать пути к различным версиям сторонних библиотек через переменные среды INCLUDE, LIB и PATH.

В-третьих, очень легко восстановить какой-то старый проект в какой-то конкретной версии. Скажем, отдали мы заказчику три года назад версию, скомпилированную на ACE 5.4.7 и PCRE 4.3, а теперь нужно разобраться с каким-то странным ее поведением. За это время и разработчики проекта сменились, и сами эти версии стали преданиями старины глубокой. Как настраивать среду для компиляции проекта? Очень просто – делается checkout версии из репозитория. И все!

Все эта лепота работает до тех пор, пока сторонние библиотеки небольшие и их легко интегрировать в наш процесс компиляции. Но вот монстры вроде Qt, Boost или ICU в эту красивую схему не укладываются. А жаль… Нужно думать…

PS. Подробнее о нашей схеме подключения подпроектов в проект с помощью svn:externals я рассказывал когда-то в RSDN Magazine.

Комментариев нет: