[CMake] How to findXXX libraries with debug suffix

Luigi Calori l.calori at cineca.it
Tue Feb 9 08:40:29 EST 2010


Hi Mike, thanks for the code, I' ll try to understand it and to apply to 
my need...
I see is quite more complex than the statndard FindExpat bundled with 
CMake:
Is it customized to your need or just "better"?
In the latter case, why not ship cmake with it?
Is testing for debugging libs a very uncommon task?
Are there other ways to accomplish the same thing?

Thanks a lot

Luigi


Mike Jackson wrote:
> Here is one I wrote for Expat:
>
>
> ------8<------------------------------------------------
> # - Find expat
> # Find the native EXPAT headers and libraries.
> #
> #  EXPAT_INCLUDE_DIRS - where to find expat.h, etc.
> #  EXPAT_LIBRARIES    - List of libraries when using expat.
> #  EXPAT_LIBRARY_DEBUG - Debug version of Library
> #  EXPAT_LIBRARY_RELEASE - Release Version of Library
> #  EXPAT_FOUND        - True if expat found.
>
>
> ############################################
> #
> # Check the existence of the libraries.
> #
> ############################################
> # This macro was taken directly from the FindQt4.cmake file that is included
> # with the CMake distribution. This is NOT my work. All work was done by the
> # original authors of the FindQt4.cmake file. Only minor modifications were
> # made to remove references to Qt and make this file more generally applicable
> #########################################################################
>
> MACRO (ADJUST_LIB_VARS basename)
>   IF (${basename}_INCLUDE_DIR)
>
>   # if only the release version was found, set the debug variable also
> to the release version
>   IF (${basename}_LIBRARY_RELEASE AND NOT ${basename}_LIBRARY_DEBUG)
>     SET(${basename}_LIBRARY_DEBUG ${${basename}_LIBRARY_RELEASE})
>     SET(${basename}_LIBRARY       ${${basename}_LIBRARY_RELEASE})
>     SET(${basename}_LIBRARIES     ${${basename}_LIBRARY_RELEASE})
>   ENDIF (${basename}_LIBRARY_RELEASE AND NOT ${basename}_LIBRARY_DEBUG)
>
>   # if only the debug version was found, set the release variable also
> to the debug version
>   IF (${basename}_LIBRARY_DEBUG AND NOT ${basename}_LIBRARY_RELEASE)
>     SET(${basename}_LIBRARY_RELEASE ${${basename}_LIBRARY_DEBUG})
>     SET(${basename}_LIBRARY         ${${basename}_LIBRARY_DEBUG})
>     SET(${basename}_LIBRARIES       ${${basename}_LIBRARY_DEBUG})
>   ENDIF (${basename}_LIBRARY_DEBUG AND NOT ${basename}_LIBRARY_RELEASE)
>   IF (${basename}_LIBRARY_DEBUG AND ${basename}_LIBRARY_RELEASE)
>     # if the generator supports configuration types then set
>     # optimized and debug libraries, or if the CMAKE_BUILD_TYPE has a value
>     IF (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
>       SET(${basename}_LIBRARY       optimized
> ${${basename}_LIBRARY_RELEASE} debug ${${basename}_LIBRARY_DEBUG})
>     ELSE(CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
>       # if there are no configuration types and CMAKE_BUILD_TYPE has no value
>       # then just use the release libraries
>       SET(${basename}_LIBRARY       ${${basename}_LIBRARY_RELEASE} )
>     ENDIF(CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
>     SET(${basename}_LIBRARIES       optimized
> ${${basename}_LIBRARY_RELEASE} debug ${${basename}_LIBRARY_DEBUG})
>   ENDIF (${basename}_LIBRARY_DEBUG AND ${basename}_LIBRARY_RELEASE)
>
>   SET(${basename}_LIBRARY ${${basename}_LIBRARY} CACHE FILEPATH "The
> ${basename} library")
>
>   IF (${basename}_LIBRARY)
>     SET(${basename}_FOUND 1)
>   ENDIF (${basename}_LIBRARY)
>
> ENDIF (${basename}_INCLUDE_DIR )
>
>   # Make variables changeble to the advanced user
>   MARK_AS_ADVANCED(${basename}_LIBRARY ${basename}_LIBRARY_RELEASE
> ${basename}_LIBRARY_DEBUG ${basename}_INCLUDE_DIR )
> ENDMACRO (ADJUST_LIB_VARS)
>
>
>
>
>
> # Look for the header file.
>
> # MESSAGE (STATUS "Finding expat library and headers..." )
> SET (EXPAT_DEBUG 0)
>
> SET(EXPAT_INCLUDE_SEARCH_DIRS
>   $ENV{EXPAT_INSTALL}/include
> )
>
> SET (EXPAT_LIB_SEARCH_DIRS
>   $ENV{EXPAT_INSTALL}/lib
>   )
>
> SET (EXPAT_BIN_SEARCH_DIRS
>   $ENV{EXPAT_INSTALL}/bin
> )
>
> FIND_PATH(EXPAT_INCLUDE_DIR
>   NAMES expat.h
>   PATHS ${EXPAT_INCLUDE_SEARCH_DIRS}
>   NO_DEFAULT_PATH
> )
>
> IF (WIN32 AND NOT MINGW)
>     SET (EXPAT_SEARCH_DEBUG_NAMES "expatdll_D;libexpat_D")
>     SET (EXPAT_SEARCH_RELEASE_NAMES "expatdll;libexpat")
> ELSE (WIN32 AND NOT MINGW)
>     SET (EXPAT_SEARCH_DEBUG_NAMES "expat_debug")
>     SET (EXPAT_SEARCH_RELEASE_NAMES "expat")
> ENDIF(WIN32 AND NOT MINGW)
>
>
> IF (EXPAT_DEBUG)
> message (STATUS "EXPAT_INCLUDE_SEARCH_DIRS: ${EXPAT_INCLUDE_SEARCH_DIRS}")
> message (STATUS "EXPAT_LIB_SEARCH_DIRS: ${EXPAT_LIB_SEARCH_DIRS}")
> message (STATUS "EXPAT_BIN_SEARCH_DIRS: ${EXPAT_BIN_SEARCH_DIRS}")
> message (STATUS "EXPAT_SEARCH_RELEASE_NAMES: ${EXPAT_SEARCH_RELEASE_NAMES}")
> message (STATUS "EXPAT_SEARCH_DEBUG_NAMES: ${EXPAT_SEARCH_DEBUG_NAMES}")
> ENDIF (EXPAT_DEBUG)
>
> # Look for the library.
> FIND_LIBRARY(EXPAT_LIBRARY_DEBUG
>   NAMES ${EXPAT_SEARCH_DEBUG_NAMES}
>   PATHS ${EXPAT_LIB_SEARCH_DIRS}
>   NO_DEFAULT_PATH
>   )
>
> FIND_LIBRARY(EXPAT_LIBRARY_RELEASE
>   NAMES ${EXPAT_SEARCH_RELEASE_NAMES}
>   PATHS ${EXPAT_LIB_SEARCH_DIRS}
>   NO_DEFAULT_PATH
>   )
>
> SET (EXPAT_XMLWF_PROG_NAME "xmlwf")
> IF (WIN32)
>     SET (EXPAT_XMLWF_PROG_NAME "xmlwf.exe")
> ENDIF(WIN32)
>
> FIND_PROGRAM(EXPAT_XMLWF_PROG
>     NAMES ${EXPAT_XMLWF_PROG_NAME}
>     PATHS ${EXPAT_BIN_SEARCH_DIRS}
>     NO_DEFAULT_PATH
> )
> MARK_AS_ADVANCED(EXPAT_XMLWF_PROG)
>
> IF (EXPAT_DEBUG)
> MESSAGE(STATUS "EXPAT_INCLUDE_DIR: ${EXPAT_INCLUDE_DIR}")
> MESSAGE(STATUS "EXPAT_LIBRARY_DEBUG: ${EXPAT_LIBRARY_DEBUG}")
> MESSAGE(STATUS "EXPAT_LIBRARY_RELEASE: ${EXPAT_LIBRARY_RELEASE}")
> MESSAGE(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
> endif(EXPAT_DEBUG)
>
> ADJUST_LIB_VARS(EXPAT)
>
> # MESSAGE( STATUS "EXPAT_LIBRARY: ${EXPAT_LIBRARY}")
>
> # Copy the results to the output variables.
> IF(EXPAT_INCLUDE_DIR AND EXPAT_LIBRARY)
>   SET(EXPAT_FOUND 1)
>   SET(EXPAT_LIBRARIES ${EXPAT_LIBRARY})
>   SET(EXPAT_INCLUDE_DIRS ${EXPAT_INCLUDE_DIR})
>   IF (EXPAT_LIBRARY_DEBUG)
>     GET_FILENAME_COMPONENT(EXPAT_LIBRARY_PATH ${EXPAT_LIBRARY_DEBUG} PATH)
>     SET(EXPAT_LIB_DIR  ${EXPAT_LIBRARY_PATH})
>   ELSEIF(EXPAT_LIBRARY_RELEASE)
>     GET_FILENAME_COMPONENT(EXPAT_LIBRARY_PATH ${EXPAT_LIBRARY_RELEASE} PATH)
>     SET(EXPAT_LIB_DIR  ${EXPAT_LIBRARY_PATH})
>   ENDIF(EXPAT_LIBRARY_DEBUG)
>
>   IF (EXPAT_XMLWF_PROG)
>     GET_FILENAME_COMPONENT(EXPAT_BIN_PATH ${EXPAT_XMLWF_PROG} PATH)
>     SET(EXPAT_BIN_DIR  ${EXPAT_BIN_PATH})
>   ENDIF (EXPAT_XMLWF_PROG)
>
> ELSE(EXPAT_INCLUDE_DIR AND EXPAT_LIBRARY)
>   SET(EXPAT_FOUND 0)
>   SET(EXPAT_LIBRARIES)
>   SET(EXPAT_INCLUDE_DIRS)
> ENDIF(EXPAT_INCLUDE_DIR AND EXPAT_LIBRARY)
>
> # Report the results.
> IF(NOT EXPAT_FOUND)
>   SET(EXPAT_DIR_MESSAGE
>     "EXPAT was not found. Make sure EXPAT_LIBRARY and
> EXPAT_INCLUDE_DIR are set or set the EXPAT_INSTALL environment
> variable.")
>   IF(NOT EXPAT_FIND_QUIETLY)
>     MESSAGE(STATUS "${EXPAT_DIR_MESSAGE}")
>   ELSE(NOT EXPAT_FIND_QUIETLY)
>     IF(EXPAT_FIND_REQUIRED)
>       # MESSAGE(FATAL_ERROR "${EXPAT_DIR_MESSAGE}")
>       MESSAGE(FATAL_ERROR "Expat was NOT found and is Required by this project")
>     ENDIF(EXPAT_FIND_REQUIRED)
>   ENDIF(NOT EXPAT_FIND_QUIETLY)
> ENDIF(NOT EXPAT_FOUND)
>
>
> IF (EXPAT_FOUND)
>   INCLUDE(CheckSymbolExists)
>   #############################################
>   # Find out if EXPAT was build using dll's
>   #############################################
>   # Save required variable
>   SET(CMAKE_REQUIRED_INCLUDES_SAVE ${CMAKE_REQUIRED_INCLUDES})
>   SET(CMAKE_REQUIRED_FLAGS_SAVE    ${CMAKE_REQUIRED_FLAGS})
>   # Add EXPAT_INCLUDE_DIR to CMAKE_REQUIRED_INCLUDES
>   SET(CMAKE_REQUIRED_INCLUDES
> "${CMAKE_REQUIRED_INCLUDES};${EXPAT_INCLUDE_DIRS}")
>
>   CHECK_SYMBOL_EXISTS(EXPAT_BUILT_AS_DYNAMIC_LIB "expat_config.h"
> HAVE_EXPAT_DLL)
>
>     IF (HAVE_EXPAT_DLL STREQUAL "TRUE")
>         SET (HAVE_EXPAT_DLL "1")
>     ENDIF (HAVE_EXPAT_DLL STREQUAL "TRUE")
>
>   # Restore CMAKE_REQUIRED_INCLUDES and CMAKE_REQUIRED_FLAGS variables
>   SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_SAVE})
>   SET(CMAKE_REQUIRED_FLAGS    ${CMAKE_REQUIRED_FLAGS_SAVE})
>   #
>   #############################################
>
> ENDIF (EXPAT_FOUND)
>
> ------8<------------------------------------------------
>
>
> _________________________________________________________
> Mike Jackson                  mike.jackson at bluequartz.net
> BlueQuartz Software                    www.bluequartz.net
> Principal Software Engineer                  Dayton, Ohio
>
>
>
> On Tue, Feb 9, 2010 at 7:10 AM, Luigi Calori <l.calori at cineca.it> wrote:
>   
>> Is there a way to instruct FindXXX modules to produce variables that have
>> different linking in debug and release?
>>
>> I am producind a lib with suffix D (zlib) in an  ExternalProjetAdd,
>> target.It gets installed correctly in debug (which is the default for VS
>> cmake--build)
>> This zlibD.lib does not get found when other projects subsequently issues a
>> find_package(ZLIB )
>>
>> Are there Find modules that supports debug/release?
>>
>> Any example of this usage pattern?
>>
>> Thanks
>>
>> Luigi
>> _______________________________________________
>> Powered by www.kitware.com
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Please keep messages on-topic and check the CMake FAQ at:
>> http://www.cmake.org/Wiki/CMake_FAQ
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.cmake.org/mailman/listinfo/cmake
>>
>>     
>
>
>   



More information about the CMake mailing list