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()
ものが(主CMakeLists.txtに含ま)cmake/CMakeHelpers.cmake
で定義されたカスタムマクロあります。キーは、マクロの最後の部分は、インストール対象にglobbing expression
で見つかったすべてのヘッダファイルを、追加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()
です。
このように、この種の操作を行うための標準的な方法は実際にはありません。そのため、さまざまなプロジェクトにさまざまなアプローチが用意されています。また、ソースファイル(ヘッダーファイル)を明示的にリストするか、グロブ式で見つける必要がある場合は、宗教の戦争もあります。Specify source files globally with GLOB?を参照してください。
'このインクルードファイルは実際にすべてのヘッダファイルをビルドにどのように追加するのですか? - あなたが聞いたことは明確ではありません:ヘッダファイルはソース(' #include'ディレクティブ付き)に含まれていますビルドプロセス中に作成されない限り、CMakeスクリプトによってリストされます。しかし、あなたのケースでは、すべての(またはほぼすべての)ヘッダはすでに 'websocketpp /'ディレクトリの下に存在し、ビルドする必要はありません。 – Tsyvarev
@Tsyvarevまた、OP – Antonio
さんが指している行で起こっているように、 'install'ターゲットの場合にリストアップする必要があります。** installation **は** building **とは異なりますか?いずれにしても、この質問はスタックオーバーフローには不適切と思われます。リンクされたコンテンツがなければ、質問には意味がないため、質問の投稿自体にいくつかのコンテンツ(コード)を追加する必要があります。しかし、プロジェクト全体のコードを質問投稿に追加することは選択肢にはなりません。 – Tsyvarev