-----Original Message-----
From: Dominic Walsh <[email protected]>
To: David Cole <[email protected]>; cmake <[email protected]>
Sent: Wed, Oct 30, 2013 6:06 am
Subject: RE: [CMake] Windows Visual Studio Install Configurations
unexpected behaviour

In Visual Studio | INSTALL project | Right mouse button "Build"


This does look like it must be a bug.

The following CMakeLists reproduces the issue using the Visual Studio 11 generator:

# <CMakeLists.txt>
cmake_minimum_required(VERSION 2.8.12)
project(b)

file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/bob.cpp.in" "
#include <iostream>

int bob_function(int argc, char *argv[])
{
 std::cout << \"bob_function\" << std::endl;
 return 0;
}
"
)

configure_file(
 "${CMAKE_CURRENT_BINARY_DIR}/bob.cpp.in"
 "${CMAKE_CURRENT_BINARY_DIR}/bob.cpp")

add_library(bob SHARED bob.cpp)

set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/i")

set(INSTALL_LIB_PATH "lib")

install(TARGETS bob
       RUNTIME DESTINATION ${INSTALL_LIB_PATH}/Debug
       LIBRARY DESTINATION ${INSTALL_LIB_PATH}/Debug
       ARCHIVE DESTINATION ${INSTALL_LIB_PATH}/Debug
       CONFIGURATIONS Debug
       )

install(TARGETS bob
       RUNTIME DESTINATION ${INSTALL_LIB_PATH}/Release
       LIBRARY DESTINATION ${INSTALL_LIB_PATH}/Release
       ARCHIVE DESTINATION ${INSTALL_LIB_PATH}/Release
       CONFIGURATIONS Release
       )
# </CMakeLists.txt>


To reproduce:
- configure and build only the Debug configuration using CMake 2.8.12 and Visual Studio 11
- right click "INSTALL" in VS and choose "Build"
- observe output similar to the following:
3>  -- Install configuration: "Debug"
3>  -- Installing: C:/dev/dcole/bob/b6/i/lib/Debug/bob.dll
3>  -- Installing: C:/dev/dcole/bob/b6/i/lib/Release/bob.dll

Expected:
- only the "Debug/bob.dll" to be installed
- this is fairly bad because whichever config gets installed last will write its own version of the dll to *both* Debug and Release install folders


I don't think this is specific to VS version at all. I suspect it will happen with any VS generator.

The generated cmake_install.cmake code is interesting in that it appears to "do the right thing" for the static import library .lib file associated with the dll (i.e., limit it only to those configs listed in the CONFIGURATIONS argument), but then goes on to do all known configs for the dll file...

# <cmake_install.cmake-snippet>

##
## this chunk is correct, note there is only a "Debug" IF clause:
##
IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified")
 IF("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Dd][Ee][Bb][Uu][Gg])$")
FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/Debug" TYPE STATIC_LIBRARY OPTIONAL FILES "C:/dev/dcole/bob/b6/Debug/bob.lib")
 ENDIF()
ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified")

##
## this chunk is incorrect, note there are all known configs listed, rather than only a "Debug" IF clause:
##
IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified")
 IF("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Dd][Ee][Bb][Uu][Gg])$")
FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/Debug" TYPE SHARED_LIBRARY FILES "C:/dev/dcole/bob/b6/Debug/bob.dll") ELSEIF("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ee][Aa][Ss][Ee])$") FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/Debug" TYPE SHARED_LIBRARY FILES "C:/dev/dcole/bob/b6/Release/bob.dll") ELSEIF("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Mm][Ii][Nn][Ss][Ii][Zz][Ee][Rr][Ee][Ll])$") FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/Debug" TYPE SHARED_LIBRARY FILES "C:/dev/dcole/bob/b6/MinSizeRel/bob.dll") ELSEIF("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ww][Ii][Tt][Hh][Dd][Ee][Bb][Ii][Nn][Ff][Oo])$") FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/Debug" TYPE SHARED_LIBRARY FILES "C:/dev/dcole/bob/b6/RelWithDebInfo/bob.dll")
 ENDIF()
ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified")


## and then 2 similar chunks repeat for the "prefix/lib/Release" install rules

# </cmake_install.cmake-snippet>

I glanced through the cmInstall* source files, but I couldn't see at first glance where the problem is. Maybe one of the other CMake devs who has a better grasp of that code can take a quick look?


HTH,
David

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to