Есть некая библиотека на C++ и питоне. Плюсовая часть состоит из хидеров и нескольких .cpp. В хидерах в основном разнообразные шаблоны, но встречаются и обычные классы/функции определенные в .cpp.
Библиотека является некой сборной солянкой, состоящей (идеологически) из нескольких взаимодействующих частей. На некоторых машинах некоторые части могут оказаться невостребованными и неработоспособными (в связи с отсутствием нужных пакетов тупо не будут собираться, и фиг бы с ними).
Библиотека может использоваться в двух вариантах - либо компилируется чисто плюсовое приложение (тогда нужно прилинковать что то от библиотеки, например -lXXX) либо собирается с биндингом плюсов в питон через SWIG - в этом случае библиотека предоставляет свой шаблонный Makefile который на основе нескольких переменных заданных юзером все делает.
Необходимо обеспечить простую возможность опционально юзать лишь необходимые части + переносить исходный код с машины на машину без изменений, интересует именно плюсовая часть.
Например, в библиотеке есть модуль A.hpp+A.cpp (с обычными классами и функциями) и модуль T.hpp с шаблонами, частично использующий A.?pp. На некоторых машинах A.?pp может быть не работоспособен, и соответствующую часть T.hpp надо отключать.
Вопросов два:
1) Как это сделать удобно с т.з. юзера?
Мне че то в голову пришло три решения:
1.1) Для юзера есть один головной файл, который в зависимости от версии библиотеки на машине тащщит все, что на данной машине работает. Из минусов - юзер получает сразу все что есть, в т.ч. и то что ему не нужно, что может отрицательно сказываться на времени компиляции, особенно при биндинге в питон.
1.2) Каждый хидер библиотеки смотрит что уже было проинклюдено, т.е. A.hpp был проинклюден до T.hpp, то в T часть связанная с A работает, иначе - не работает. Минусы понятны, надо следить за последовательностью инклюдов, что в сложном проекте бдет затруднительно.
1.3) При помощи банальных дефайнов (в т.ч. задаваемых через аргументы командной строки). Из минусов - для рядового юзера слишком сложно.
А как это делают нормальные люди?;-)
2) Как такую модульность организовать с т.з. сборки библиотеки и последующей линковки модулей? Ну скажекм с линковкой у меня все в итоге собиралось в lib-файл. Но как указать что надо собирать, а что не надо?
Cast tailgunner, true_admin, shty.