2016-03-05 3 views
0

Мой проект на C++ очень велик и приводит к созданию 5 разных двоичных файлов. Например, в VStudio у моего единственного решения есть 5 разных «проектов». Например, в XCode мой единственный проект имеет 5 разных целей.CMake способ генерации нескольких проектов из общего исходного дерева

Код размещен в очень глубокой папке «src» со множеством уровней вложенных подпапок. Эта папка src является общей для всех 5 двоичных файлов, потому что существует много повторного использования большей части исходного кода, но для каждого двоичного файла требуется часть источника, но не все.

Я хотел бы знать, как эффективно создавать CMakeList.txt, которые могут создавать то, что мне нужно здесь.

Примечание:

  • реорганизовать код в другую структуру не вариант ни делает код кучи статических библиотек.
  • CMakeList.txt для каждой вложенной папки не является вариантом. Их слишком много, и обслуживание будет кошмаром.
  • Файл (GLOB_RECURSE не отличный вариант либо потому, что он собирается забрать тонну исходных файлов для каждого двоичного файла, которые не являются необходимыми для компиляции для этого конкретного двоичного файла.
  • В идеале, XCode проект (с 5 целей) или ONE VStudio Solution (с 5 проектами). Я не хочу открывать 5 различных проектов.

Я был бы полностью доволен необходимостью вручную добавлять/удалять исходные файлы из гигантского списка. .. Иначе во внешнем файле, который может быть втянут с помощью CMake. Например, SourceFilesForBinary1.txt, SourceFilesForBinary2.txt и т. д., но я не уверен, как это сделать или если это безумие.

Любой совет будет оценен по достоинству.

ответ

1

CMake имеет функцию включения. Вы можете использовать это для реализации своего «гигантского управляемого вручную списка».

Вы знаете, что GLOB_RECURSE a задан шаблон, правильно, поэтому он исключает неинтересные файлы? Даже если нет, везде вы можете использовать GLOB_RECURSE, вы также можете использовать список включения и зла, управляемый вручную.

Я не уверен, почему вам не нужны статические библиотеки. Это хорошее решение этой проблемы. Для большой кучи общего кода, подобного этому, если вы скомпилируете его один раз в перемещаемую статическую библиотеку и затем свяжете это с LTO в различных целях, вы не будете перекомпилировать источник много раз. Если ваше использование является общей библиотекой (поэтому статический подход к библиотеке приведет к исчезновению всех неиспользуемых символов), вы можете использовать переключатель компилятора -whole-archive для их сохранения.

+1

В общем, совершенно бесполезно задавать вопрос со связанным списком необъяснимых предложений «Не разрешайте это, как это». Если вы объясните, почему вы отклонили каждый из них, другие могут заметить то, что вы пропустили, что делает их решением вашей проблемы! –

+0

Я фактически использовал include(), а также «target_sources», чтобы достичь того, на что я надеялся. Это позволяет мне иметь отдельный «мини-макияж» для каждой цели, чтобы сохранить целевые конкретные настройки и источники в стороне от основной части логики CMake. – cjserio

Смежные вопросы