web-dev-qa-db-ja.com

IDEでCMakeにヘッダー(バイナリターゲットの一部ではない)を表示させる方法は?

このワークフローでは、モジュールAを複数のヘッダーファイルで構成できますモジュールAバイナリを生成しない(補足:モジュールAからのヘッダーの一部を含む他のモジュールによって明らかに使用されますバイナリを生成します)。

良い例はヘッダーのみのライブラリで、CMake 3はINTERFACEライブラリ( this SO answer の概念とCMakeの概念のおかげで優れたサポートを導入しています。 機能のドキュメント )。

モジュールAからインターフェイスライブラリターゲットを作成できます。

add_library(module_A INTERFACE)

これにより、CMakesターゲットのすべての素晴らしい機能が得られます(別のターゲットの依存関係として使用したり、エクスポートしたり、要件を推移的に転送したりすることができます)

ただし、この場合、モジュールAのヘッダーはIDE(Xcodeには表示されませんが、同じであることを期待しています)他のほとんどすべてのIDEで)。

モジュールAを構成するファイルをIDEで編集用に表示する必要があるため、これはワークフローの大きな欠点であることがわかります。それを達成することは可能ですか?

36
Ad N

数か月後、INTERFACEライブラリのヘッダーファイルを直接一覧表示する方法が見つかりませんでした。

質問にはまだいくつかの見解があるので、ここに私がやったこと(つまり、現在利用可能なより小さなハックのように見えるもの)があります。

想像してみてくださいモジュールAはヘッダーのみのライブラリです。ターゲットを宣言するCMakeLists.txtで:

# Define 'modA_headers' variable to list all the header files
set(modA_headers 
  utility.h
  moreUtilities.h
  ...)

add_library(moduleA INTERFACE) # 'moduleA' is an INTERFACE pseudo target

#
# From here, the target 'moduleA' can be customised
#
target_include_directories(moduleA ...) # Transitively forwarded
install(TARGETS moduleA ...)

#
#  HACK: have the files showing in the IDE, under the name 'moduleA_ide'
#
add_custom_target(moduleA_ide SOURCES ${modA_headers})

CMakeの今後のリリースでは、より意味論的に正しいアプローチが提供されることが期待されるため、この回答は受け入れません。

24
Ad N

新しいtarget_sources CMake 3.1のコマンド。

add_library(moduleA INTERFACE)
target_include_directories(moduleA INTERFACE ...)
target_sources(moduleA INTERFACE 
  ${CMAKE_CURRENT_SOURCE_DIR}/utility.h
  ${CMAKE_CURRENT_SOURCE_DIR}/moreUtilities.h
)

また、推移的です。

http://www.cmake.org/cmake/help/v3.1/command/target_sources.html#command:target_sources

CMake 3.3では、INTERFACE_SOURCESを持つターゲットをエクスポートできないという制限が解除されました。

14
steveire