[CMake] How to findXXX libraries with debug suffix
Will Dicharry
wdicharry at stellarscience.com
Wed Feb 10 10:49:07 EST 2010
Responses in line...
Philip Lowman wrote:
> On Tue, Feb 9, 2010 at 11:15 AM, Will Dicharry
> <wdicharry at stellarscience.com> wrote:
>> 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.
>> The macro below has been generalized and placed in the standard set of CMake
>> modules with the 2.8 release. I saw it duplicated in enough places that I
>> added it for general use in the Modules directory. It's called
>> SelectLibraryConfigurations, you can get information about it by typing
>> cmake --help-module SelectLibraryConfigurations. You don't have to use the
>> standard one, but it's there if you need it. Let me know if you run into any
>> trouble with it.
>
> Thank you for adding this and mentioning it! There are probably lots
> of modules out there that need to be modified to take advantage of
> this.
>
> One minor thing I don't like about the module is this line (70) right here:
> set( ${basename}_LIBRARY ${${basename}_LIBRARY} CACHE FILEPATH "The
> ${basename} library")
>
> Presumably users of this module have already called
> find_library(${basename}_LIBRARY_RELEASE) and
> find_library(${basename}_LIBRARY_DEBUG) since it's expecting these
> names. Why then add a 3rd cache variable? If the user were to change
> ${basename}_LIBRARY_DEBUG after an initial configure, the cache
> variable will not get fixed since set() does not operate on cache
> variables that have already been initialized unless FORCE is used.
You're right, that should not be cached. I'll fix it in CVS.
>
> This isn't a major issue since you define a ${basename}_LIBRARY normal
> variable which overrides the cache variable immediately above it. At
> best, line 70 where you declare the CACHE variable is superfluous. It
> could also be a little confusing to some users who change it in the
> CACHE and see no effect.
>
>
> ===
>
> My only other comment is that some modules already use the following
> form (usually due to someone adding DEBUG support later)
> FOO_LIBRARY (cache variable)
> FOO_LIBRARY_DEBUG (cache variable)
> FOO_LIBRARIES (normal variable with debug/optimized keywords when
> FOO_LIBRARY_DEBUG is available, else normal variable set to
> FOO_LIBRARY)
>
> It would be nice to see a second macro that supports this format.
I guess I'll have to think about that for a bit. But really, if other
modules are going to need to modify code to use the macro, shouldn't
they move to the more modern and descriptive form while they're at it? I
know they probably have to maintain backwards compatibility, but they
can do that by using the macro and setting FOO_LIBRARY to
FOO_LIBRARY_RELEASE after the macro is called.
> Also, the redefinition of FOO_LIBRARY to have optimized & release
> keywords in it may or may not be desired. The only harm I can see
> this causing is if a user were to have done this already in his
> CMakeLists.txt. In this case they might find themselves with a CMake
> error or linking against liboptimized.so! :)
>
> if(FOO_LIBRARY_DEBUG)
> target_link_libraries(bar optimized ${FOO_LIBRARY} debug
> ${FOO_LIBRARY_DEBUG})
> else()
> target_link_libraries(bar ${FOO_LIBRARY})
> endif()
>
I'm not sure I understand the situation you're describing here. Are you
referring to the older backwards compatibility case, or something about
the usual FOO_LIBRARY_DEBUG and FOO_LIBRARY_RELEASE case?
Thanks for the feedback!
-- Will
--
Will Dicharry
Software Developer
Stellar Science Ltd Co
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 5154 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://www.cmake.org/pipermail/cmake/attachments/20100210/ff398e4d/attachment.bin>
More information about the CMake
mailing list