本質的に、cmake のターゲットの一部ではないヘッダー ファイルをモックできるようにしたいのですが、それらのヘッダーのファイル名がわからないという追加の困難があります。
実際のプロジェクトは非常に複雑で、自動ビルド システムの一部です。以下は簡単な例です。次のような構造のプロジェクトを考えてみましょう。
CMakeLists.txt
src/lib/ source.cpp src
/lib/CMakeLists.txt
src/include/some_header.hpp # source.cpp に含まれる
メインの CMakeLists.txt の内容:
cmake_mimimum_required(VERSION 2.8.6)
project("automoctest")
add_subdirectory(src/lib)
src/lib/CMakeLists.txt の内容:
include_directories(${CMAKE_HOME_DIRECTORY}/src/include)
find_package(Qt4 4.8 REQUIRED QtCore)
include(UseQt4)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_library(foo SHARED source.cpp)
target_link_libraries(foo ${QT_LIBRARIES})
set_target_properties(foo PROPERTIES AUTOMOC true)
source.cpp 内には、ファイル some_header.hpp が次のように含まれています。
#include "some_header.hpp"
問題:
ファイル some_header.hpp には Q_OBJECT が含まれており、いくつかのシグナルが含まれているため、moc はその魔法を働かせる必要があります。ただし、ヘッダーは実際のプロジェクト内にないため、ヘッダーはモックされません。some_header.hpp のファイル名さえ知らないので、具体的にモックするために追加することはできません。明らかに、AUTOMOC は、ソース ファイルにそれらのいずれかが含まれている場合でも、モック可能なファイルの include_directories をチェックしません。
私が試したこと(失敗):
cmake のドキュメントで説明されているように、source.cpp で #include moc_some_header.cpp を使用します。これにより、cmake が some_header{.h,.hpp,.hxx,.H} を見つけられなかったというエラーが発生します。- CMAKE_AUTOMOC_RELAXED_MODE を true に設定します。これが実際に何をするのかはドキュメントからは明らかではありませんが。とにかく違いはありませんでした。
- AUTOMOC_MOC_OPTIONS を -Isrc/include または -I/path/to/project/src/include または -I${CMAKE_HOME_DIRECTORY}/src/include に設定
しても、何も表示されません。
AUTOMOC の素晴らしい点は、実際にどのファイルをモックする必要があるかを知る必要がないことです。ただし、この場合、ソース ファイルに含まれる、内部に Q_OBJECT が含まれている可能性のあるすべてのヘッダーを知る必要があります。
モック可能なファイルを探す場所をAUTOMOCに正確に伝える方法はありますか?