Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Многопапковый проект на cmake


Автор: navrocky 27.8.2009, 16:37
Породил многопапковый проект на cmake под линем примерно такой структуры:

Код

/myproj
/myproj/client
/myproj/server
/myproj/libs
/myproj/libs/staticlib1
/myproj/libs/staticlib2


Вот содержимое корневого CMakeLists.txt

Код

project(myproj)

cmake_minimum_required(VERSION 2.6)

add_subdirectory(libs)
add_subdirectory(client bin)
add_subdirectory(server bin)


Под линем собирается нормально с версией cmake 2.6-patch2, под винду поставил cmake 2.6-patch4. Пишет ошибку, что мол нельзя собирать все подпроекты в одну папку bin. Пишет:

Код

CMake Error at CMakeLists.txt:8 (add_subdirectory):
  The binary directory

    C:/temp/myproj/bin

  is already used to build another source directory, so it cannot be used to
  build source directory

    C:/temp/myproj/server

  Specify a unique binary directory name.

...


Судя по всему я сделал проект не правильно :(. Вот и вопрос: а как правильно делать такие проекты?

ЗЫ Мне надо чтобы все библиотеки и бинарники собрались в папку bin для упрощения запуска

Автор: navrocky 31.8.2009, 14:24
Отвечу сам себе  smile 

Для сборки в сложном проекте в одну папку надо сделать следующее:

В корневом CMakeLists.txt прописать:
Код
set(BINDIR ${CMAKE_BINARY_DIR}/bin)

В каждом вложенном подпроекте, который должен скомпилиться в папку bin в случае исполняемого файла добавить:
Код
set_target_properties(${TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${BINDIR})

В случае DLL:
Код
set_target_properties(${TARGET} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${BINDIR})

${TARGET} - имя цели

В итоге мы получаем сборку всех экзешников большого проекта и длл'ек в папку bin, что упрощает запуск скомпиленных программ.

Автор: korbian 31.8.2009, 15:39
navrocky, а intermediate файлы там же складируются?

Автор: navrocky 31.8.2009, 16:27
Мусорник отдельно smile А если запускать еще так:
Код

mkdir release
cd release
cmake ..\src
make


То весь хлам уходит в release отдельно от исходников. И папка bin там же будет

Автор: korbian 31.8.2009, 16:36
Цитата(navrocky @  31.8.2009,  17:27 Найти цитируемый пост)
То весь хлам уходит в release отдельно от исходников. И папка bin там же будет

не совсем понял. мне кажется, было бы удобно так:
Код

cmake ./src
make
 или так:
Код

cmake ./src/project1
make

и в корне появилась бы директория bin, в которую сложились бы исполняемые файлы и директория swap, в которую бы сложился "хлам".

Автор: navrocky 31.8.2009, 16:44
Если мы хотим такую структуру проекта, то так как я написал:
Код
project
project/release
project/release/bin
project/debug
project/debug/bin
project/src

В вашем варианте хлам ложится в корневую папку. Не понятно почему он должен ложиться в swap...

http://www.cmake.org/Wiki/CMake_FAQ#What_is_an_.22out-of-source.22_build.3F

Автор: korbian 1.9.2009, 07:46
Цитата(navrocky @  31.8.2009,  17:44 Найти цитируемый пост)
Не понятно почему он должен ложиться в swap...

выработалась у меня уже привычка такая! smile
создаю в корне директорию bin, в которой создаю директории release и debug для бинарных файлов. по такому же принципу создаю директорию swap для временных файлов. 

Я СЧИТАЮ, что старшей в иерархии должна быть директория для бинарных файлов, а не директория для некоторой их конфигурации. Ну а директория swap нужна для удобства, чтобы "грохнув" её очищать весь воркспейс от "скверны". smile

Автор: navrocky 1.9.2009, 13:32
Может быть вы и правы.. Но как тогда bin положить выше корня сборки?
Может так:
Код
set(BINDIR ${CMAKE_BINARY_DIR}/../../bin)


Но опять-же в эту папку свалятся и release и debug бинарники, что не есть хорошо...

Автор: korbian 1.9.2009, 14:39
Цитата(navrocky @  1.9.2009,  14:32 Найти цитируемый пост)
Может быть вы и правы.. Но как тогда bin положить выше корня сборки?

попробуйте так:
Код

set(BINDIR ${CMAKE_BINARY_DIR}/../../bin/${CMAKE_BUILD_TYPE})

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)