这个cmakelists文件如何实际将所有头文件添加到构建中?

时间:2016-05-18 08:26:15

标签: cmake

这个只有头的库在许多子目录中有很多文件,这是它的cmake文件:

https://github.com/zaphoyd/websocketpp/blob/master/CMakeLists.txt

我不清楚在此文件中,构建过程实际上是否通知了所有这些文件和目录。我正在尝试学习cmake并研究知名库以及他们是如何做到这一点的,但这些技术存在令人惊讶的缺乏一致性。

看似可能会这样做的行是:

https://github.com/zaphoyd/websocketpp/blob/master/CMakeLists.txt#L18

和这次迭代:

https://github.com/zaphoyd/websocketpp/blob/master/CMakeLists.txt#L27-L32

但现在还不是那么清楚。任何人都能解释一下吗?

1 个答案:

答案 0 :(得分:0)

foreach documentation和这段代码开始:

foreach (p INCLUDE CMAKE)
  set (var INSTALL_${p}_DIR)
  if (NOT IS_ABSOLUTE "${${var}}")
    set (${var} "${CMAKE_INSTALL_PREFIX}/${${var}}")
  endif ()
endforeach ()

这使得变量INSTALL_INCLUDE_DIR和INSTALL_CMAKE_DIR绝对路径。因此,它们不是收集所有包含文件的地方。

在主要的CMakeLists.txt中,似乎没有任何标题。添加了一个子目录websocketapp,其中包含一个简短的CMakeLists.txt:

init_target("websocketpp")
final_target ()

这些是cmake/CMakeHelpers.cmake中定义的自定义宏(由主CMakeLists.txt包含)。关键在final_target()

macro (final_target)
    if ("${TARGET_LIB_TYPE}" STREQUAL "EXECUTABLE")
        install (TARGETS ${TARGET_NAME} 
                 RUNTIME DESTINATION "bin" 
                 CONFIGURATIONS ${CMAKE_CONFIGURATION_TYPES})
    endif ()

    # install headers, directly from current source dir and look for subfolders with headers
    file (GLOB_RECURSE TARGET_INSTALL_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.hpp)
    foreach (hppfile ${TARGET_INSTALL_HEADERS})
      get_filename_component (currdir ${hppfile} PATH)
      install (FILES ${hppfile} DESTINATION "include/${TARGET_NAME}/${currdir}")
    endforeach()
endmacro ()

宏的最后一部分添加到安装目标所有头文件,找到globbing expression

说这里没有真正标准的方法来进行这种操作,所以你会看到不同项目中有很多不同的方法。如果源文件(作为头文件)应该通过通配表达式明确列出或找到,那么也会发生宗教战争,请参阅Specify source files globally with GLOB?