cmake: работа с несколькими выходными конфигурациями - PullRequest
8 голосов
/ 19 февраля 2010

Я занят переносом процесса сборки из msbuild в cmake, чтобы лучше иметь дело с цепочкой инструментов gcc (которая генерирует гораздо более быстрый код для некоторых числовых вещей, которые я делаю).

Теперь я бы хотел, чтобы cmake генерировал несколько версий вывода, например, одну версию с sse2, другую с x64 и так далее. Однако кажется, что cmake работает наиболее естественно, если у вас есть несколько флагов (скажем, «sse2_enable» и «платформа»), а затем генерируется один вывод на основе этих платформ.

Каков наилучший способ работы с несколькими выходными конфигурациями, подобными этой? Интуитивно я хотел бы перебрать большое количество комбинаций флагов и повторно запустить те же файлы CMakeLists.txt для каждой комбинации, но, конечно, вы не можете выразить это в файлах CMakeLists.txt ( AFAIK).

Ответы [ 2 ]

6 голосов
/ 03 марта 2010

Рекомендуемый способ сделать это - просто иметь несколько каталогов сборки. С каждого вы просто звоните cmake с необходимыми настройками.

Например, вы можете сделать это, начиная с базового исходного каталога (используя синтаксис оболочки Linux, но идея та же самая):

mkdir build-sse2 && cd build-sse2
cmake .. -DENABLE_SSE2 # or whatever to enable it in your CMakeLists.txt
make

cd ..

mkdir build-x64 && cd build-x64
cmake .. -DENABLE_X64 # or whatever again...
make

Таким образом, каждый каталог сборки полностью отделен друг от друга.

Это позволяет вам иметь один каталог для отладки, другой для выпуска и другой для кросс-компиляции.

4 голосов
/ 01 марта 2010

Здесь не было особой активности, поэтому я сам нашел работоспособное решение.Это, вероятно, не идеально, поэтому, если у вас есть идея получше, добавьте ее!

Теперь сложно перебрать конфиги сборки в cmake, потому что критические переменные cmake не живут в области действия функции - так что дляНапример, если вы сделаете include_directories(X), каталог X останется в списке включения даже после выхода из функции.

Каталоги имеют область действия - и хотя обычно каждый входной каталог соответствует одному выходному каталогу, вы может иметь несколько выходных каталогов.

Итак, мое решение выглядит следующим образом:

project(FooAllConfigs)

set(FooVar 2)
set(FooAnotherVar b)
add_subdirectory("project_dir" "out-2b")
set(FooVar 5)
set(FooAnotherVar c)
add_subdirectory("project_dir" "out-5c")
set(FooVar 3)
set(FooAnotherVar b)
add_subdirectory("project_dir" "out-3b")
set(FooVar 3)
set(FooAnotherVar c)
add_subdirectory("project_dir" "out-3c")

Обычный каталог проекта содержит файл CMakeLists.txt с кодом для настройкисоответствующие параметры включают в себя и параметры компилятора, заданные глобальными переменными, установленными в проекте FooAllConfigs, и также определяют суффикс сборки, добавляемый ко всем выводам сборки - любой даже косвенно включенный вывод (например, сгенерированный add_executable) должен иметь уникальныйназвание.

Это прекрасно работает для меня.

...