Есть программа ( даже не программа, а комплекс состоящий из исходников, документации, тестов, примеров ну и т. д. )
Программа специфическая.
Для каждого клиента она немного разная. Для одного предположим десяток переменных, для другого есть ещё одиннадцатая и соответсвенно маленький кусочек, вставляемый в функцию специально для обработки одиннадцатой переменной. Для одного есть данный кусок файла Readme, для другого нет ну и т. д. Пока таких различий было мало и было мало клиентов, приемлемо было использование условной компиляции, но с возросшим числом клиентов и постепенным совершенствованием программы число #ifов возросло просто до неприличия и программа утратила читабельность и стало сложно её отлаживать.
К тому же не всегда можно "обновлять" программу у клиента. Т. е. нормальной является ситуация когда у одного клиента в программе остался баг (и не исправляется специально), у другого данный баг исправлен и добавлен десяток новых свойств. Но в общих чертах программа одна и развивается как единое целое. Поддерживать надо обоих. Специфика области.
Дерево держит CVS.
Вопрос: какие есть альтернативы условной компиляции для такой ситуации? Какие (желательно проверенные временем) варианты можно использовать?
Как в рамках одного дерева исходников поддерживать несколько версий программы одновременно? Причём с минимальной разницей в одну строку кода?