LINUX.ORG.RU

Глупые вопросы по CMake

 ,


2

1

Сразу скажу - с CMake ранее не работал, а встретиться пришлось (в учебных целях).

Суть: есть несколько лаб в универе с общими зависимостями (курс OpenGL), которые не хотелось бы раскидывать по нескольким git-репозиториям; есть CLion с его CMake.

В какую сторону копать (ключевые слова для поиска) если у меня будет

/lab1/всё по lab1
/lab2/всё по lab2
...

Что мне потребуется (как описывать CMakeLists.txt), чтобы получить отдельные бинари для каждой лабы, но при этом упростить себе компиляцию (Shift-F10, а дальше пусть CMake разбирается, что изменилось и надо пересобрать). И возможно ли это?

P.S. С каким скором можно создавать теги? думал, что тег «clion» существует, а его нет.

Deleted

Последнее исправление: merhalak (всего исправлений: 1)

Так же, как и всегда: перечисляешь цели и их исходники. CMake сам за тебя это делать не будет; что напишешь, то и соберётся. Цель «all» создаётся автоматически.

Другими словами, то, что ты хочешь — это и есть стандартное поведение CMake, другого быть просто не может. От тебя требуется только написать сборочный скрипт и перечислить все эти цели с их исходниками.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

И да: это не имеет прямого отношения к твоему вопросу, но вообще best practice — корневой CMakeLists.txt с глобальными настройками и кучей директив add_subdirectory(labN), а в каждой лабе свой CMakeLists.txt с описанием целей этой лабы.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

То есть в каждой поддиректории создаю собственный CMakeLists.txt, затем переношу описание target'а туда?
Что тогда в глобальный CMakeLists.txt указывать, мне ведь там никакого бинаря не требуется, требуется лишь рекурсивный обход всех поддиректорий и вызовов CMakeLists? Или не надо делать глобальный?

Deleted
()
Последнее исправление: merhalak (всего исправлений: 1)

Для начала собери с командной строки, без всяких CLion. Можно сделать так, в каждой lab1 и lab2 лежит свой CMakeLists.txt, который собирает свою лабу, а где-то на уровне выше лежит корневой CMakeLists.txt, который их объединяет как-то так:

add_subdirectory("lab1")
add_subdirectory("lab2")

Натравливаешь сборку CMake (неважно, с командной строки или из CLion) именно на этот корневой CMakeLists.txt. Результаты сборки по-умолчанию будут лежать в одноимённых поддиректориях в директории сборки: «lab1» и «lab2».

Если в обоих лабах много общего кода, то его можно вынести в этот корневой CMakeLists.txt, к примеру find_package(OpenGL) и прочее.

Dendy ★★★★★
()
Ответ на: комментарий от Deleted

Вообще, самый простой и топорный способ — это перечислить все цели в корневом CMakeLists.txt:

add_executable(lab1
               lab1/source1.c
               lab1/source2.c
               ...)

...

Но если ты хочешь разнести всё по нескольким файлам (что хорошо), то в корневом потребуется явно перечислить поддиректории (с помощью add_subdirectories(), как я уже написал).

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Да, я хотел разнести по разным файлам, спасибо.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.