编写自定义cmake配置文件FindXXX.cmake或者xxx-config.cmake | cmake with user defined entry

Posted kezunlin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写自定义cmake配置文件FindXXX.cmake或者xxx-config.cmake | cmake with user defined entry相关的知识,希望对你有一定的参考价值。

本文首发于个人博客https://kezunlin.me/post/12ab5707/,欢迎阅读!

cmake with user defined entry

Guide

  • FindXXX.cmake in CMAKE_MODULE_PATH
  • xxx-config.cmake in CMAKE_PREFIX_PATH

cmake default package

FindXXX.cmake

use find_package to find default package with name XXX

and cmake file C:Program FilesCMakesharecmake-3.10ModulesFindXXX.cmake

use ${XXX_INCLUDE_DIRS} in include, and ${XXX_LIBRARIES} in libraries

usage

find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})

find_package(Boost 1.5.8 REQUIRED COMPONENTS date_time system filesystem)
include_directories(${Boost_INCLUDE_DIRS})

target_link_libraries(demo ${GTEST_LIBRARIES} ${Boost_LIBRARIES})

user-define package

xxx-config.cmake

both names are ok.

  • xxx-config.cmake
  • XXXConfig.cmake, e.g. OpenCVConfig.cmake

mysqlcppconn-config.cmake

# Name: <Name>Config.cmake  or <lower name>-config.cmake
# mysqlcppconn-config.cmake or MYSQLCPPCONNConfig.cmake  
# similar to OpenCVConfig.cmake   

# Tips for MYSQLCPPCONN_ROOT_DIR
# use "C:/Program Files/MySQL/Connector.C++ 1.1", otherwise cmake-gui can not auto find include and library

set(MYSQLCPPCONN_FOUND TRUE) # auto 
set(MYSQLCPPCONN_ROOT_DIR "C:/Program Files/MySQL/Connector.C++ 1.1")

find_path(MYSQLCPPCONN_INCLUDE_DIR NAMES cppconn/driver.h PATHS "${MYSQLCPPCONN_ROOT_DIR}/include") 
mark_as_advanced(MYSQLCPPCONN_INCLUDE_DIR) # show entry in cmake-gui

find_library(MYSQLCPPCONN_LIBRARY NAMES mysqlcppconn.lib PATHS "${MYSQLCPPCONN_ROOT_DIR}/lib/opt") 
mark_as_advanced(MYSQLCPPCONN_LIBRARY) # show entry in cmake-gui

# use xxx_INCLUDE_DIRS and xxx_LIBRARIES in CMakeLists.txt
set(MYSQLCPPCONN_INCLUDE_DIRS ${MYSQLCPPCONN_INCLUDE_DIR} )
set(MYSQLCPPCONN_LIBRARIES ${MYSQLCPPCONN_LIBRARY} )

# cmake entry will be saved to build/CMakeCache.txt 

message( "mysqlcppconn-config.cmake " ${MYSQLCPPCONN_ROOT_DIR})

halcon-config.cmake

# halcon-config.cmake or HALCONConfig.cmake  

set(HALCON_FOUND TRUE) # auto 
set(HALCON_ROOT_DIR E:/git/car/windows/lib/halcon)

find_path(HALCON_INCLUDE_DIR NAMES halconcpp/HalconCpp.h PATHS "${HALCON_ROOT_DIR}/include") 
mark_as_advanced(HALCON_INCLUDE_DIR) # show entry in cmake-gui

find_library(HALCON_LIBRARY NAMES halconcpp.lib PATHS "${HALCON_ROOT_DIR}/lib/x64-win64") 
mark_as_advanced(HALCON_LIBRARY) # show entry in cmake-gui

# use xxx_INCLUDE_DIRS and xxx_LIBRARIES in CMakeLists.txt
set(HALCON_INCLUDE_DIRS ${HALCON_INCLUDE_DIR} )
set(HALCON_LIBRARIES ${HALCON_LIBRARY} )

message( "halcon-config.cmake " ${HALCON_ROOT_DIR})

usage

find_package(HALCON REQUIRED) # user-defined
include_directories(${HALCON_INCLUDE_DIRS})

find_package(MYSQLCPPCONN REQUIRED) # user-defined
include_directories(${MYSQLCPPCONN_INCLUDE_DIRS})

target_link_libraries(demo ${HALCON_LIBRARIES} ${MYSQLCPPCONN_LIBRARIES})

cmake-gui entry

start cmake-gui, and at first,we should set

  • HALCON_DIR = E:/git/car/share/cmake-3.10/Modules
  • MYSQLCPPCONN_DIR = E:/git/car/share/cmake-3.10/Modules

then configure

  • HALCON_INCLUDE_DIR and HALCON_LIBRARY will be found.
  • MYSQLCPPCONN_INCLUDE_DIR and MYSQLCPPCONN_LIBRARY will be found.

技术图片

Reference

History

  • 20180122: created.

Copyright

以上是关于编写自定义cmake配置文件FindXXX.cmake或者xxx-config.cmake | cmake with user defined entry的主要内容,如果未能解决你的问题,请参考以下文章

CMake模块的使用和自定义模块

自定义库名称与系统库相同时的CMake循环依赖错误

CMake:如何添加仅针对一种配置执行的自定义命令?

我的Android进阶之旅NDK开发之CMake自定义搜索规则,减少每次都需要配置.cpp和.h的工作量

我的Android进阶之旅NDK开发之CMake自定义搜索规则,减少每次都需要配置.cpp和.h的工作量

怎样编写Cmake的配置文件Cmakelist.txt