四、CMake构建文件编写——xxxConfig.cmake文件
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})
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})