В общем, отделите свою работу от работы третьих лиц. На самом базовом уровне ваша корневая папка может выглядеть так:
|- GUI
|- Library
|- Third-party
|- lib
|- source
Я разделил «стороннюю» папку на две подпапки для обеспечения соответствия лицензии и простоты использования. Как именно вы будете распространять сторонние библиотеки, будет полностью зависеть от их лицензий. Настройте ваши make-файлы так, чтобы скомпилированные библиотеки попадали в папку third-party\lib
(в которую вы также будете помещать любые предварительно скомпилированные библиотеки). Таким образом, пользователь может загрузить предварительно скомпилированные библиотеки и проигнорировать папку source
или загрузить исходный код и игнорировать папку lib
в зависимости от того, хотят ли они пересобрать сторонние библиотеки.
Если вам требуется распространять измененную версию в двоичном виде и в форме исходного кода, то вам нужно будет разместить измененную версию в своем исходном репозитории (с предоставлением предварительно скомпилированной библиотеки по вашему выбору).
Если вы используете немодифицированную библиотеку и используете хранилище Subversion (или подобное), вы можете использовать свойство externals , чтобы связать ваш хранилище со сторонним хранилищем библиотеки, чтобы при получении пользователем копия вашего исходного кода, она берет исходный код библиотеки из собственного репозитория. Таким образом, вам не нужно хранить локальное зеркало исходного кода библиотеки. В зависимости от того, что сторонняя библиотека имеет в своем репо, вы можете использовать внешние ссылки для ссылки на предварительно скомпилированную версию сторонней библиотеки. Это не только уменьшит объем кода, который вам придется разместить в своем репо, но и более четко покажет, что конкретная сторонняя библиотека не была изменена.
При использовании неизмененных библиотек было бы даже лучше вообще не включать исходный код или двоичный файл в дерево исходных текстов. Просто отметьте в своей документации, что ваш проект зависит от библиотеки X (укажите также и версию, если это важно) и предоставьте ссылку на домашнюю страницу проекта / страницу / репозиторий Sourceforge. Позвольте разработчику решить, хотят ли они скомпилировать библиотеку, загрузить предварительно скомпилированную версию или, возможно, использовать версию, которую они уже установили. Это означает, что вы также не можете предполагать, что библиотека или ее заголовки будут существовать в определенном каталоге относительно вашего исходного кода; вместо этого вам придется доверить пользователю установку библиотек, в которых компилятор сможет их найти. Ваш код будет просто предполагать, что они находятся в пути поиска компилятора.
Также возможно, что ваши измененные библиотеки реализованы так, что свойство externals приведет к тому, что неизмененный источник будет извлечен из стороннего репозитория, и ваша система сборки может применить патч, содержащий ваши модификации. Таким образом, технически вы не будете распространять модифицированный код, что может означать несколько меньшее количество условий лицензии, которым вы должны соответствовать.
Как правило, я бы не рекомендовал распространять предварительно скомпилированные версии вашей библиотеки внутри вашего исходного репозитория. С помощью Sourceforge вы можете предварительно скомпилировать свою библиотеку (или любой другой «конечный продукт») для основных платформ и предлагать их для загрузки.