cmake:用于查找libjpeg-turbo的module FindTurboJPEG.cmake

libjpeg-turbo的安装包没有提供用于CONFIG模式查找包(find_package)的cmake脚本,如果cmake脚本中要查找libjpeg-turbo库,就得自己写脚本。
于是我参照cmake 查找标准libjpeg库 的Module FindJPEG源码的写法实现了libjpeg-turbo的Module FindTurboJPEG.cmake。
为了更方便引用libjpeg-turbo,module中不仅提供了传统的变量方式TURBOJPEG_INCLUDE_DIRTURBOJPEG_LIBRARY提供libjpeg-turbo的信息,还提供import target:turbojpep,turbojpeg-static

# 通过查找turbojpeg.h定位libjpeg-turbo的include文件夹位置
find_path(TURBOJPEG_INCLUDE_DIR turbojpeg.h)

set(TURBOJPEG_NAMES ${TURBOJPEG_NAMES} turbojpeg libturbojpeg)
find_library(TURBOJPEG_LIBRARY NAMES ${TURBOJPEG_NAMES} )

# handle the QUIETLY and REQUIRED arguments and set TURBOJPEG_FOUND to TRUE if
# all listed variables are TRUE
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(TURBOJPEG DEFAULT_MSG TURBOJPEG_LIBRARY TURBOJPEG_INCLUDE_DIR)

if(TURBOJPEG_FOUND)
    # for compatility of find_dependency
    set (TurboJPEG_FOUND TRUE)
    # Create imported target turbojpeg
    add_library(turbojpep SHARED IMPORTED)
    # import target中指定include文件夹
    set_target_properties(turbojpep PROPERTIES
      IMPORTED_LINK_INTERFACE_LANGUAGES "C"
      INTERFACE_INCLUDE_DIRECTORIES "${TURBOJPEG_INCLUDE_DIR}"
      IMPORTED_LOCATION "${TURBOJPEG_LIBRARY}"
      )
    if(MSVC)
        set(_stati_library_name ${CMAKE_STATIC_LIBRARY_PREFIX}turbojpeg-static${CMAKE_STATIC_LIBRARY_SUFFIX})
    else()
        set(_stati_library_name ${CMAKE_STATIC_LIBRARY_PREFIX}turbojpeg${CMAKE_STATIC_LIBRARY_SUFFIX})
    endif()
    # 查找libjpeg-turbo静态库
    find_library(TURBOJPEG_LIBRARY_STATIC ${_stati_library_name})
    # 如果找到静态库,则创建turbojpeg-static target
    if(TURBOJPEG_LIBRARY_STATIC)
        # Create imported target turbojpeg-static
        add_library(turbojpeg-static STATIC IMPORTED)
        # import target中指定include文件夹
        set_target_properties(turbojpeg-static PROPERTIES
          IMPORTED_LINK_INTERFACE_LANGUAGES "C"
          INTERFACE_INCLUDE_DIRECTORIES "${TURBOJPEG_INCLUDE_DIR}"
          IMPORTED_LOCATION "${TURBOJPEG_LIBRARY_STATIC}"
          )
        message(STATUS "TURBOJPEG_LIBRARY_STATIC=${TURBOJPEG_LIBRARY_STATIC}")
    else()
        message(STATUS "NOT FOUND jpeg-turbo static library")
    endif()

    unset(_stati_library_name)
endif()

mark_as_advanced(TURBOJPEG_LIBRARY TURBOJPEG_INCLUDE_DIR )

import target引用示例:

# 需要将FindTurboJPEG.cmake的位置加入CMAKE_PREFIX_PATH,cmake才能找到
find_package(TurboJPEG REQUIRED)
## 优先使用静态库
if(TARGET turbojpeg-static)
    set (_turbojpeg_target "turbojpeg-static")
else()
    set (_turbojpeg_target "turbojpeg")
endif()
# 因为import target已经包含了libjpeg-turbo的include信息,
# 所以会自动传递被引入的项目mytarget,所以mytarget 不必再单独添加include_directories
target_link_libraries(mytarget ${_turbojpeg_target})

FindTurboJPEG.cmake应用的完整示例参见:
https://gitee.com/l0km/jpegwrapper/blob/master/jpegwrapper/CMakeLists.txt

FindTurboJPEG.cmake源码的gitee仓库存储位置:
https://gitee.com/l0km/jpegwrapper/blob/master/cmake/Modules/FindTurboJPEG.cmake

猜你喜欢

转载自blog.csdn.net/10km/article/details/80086646