[CMake] [New Module] FindHDF5.cmake

Will Dicharry wdicharry at stellarscience.com
Mon Aug 10 12:15:54 EDT 2009


James C. Sutherland wrote:
> Out of curiosity, was a module ever submitted for this?  I would love to 
> have a copy ;-)

It's still on my todo list.  I've been hijacked by another project for 
the past few weeks, but I should be able to do some more work on the 
module to get it ready for submission in the near future.  I guess I can 
submit the module as is now, but I'd like to implement Mike Jackson's 
suggestions below.  I'll try to make some time this week to get that done.

> 
> Specifically, I am interested in detecting statically linked libraries 
> and the c++ library and header(s).  

It doesn't do this yet, but I plan on adding that capability.

I also would like to see a list of
> libraries like the "z" library for compression.

It handles other library dependencies including zlib and szip.

> 
> Utility executables like h5diff are also really useful for regression 
> testing, so returning handles to those would be really great as well.

It doesn't yet do this, but that is a good idea.

> 
> Thanks for your work on this!
> 

You're welcome, sorry it's taking a while to get it done.

--Will

> James
> 
> 
> On Jul 10, 2009, at 11:01 AM, Michael Jackson wrote:
> 
>> reponses in line..
>>
>>
>> On Jul 10, 2009, at 12:33 PM, Will Dicharry wrote:
>>
>>> Michael Jackson wrote:
>>>>
>>>>
>>>> On Jul 10, 2009, at 11:13 AM, Brad King wrote:
>>>>
>>>>> Will Dicharry wrote:
>>>>>> Mike Jackson wrote:
>>>>>>> Can you post your module or attach it to a bug/feature request? I 
>>>>>>> also
>>>>>>> have a FindHDF5 module and I would like to compare the two.
>>>>>>
>>>>>> Sorry about that, I meant to attach the module to the first 
>>>>>> email.  It
>>>>>> is attached to this one.
>>>>>
>>>>> After you two have combined your versions and reached consensus,
>>>>> please post again and Cc me.  Then I'll send instructions to get
>>>>> CVS commit access.  I see no reason not to have co-maintainers
>>>>> for a module.
>>>>>
>>>>> Thanks,
>>>>> -Brad
>>>>
>>>> I'll let Will be the maintainer. My module ends up being a bit more 
>>>> specific to my own version of HDF5, ie, I am just looking for the 
>>>> libraries (c, c++, and High Level) but not really looking for the 
>>>> HDF5 compiler scripts.
>>>>
>>>> Couple of observations about the module:
>>>>
>>>> Does it find the HDF5 C++ library?
>>>
>>> No, but I'll add that in by invoking the HDF5 C++ wrapper compiler 
>>> and searching the output.
>>
>> Great.
>>>
>>>>
>>>> Can it figure out if the HDF5 library is a static or dynamic 
>>>> library? (I configure a header file that has that information inside 
>>>> it which can then be tested for).
>>>
>>> No, I'll look into how to determine that.  Suggestions welcome.
>>
>> Well, I don't think there is an easy way to do it besides looking at 
>> the fully name of the library file, but even then that can give you 
>> bad results. In my CMake build system for HDF5 I add a few more 
>> #define elements into the H5Config.h file that has the necessary parts 
>> to be able to determine how HDF5 was compiled- static or dynamic.
>>
>>>
>>>>
>>>> Is it properly finding dependent libraries when needed, like szip or 
>>>> zip ( I don't as I do NOT compile HDF5 with that support)?
>>>
>>> Yes, I need it to work across a number of platforms, many of which do 
>>> compile in szip support.  I search for all libraries linked by the 
>>> wrapper compiler and add them to the HDF5_LIBRARIES list.
>>
>> You may also want to include variables such as HDF5_SZIP_LIBRARY and 
>> HDF5_ZIP_LIBRARY. You also might want to include some CMake code to 
>> generate the following variables:
>>
>> HDF5_LIBRARY_DEBUG
>> HDF5_LIBRARY_RELEASE
>> HDF5_LIBRARY
>>
>> For each library found. I think the normal hdf5 distribution will 
>> append a 'd' to the name of the hdf5 library when built in Debug mode. 
>> My own build system uses '_d' on windows and _debug on gcc. The 
>> necessary cmake code will "do the right thing" if one of the libraries 
>> are not 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 (_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)
>>
>>
>>>
>>>> Make use of some sort of environment variable as a possible solution 
>>>> to finding the root of where HDF5 is installed, I personally use the 
>>>> environment variable "HDF5_INSTALL" for use in my script.
>>>
>>> No.  I'd personally prefer to rely on setting something similar in 
>>> the cache rather than using an environment variable, but I'm open to 
>>> changing my opinion.
>>
>> Yes. Simply because if you gather 20 people who compile HDF5 you will 
>> probably get some, if not all, who decide they want HDF5 installed 
>> somewhere else: /opt, /sw, /usr, /usr/local, /Users/$HOME/.. , 
>> /Users/Shared/Toolkits, /Users/Shared/OpenSource, C:/hdf5, 
>> C:/Developer/GCC, C:/Program Files/hdf5 (replace the drive letter with 
>> any other drive letter on windows).
>>
>> Having to run cmake and cmake not being able to find HDF5 EVERY TIME 
>> is a PITA. I used to have to deal with this. A simple environment 
>> variable solves this problem. If you want a concrete case, just look 
>> at Boost. Used by lots of people, installed everywhere imaginable. 
>> Even _with_ setting Boost_ROOT CMake _still_ sometimes has problems 
>> finding boost (Of course the crazy library naming doesn't help). Qt - 
>> Same thing: Either provide QtDir or the qmake executable. Ignoring the 
>> use of an environment variable is ignoring a dead easy way to help 
>> your users use CMake effectively. So.. Yes.
>>
>>
>>>
>>>> I imagine what I _should_ be doing is creating a HDF5Config.cmake 
>>>> file and UseHDF5.cmake file for my own HDF5 distribution (which is 
>>>> based on HDF5 version 1.6.9 and uses CMake as its build system).
>>>>
>>>> Just my comments. If you want to see what I've come up with let me 
>>>> know. My git repo is public:
>>>>
>>>> http://www.bluequartz.net/cgi-bin/gitweb/gitweb.cgi?p=MXADataModel.git;a=blob_plain;f=Resources/CMake/MXAFindHDF5.cmake;hb=HEAD 
>>>>
>>>>
>>>
>>> I'll take a look so I can try to make the module as useful as 
>>> possible.  Thanks for the suggestions!
>>>
>>> --Will
>>>
>>>> _________________________________________________________
>>>> Mike Jackson                  mike.jackson at bluequartz.net
>>>> BlueQuartz Software                    www.bluequartz.net
>>>> Principal Software Engineer                  Dayton, Ohio
>>
>> I know my system works great on OS X, Windows, and Linux when built as 
>> a serial library. What I _don't_ know is how well it works every where 
>> else (BSD, Clusters, Solaris, AIX, Crays) which is why I never tried 
>> to submit it as a module.
>>
>> Mike
>>
>> _______________________________________________
>> 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
> 
> _______________________________________________
> 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


-- 
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: 3344 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://www.cmake.org/pipermail/cmake/attachments/20090810/d3ecfbc0/attachment.bin>


More information about the CMake mailing list