С клонами проектов с открытым исходным кодом одна из ваших самых больших головных болей будет синхронизироваться / исправляться в соответствии с исходными кодами апстрима. Возможно, вас не интересуют новые функции, но вам обязательно потребуются исправления критических ошибок.
Я бы посоветовал тщательно обернуть такие внутренние проекты в разделяемые библиотеки, чтобы вы могли более или менее безболезненно обновлять только эти части, если изменения не нарушают ABI.
Еще один момент - если вы обнаружите и исправите ошибки в проекте с открытым исходным кодом - не держите исправления при себе. Протолкните патчи вверх по потоку. Это сделает проект лучше и сэкономит вам дни слияния с новой версией.
В порядке предпочтения
1 и 2 очень предпочтительны (однако, быстрые и очень медленные соответственно), в то время как третий вариант приведет только к головным болям и ошибкам, поскольку ваша база кода отклоняется от базы кода зависимостей. В моем коде у меня даже нет стороннего кода, загруженного в IDE, если мне не нужно просматривать файл заголовка.Это устраняет соблазн изменить то, что мне не принадлежит.
Что касается модульности, и это при условии, что вы используете относительно стабильные сторонние библиотеки, только программу для общедоступного интерфейса. Тот факт, что у вас есть исходный код, не означает, что вы должны использовать его во всем своем коде. Это должно позволить обновлениям просто перетаскивать. Это совершенно идеалистично, но это то, к чему я стремлюсь с помощью кода, над которым работаю.