代码之家  ›  专栏  ›  技术社区  ›  Dominic

如何在CMake中检查可用的HDF5选项?

  •  0
  • Dominic  · 技术社区  · 1 年前

    我正在使用CMake来配置一个包含HDF5支持的项目。我可以使用检测是否安装了HDF5 find_package(HDF5 ...) 。根据 CMake manual entry 这个 find_package 调用将设置更多的变量。, HDF5_IS_PARALLEL

    然而,当构建HDF5时,可以设置更多的构建选项。对于我的项目,我需要安装HDF5 HDF5_ENABLE_DIRECT_VFD HDF5_ENABLE_THREADSAFE 选项已启用。尝试在没有这些选项的情况下使用HDF5安装来运行我的项目将不会编译或产生各种运行时错误。

    在我的项目的CMake配置过程中,我如何检测HDF5安装中是否存在这些选项?

    0 回复  |  直到 1 年前
        1
  •  0
  •   Dominic    1 年前

    我发现了一种可行的方法:HDF5配置存储在一个文件中 libhdf5.settings 在库路径中。CMake能够读取和解析此文件。不过,我还没有找到一种可靠的方法来获得正确的路径。尽管如此,对于默认的安装目录,此代码段能够解析以下选项:

    find_package(HDF5 COMPONENTS C)
    
    if (HDF5_FOUND) 
        message("HDF5 was found, searching configuration...")
        # this search works for default install path of any version
        # change path if hdf5 was build into a non-default directory
        file(GLOB HDF5_SETTINGS "/usr/local/HDF_Group/HDF5/*/lib/libhdf5.settings") 
    
        if (HDF5_SETTINGS)
            message("Checking HDF5 settings in : ${HDF5_SETTINGS}")
            file(STRINGS ${HDF5_SETTINGS} HDF5_SETTINGS_CONTENT)
            string(REGEX MATCH "Threadsafety: ON" HDF5_HAS_THREADSAFE ${HDF5_SETTINGS_CONTENT})
            string(REGEX MATCH "Direct VFD: 1" HDF5_HAS_DIRECTIO ${HDF5_SETTINGS_CONTENT})
            if (HDF5_HAS_THREADSAFE AND HDF5_HAS_DIRECTIO)
                message("Correct HDF5 settings found.")
            else()
                message(WARNING "HDF5 Settings are incorrect. Please reinstall HDF5 with --threadsafe and --directvfd options enabled.")
                set(HDF5_FOUND false)
            endif()
        endif(HDF5_SETTINGS)
    endif(HDF5_FOUND)