Глючный, уродливый cmake не предоставляет нормальных средств,
с помощью которых можно указать, где следует расположить результаты сборки.
Я нашел два варианта работы:
1. Установить переменные:
set(CMAKE_BUILD_FILES_DIRECTORY ${MY_BLD_PATH} )
set(CMAKE_BUILD_DIRECTORY ${MY_BLD_PATH} )
set( BUILD_OUTPUT_PATH ${MY_BLD_PATH} )
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${MY_BIN_PATH} )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${MY_LIB_PATH} )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${MY_LIB_PATH} )
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${MY_BIN_PATH} )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${MY_LIB_PATH} )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${MY_LIB_PATH} )
set( CMAKE_BUILD_DIRECTORY_${OUTPUTCONFIG} ${MY_BLD_PATH} )
set( BUILD_OUTPUT_PATH_${OUTPUTCONFIG} ${MY_BLD_PATH} )
endforeach()Приведенный выше код позволяет указать каталог назначения для exe и lib,
хотя несмотря на то, что я являюсь автором этого кода, я так и не понял до конца принципа его работы.
При сборке эта сцука создает Debug/Release папки, которые по итогу остаются пустыми.
В общем, это какой то галимый тупорылый и ниразу не понятный путь.
Меня он бесит.
Я не нашел нигде нормальной документации как правильно пользоваться этими переменными.
2. В сценарии cmake можно прописать строчку:
install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX})В проекте будет создана дополнительная цель под названием INSTALL.
Сначала продукт собирается хер-знает-где-обычно-в-каталоге-сборки, там же сваливаются результаты сборки.
Затем выполняется сборка цели INSTALL, которая выполняет скрипт: результат сборки копируется по указанному месту назначения.
Немного напрягает создание очередной цели проекта только ради того, что бы указать куда нужно поместить результаты сборки.
Но самое хреновое - при общем построении всего проекта студия игнорирует цель INSTALL.
В итоге результат сборки никуда не перемещается.
Для того, что бы это сработало нужно либо каждый раз ручками в студии тыркать цель INSTALL.
Либо из скрипта отдельно запускать сборку INSTALL уже после сборки основного продукта.
Собственно вопросы:
1. Как вообще правильно в симейке указывать каталог, где должен быть размещен результат сборки?
2. Как заставить студию не выёживаться и не игнорировать цель INSTALL при общем построении ?
3. Как с помощью переменных (см пункт 1) правильно указывать пути, учитывая, что конфигурации сборки могут быть разными?
(для разных конфигураций могут быть разные пути. Если пути не указаны - используется дефолтный путь назначения)
По-экспериментировал с первым пунктом.
Получается следующее:
# сначала выставляем дефолтно-глобальные
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/dll)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# затем выставляем дефолтные-глобальные под каждую возможную конфигурацию
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
endforeach()
...
# так же можно установить настройки выхлопа для отдельно взятой цели проекта
# для этого:
# сначала нужно определить эту цель
add_executable( ${PROJECT_NAME} ${MY_SOURCE} )
# теперь можно указать интересующие пути для отдельно взятой цели
# сначала дефолтные
set_target_properties(
${PROJECT_NAME}
PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/dll
PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)
# теперь под каждую из возможных конфигураций
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
set_target_properties(
${PROJECT_NAME}
PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/lib
PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/dll
PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/bin
)
endforeach()
У симейка есть переменная CMAKE_BUILD_TYPE, которая отвечает за тип конфигурации: Debug/Release/etc.
Если эта переменная не установлена, то в качестве настроек выхлопа будут использовать дефолтные переменные.
Например:
CMAKE_ARCHIVE_OUTPUT_DIRECTORY
Если же CMAKE_BUILD_TYPE имеет значение, то использует версия CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CMAKE_BUILD_TYPE}
Например, CMAKE_BUILD_TYPE имеет значение Debug, значит значение выхлопа будет взято из переменной
CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG
Такая система служит для поддержки "мульти-конфигурационных файлов проекта".
Например, для генерации проектов вижал-студии.
Важно не прозевать ничайно настройки под разные конфигурации, что бы потом не удивляться, почему оно не работает.
Kartonagnick
Зачем нужно какое-то особое расположение файлов проекта для разработки?
Ghost2
> Зачем нужно какое-то особое расположение файлов проекта для разработки?
В данной теме есть только один интересный вопрос: как сделать так, что бы цель INSTALL не игнорировалась (студией) при основном построении.
Kartonagnick
install это отдельный таргет, который вызывается ручками.
В случае мейкфайлов
make install DESTDIR=...
Для студии, судя по интернетам, должен генерироватся специальный проект
https://stackoverflow.com/questions/4219479/using-cmake-with-wind… -command-line
Typically cmake creates an INSTALL project: building this project mimicks running make install.
Вероятно тебе поможет post build step, если нужно автоматом что-то куда-то перемещать.
Но непонятно зачем тебе это нужно.
Для студии, судя по интернетам, должен генерироватся специальный проект
Так и есть. Он исключен из сборки для всех конфигураций по умолчанию.
Тема в архиве.