[CMake] Setting install dir based on Debug or Release

Scott Aron Bloom scott at towel42.com
Wed May 20 10:25:28 EDT 2015


That makes sense.. Ill play with it and see.

It looks like a straight forward solution…

Scott

From: CHEVRIER, Marc [mailto:marc.chevrier at sap.com]
Sent: Wednesday, May 20, 2015 12:00 AM
To: Scott Aron Bloom; cmake at cmake.org
Subject: Re: [CMake] Setting install dir based on Debug or Release

Multi-configurations is a bit complex to handle regarding install directories but it is doable.

Here is my solution:

  1.  Handle various possibilities (multi-configs or mono-config). In case of multi-config, you have to rely on variable CMAKE_CFG_INTDIR which be contains information enabling to instantiate the current configuration at runtime. I also force definition of a default config (Debug) if none is specified (in case of mono config) to avoid bad behaviours.
if (DEFINED CMAKE_CONFIGURATION_TYPES)
  # multi-config handling
  set (CMAKE_BUILD_CONFIG \${BUILD_TYPE})
  set (CMAKE_CFG_BUILD_CONFIG ${CMAKE_CFG_INTDIR})
else()
  # mono config handling
  if (CMAKE_BUILD_TYPE)
set (CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel" FORCE)
  else()
set (CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel" FORCE)
  endif()
  set (CMAKE_BUILD_CONFIG ${CMAKE_BUILD_TYPE})
  set (CMAKE_CFG_BUILD_CONFIG ${CMAKE_BUILD_TYPE})
endif()

2. Now you can use variables CMAKE_BUILD_CONFIG or CMAKE_CFG_BUILD_CONFIG  to define your install prefix. There is two different variables because depending of the context of use, one or the other must be used. Here is an example:
add_custom_command (OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_BUILD_CONFIG}/output_file"
                    COMMAND "${CMAKE_COMMAND}" -DBUILD_TYPE=$<CONFIG> -P script.cmake
                    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
                    COMMENT "Generating output_file")

OUTPUT parameter does not support generator expressions so pattern $<CONFIG> cannot be used. You have to rely on CMAKE_CFG_INTDIR in case of multi-config but on CMAKE_BUILD_TYPE for mono-config. So use wrapper CMAKE_CFG_BUILD_CONFIG.

install (FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_CONFIG}/output_file DESTINATION ${CMAKE_BUILD_CONFIG})

In case of install command, CMAKE_CFG_INTDIR must not be used in multi-config… So use wrapper CMAKE_BUILD_CONFIG.

This is why I have two different variables!

Hope this is helpful.

Marc

From: CMake on behalf of Scott Aron Bloom
Date: Tuesday 19 May 2015 19:42
To: "cmake at cmake.org<mailto:cmake at cmake.org>"
Subject: [CMake] Setting install dir based on Debug or Release

We use the install system, and love it.

However, since our install include copies of 3rd party debug libraries that are named the same as the release counterparts (not our call ;() I would like to just have a the path be install.deb rather than “install”
We set the CMAKE_INSTLL_PREFIX variable, but all the configurations get set to the same install…

The problem I see, is the code only gets executed once, and at that point the CMAKE_BUILD_TYPE isn’t set yet..  Yes I realize this for windows, so it is a multi-config system.. but I cant believe Im the only one with this issue.

This is is what Im trying…

IF( "${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")
        SET(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/Install)
        message( STATUS "CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}" )
    ELSEIF( "${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
        SET(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/Install.deb)
        message( STATUS "CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}" )
    ELSE()
        MESSAGE( STATUS "CMAKE_BUILD_TYPE not set yet ${CMAKE_BUILD_TYPE}" )
    ENDIF()


Any help would be most appreciated
Thanks

Scott
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20150520/4783a041/attachment-0001.html>


More information about the CMake mailing list