这个只有头的库在许多子目录中有很多文件,这是它的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
但现在还不是那么清楚。任何人都能解释一下吗?
答案 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?。