ПрограммированиеФорумОбщее

[ c++, cmake, msvc ] Студия при сборке, пропускает цель INSTALL

#0
13:29, 4 ноя 2014

Глючный, уродливый 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) правильно указывать пути, учитывая, что конфигурации сборки могут быть разными?
(для разных конфигураций могут быть разные пути. Если пути не указаны - используется дефолтный путь назначения)

#1
16:01, 4 ноя 2014

По-экспериментировал с первым пунктом.

Получается следующее:

# сначала выставляем дефолтно-глобальные
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

Такая система служит для поддержки "мульти-конфигурационных файлов проекта".
Например, для генерации проектов вижал-студии.

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

#2
18:22, 4 ноя 2014

Kartonagnick

Зачем нужно какое-то особое расположение файлов проекта для разработки?

#3
18:46, 4 ноя 2014

Ghost2
> Зачем нужно какое-то особое расположение файлов проекта для разработки?

В данной теме есть только один интересный вопрос: как сделать так, что бы цель INSTALL не игнорировалась (студией) при основном построении.

#4
22:34, 4 ноя 2014

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, если нужно автоматом что-то куда-то перемещать.
Но непонятно зачем тебе это нужно.

#5
18:10, 7 ноя 2014

Для студии, судя по интернетам, должен генерироватся специальный проект

Так и есть. Он исключен из сборки для всех конфигураций по умолчанию.

ПрограммированиеФорумОбщее

Тема в архиве.