LINUX.ORG.RU

cmake и папка с исходниками.

 ,


1

2
-project
--sourses
--CmakeList.txt

Собственно в CmakeList.txt есть повторения:

add_executable(Project1 ${SOURCE_FILES}
    sourses/File1.cpp sourses/File1.h
    sourses/File2.cpp sourses/File2.h
    ...
)

Все исходники лежать в папке sourses, которая не есть подпроектом, модулем и т.д. Просто все лежит в папке sourses. Как правильно избежать повторений sourses/ в add_executable?

Хотелось бы чтобы можно было писать:

add_executable(Project1 ${SOURCE_FILES}
    File1.cpp File1.h
    File2.cpp File2.h
    ...
)



Последнее исправление: pisipu (всего исправлений: 1)
list(APPEND SOURCE_FILES File1.cpp File2.cpp) # .h-файлы писать незачем
foreach(file ${SOURCE_FILES})
    list(APPEND SOURCE_PATHES sources/${file})
endforeach()
add_executable(Project1 ${SOURCE_PATHES})
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)

Положи CMakeLists.txt в папку sourses, а папкой выше в CMakeLists.txt напиши «add_subdirectory(sourses)».

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

Таки так делать ай яй яй.

В итоге рано или поздно один CMakeLists.txt (если он один) превращается в дичайшую какашку.

Именно поэтому тот же FILE(GLOB) по умолчанию не рекурсивный, что бы шаловливые руки не тянулись так сказать.

Разделяй и властвуй...

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

Потому, что у тебя наверняка ещё нету тестов, замеров покрытия кода, генерации доки и что там тебе ещё потом захочется прикрутить.

Ещё, потому, что если ты захочешь потом переместить эти файлы, получишь больше геморою.

Ещё, потому, что такой подход от тебя будет ожидать человек, уже работавший с CMake, ибо де-факто, все порядочные люди делают так. И не только в CMake, но и в пресловутом autotools и вообще в любом проекте, который хоть немного подрос.

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

Угу.

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

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

Ессно из этого правила есть исключения, особенно в чём то гибридном типо крестов. Но пока не понимаешь разницу, лучше получить небольшую избыточность в масштабировании, чем наоборот.

pon4ik ★★★★★
()

И алыверды add_subdirectory != project.

В поддиректории могут быть отдельные цели, да, но если задуматься, то кроме публичных инклудов, и ловить на уровень выше им нечего. Все цели, в рамках одного CMake проекта(не project, а корневого CMakeLists.txt) - резолвяться по имени. Поэтому если где то в проекте готовиться libMyCoolStuff:

#any subdir's CMakeLists.txt
target_link_libraries(myExe MyCoolStuff)
принесёт желаемый эффект.

Ибо, если есть какие то модули, то их всё равно рассово верно делать либами. Больше вероятность потом их безболезненно выделить в подпроекты, меньше время сборки.

pon4ik ★★★★★
()

Я для себя написал модуль, который таскаю за проектами, что-то типа:

add_sources(PREFIX foo
    ROOT_DIR "sources"
        source_one.cpp
        source_two.cpp

    ROOT_DIR "other/sources"
        source_three.cpp
        source_four.cpp
)

add_executable(foo ${foo_SOURCES})
Dendy ★★★★★
()
Ответ на: комментарий от pon4ik

Так пользуйтесь add_subdirectory(), тем более что сейчас добавили возможность не собирать из подпроекта статическую библиотеку, а использовать его как коллекцию обьектников: add_library(foo OBJECT source_one.cpp source_two.cpp).

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

Предложение пользоваться add_subdirectory() естественно автору треда.

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

Можно - только зачем.

Обычно если что то вынесли в отдельную директорию на уровне сорцов, то это и на уровне бинарей - отдельная сущность.

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

Обычно если что то вынесли в отдельную директорию на уровне сорцов, то это и на уровне бинарей - отдельная сущность.

Отнюдь. Если что-то вынесли в отдельную директорию, то это разделение пространства имён, но не обязательно отдельная библиотека.

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

Имеет смысл сделать это статической библиотекой, хотя бы ради скорости пересборки тестов.

И опять же - разве новое пространство имён не привносит новую сущность? Если нет, значит что то не так с декомпозицией.

Это всё конечно дело вкуса, но когда сорцов много - такие нюансы начинают играть роль, не зря CMake, а не что то ещё (есть штуки с более вкусным синтаксисом), стал столь популярен.

Именно флоу, который толкает пилить в таком стиле хорошо подходит для плюсов с их, мягко говоря не спешной скоростью сборки.

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

Имеет смысл сделать это статической библиотекой, хотя бы ради скорости пересборки тестов.

Если тесты собираются в отдельной диретории того же проекта, то вместо STATIC стоит использовать OBJECT, это будет работать быстрее. Кроме того при линковке статической библиотеки не будут включены неиспользуемые переменные и, как следствие, их код инициализации.

В отдельную директорию действительно часто ложатся сущности без циклических завивимостей, которые можно оформить в отдельный бинарь. Но есть и множество примеров, когда мелкая декомпозиция не имеет смысла, а то в общем случае можно любую библиотеку разбить на десяток мелких.

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

Ну, возможно ты и прав, насчет декомпозиции.

С обьектниками врят ли оно будет быстрее, если они не менялись, ибо линкер будет каждый раз проделывать всю туже работу что при линковке статической либы. Я может не ясно выразился, но толкал я именно про инкрементальную сборку.

pon4ik ★★★★★
()
5 октября 2015 г.

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

Вот я тоже сейчас над этим бьюсь как и автар, но пока выше описанное подходит. Но в каждом каталоге конфиг мне кажется это очень неудобно.

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