cmake 3.5:find_package(HDF5) 指定HDF5_ROOT无效问题

我们知道cmake提供了FindHDF5.cmake(位置:$cmake_root/Modules)模块用于搜索HDF5组件。
通过查看FindHDF5.cmake的源码可以知道,可以通过定义HDF5_ROOT环境变量,来指定要使用的HDF5位置。
HDF5_ROOT是个很有用的参数,当系统安装了HDF5(/usr下),而自己又编译一个版本(比如在/home下),如果想使用自己编译的版本,就可以通过这个参数来实现,避免在执行find_package(HDF5)时cmake自做聪明的找到系统安装的版本。
原文如下:

To provide the module with a hint about where to find your HDF5
installation, you can set the environment variable HDF5_ROOT. The
Find module will then look in this path when searching for HDF5
executables, paths, and libraries.
@FindHDF5.cmake

然而理想很丰满,现实很骨感,当我使用HDF5_ROOT来指定HDF5安装位置时,cmake在执行find_package(HDF5)却并没有找到我编译的版本,还是找到了/usr下安装的版本,调用代码下如:

export HDF5_ROOT=$hdf5_install_folder
cmake . $CMAKE_VARS_DEFINE -G "Unix Makefiles" 

问题溯源

最终找到了原因:cmake 3.5(我没有一个个版本去试,至少这个3.1,3.5是有问题的)以前的版本中的FindHDF5.cmake有bug,进一步的原因是对HDF5_ROOT环境变量的用法错误,造成HDF5_ROOT无效,下面这是FindHDF5.cmake其中一段代码:

find_program( HDF5_C_COMPILER_EXECUTABLE
    NAMES h5cc h5pcc
    HINTS ENV HDF5_ROOT
    PATH_SUFFIXES bin Bin
    DOC "HDF5 Wrapper compiler. Used only to detect HDF5 compile flags." )

上面的代码中,通过ENV HDF5_ROOT这样的写法来引用一个环境变量,这显然是错误的。正确的写法应该是$ENV{HDF5_ROOT}

解决办法

知道问题原因了,如何解决呢?修改FindHDF5.cmake源码当然是个办法,但太耗费精力了。
所以我尝试下载了cmake最新的3.9版本,通过查看FindHDF5.cmake源码,发现3.9版本已经解决了这个问题。所以最简单的解决办法就是升级cmake到3.9。
而且3.9版本中还做了进一步的改进,即可以在环境变量中定义HDF5_ROOT,也可以将HDF5_ROOT定义成一个cmake变量。所以开始的cmake命令又可以写成如下形式:

cmake . $CMAKE_VARS_DEFINE -G "Unix Makefiles" -DHDF5_ROOT=$hdf5_install_folder

参考资料

《FindHDF5》

你可能感兴趣的:(开发工具,cmake)