[CMake] unset() command

Mike Jackson mike.jackson at imts.us
Wed Aug 20 10:46:42 EDT 2008


If I am understanding correctly, you are looking for a debug version  
of a library. If you can not find that library, then you default to  
using the non-debug version of the library?

If that is the case then there are some CMake macros that might help.  
I grabbed one from either the FindQt4 or the FindBoost and tweaked it  
for my needs.

############################################
#
# 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 (_MXA_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 (_MXA_ADJUST_LIB_VARS)


I use the above in the following manner:

# 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
   )

# include the macro to adjust libraries
INCLUDE (${MXA_RESOURCES_DIR}/MXAAdjustLibVars.cmake)
_MXA_ADJUST_LIB_VARS(EXPAT)

This will end up giving me the following variables:

EXPAT_LIBRARY           /Toolkits/expat/lib/libexpat.dylib
EXPAT_LIBRARY_DEBUG     /Toolkits/expat/lib/libexpat_debug.dylib
EXPAT_LIBRARY_RELEASE   /Toolkits/expat/lib/libexpat.dylib

Is that more what you were after?

The source for these examples can be found at:

http://titanium.imts.us/viewvc/Task_7/MXADataModel/Resources/

Look for MXAFindExpat.cmake and MXAAdjustLibVars.cmake

Does that help your use case?
-- 
Mike Jackson   Senior Research Engineer
Innovative Management & Technology Services


On Aug 20, 2008, at 10:33 AM, Philip Lowman wrote:

> So I submitted a patch to add a new unset() command to CMake.  The  
> command will unset normal or cache variables (causing them to  
> become undefined).  The command also supports unsetting environment  
> variables, in case anyone has to do that.
>
> The primary use case that drove me to implement this was this:
>
> find_library(FOO_LIBRARY foo)
> if(MSVC OR SEARCH_FOO_DEBUG)
>     find_library(FOO_LIBRARY_DEBUG food)
> else()
>     unset(FOO_LIBRARY_DEBUG)
>     set(FOO_LIBRARY_DEBUG ${FOO_LIBRARY})
> endif()
>
> http://public.kitware.com/Bug/view.php?id=7507
>
> Comments?
>
> -- 
> Philip Lowman
> _______________________________________________
> CMake mailing list
> CMake at cmake.org
> http://www.cmake.org/mailman/listinfo/cmake




More information about the CMake mailing list