2016-05-18 11 views
0

このヘッダのみのライブラリは、多くのサブディレクトリ全体に多くのファイルがあり、ここではそのcmakeのファイルです:このcmakelistsファイルは実際にすべてのヘッダーファイルをビルドにどのように追加しますか?

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

'このインクルードファイルは実際にすべてのヘッダファイルをビルドにどのように追加するのですか? - あなたが聞いたことは明確ではありません:ヘッダファイルはソース(' #include'ディレクティブ付き)に含まれていますビルドプロセス中に作成されない限り、CMakeスクリプトによってリストされます。しかし、あなたのケースでは、すべての(またはほぼすべての)ヘッダはすでに 'websocketpp /'ディレクトリの下に存在し、ビルドする必要はありません。 – Tsyvarev

+0

@Tsyvarevまた、OP – Antonio

+0

さんが指している行で起こっているように、 'install'ターゲットの場合にリストアップする必要があります。** installation **は** building **とは異なりますか?いずれにしても、この質問はスタックオーバーフローには不適切と思われます。リンクされたコンテンツがなければ、質問には意味がないため、質問の投稿自体にいくつかのコンテンツ(コード)を追加する必要があります。しかし、プロジェクト全体のコードを質問投稿に追加することは選択肢にはなりません。 – Tsyvarev

答えて

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() 

ものが(主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?を参照してください。

関連する問題