1 构建自己xxxConfig.cmake

构建自己的xxxConfig.cmake,可以让第三方人员通过 find_package 找到并使用。

2 configure_package_config_file

该命令用于生成xxxCionfig.cmake文件的,其使用方式如下:

configure_package_config_file(
  <input> 
  <output>
  INSTALL_DESTINATION <path>
  [PATH_VARS <var1> <var2> ... <varN>]
  [NO_SET_AND_CHECK_MACRO]
  [NO_CHECK_REQUIRED_COMPONENTS_MACRO]
  [INSTALL_PREFIX <path>]
  )
  • input:文件名,一般为 xxxConfig.cmake.in 文件,需要自己提供

  • output:文件名,一般为 xxConfig.cmake 文件。其会通过 input 中的文件进行生成。

  • INSTALL_DESTINATION:改参数后跟绝对或相对路径,表示 output 中的文件在install 的时候会被装载到那个位置。如果使用相对路径,则其相对于INSTALL_PREFIX所表示的路径

  • PATH_VARS:其后跟这变量的名字,这些变量需要在 xxxConfig.cmake.in 文件中出现。例如变量名 A,则在 xxxConfig.cmake.in 中要以 @PACKAGE_A@ 的形式出现。这些变量的作用一般是在 xxxConfig.cmake.in 生成 xxxConfig.cmake 的时候进行对应的变量替换。

  • INSTALL_PREFIX:install 时候的 prefix path

3 xxxConfig.cmake 文件的内容


####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() #######
####### Any changes to this file will be overwritten by the next CMake run ####
####### The input file was PLUSConfig.cmake.in                            ########

get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE)

macro(set_and_check _var _file)
  set(${_var} "${_file}")
  if(NOT EXISTS "${_file}")
    message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !")
  endif()
endmacro()

macro(check_required_components _NAME)
  foreach(comp ${${_NAME}_FIND_COMPONENTS})
    if(NOT ${_NAME}_${comp}_FOUND)
      if(${_NAME}_FIND_REQUIRED_${comp})
        set(${_NAME}_FOUND FALSE)
      endif()
    endif()
  endforeach()
endmacro()

####################################################################################

set( PLUS_LIBRARIES  plus)
set( PLUS_INCLUDE_DIRS  ${PACKAGE_PREFIX_DIR}/include)
set( PLUS_LIBRARY_DIRS ${PACKAGE_PREFIX_DIR}/lib)

check_required_components(${PROJECT_NAME})
重要部分: 1. 链接库的名称 ${PLUS_LIBRARIES} 2. 头文件目录 ${PLUS_INCLUDE_DIRS} 3. 库文件目录 ${PLUS_LIBRARY_DIRS}

4 使用

我们在别的地方进行使用我们生成的xxxConfig.cmake文件。另外起一个单独的项目,其CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.4)
project(Te)

# 设置find_package的查找路径
set(CMAKE_PREFIX_PATH ${CMAKE_CURRENT_SOURCE_DIR}/plus/install/lib/cmake/mylib)

find_package(PLUS REQUIRED)
if(PLUS_FOUND)
	message(STATUS "PLUS_FOUND = ${PLUS_FOUND}")
	message(STATUS "PLUS_INCLUDE_DIRS = ${PLUS_INCLUDE_DIRS}")
	message(STATUS "PLUS_LIBRARIES = ${PLUS_LIBRARIES}")
	message(STATUS "PLUS_LIBRARY_DIRS = ${PLUS_LIBRARY_DIRS}")
endif()


add_executable(ppp ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp)

target_link_directories(ppp PUBLIC ${PLUS_LIBRARY_DIRS})
target_link_libraries(ppp plus)
target_include_directories(ppp PUBLIC ${PLUS_INCLUDE_DIRS})

参考

参考1: 创建自己的xxxConfig.cmake,用于第三方使用

参考2: cmake学习笔记(七)编写自己的xxxConfig.cmake