1

cmake から ExternalProject_Add コマンドを使用して DevIL をダウンロードしてビルドしようとしていますが、何らかの理由で、git リポジトリにはプロジェクトのサブフォルダー内に CMakeLists.txt ファイルがあります。

ExternalProject_add を作成して正しいフォルダーで cmake を呼び出す方法が見つからないようです。prefix と source_dir を使用してみましたが、それでも失敗します。

次に、正しいcmakeパスを呼び出す一時的なCMakeLists.txtの作成を含む回答をオンラインで見ました。しかし、cmake呼び出しへのパスを提供する方法がわからないため、ダウンロードしたgitリポジトリ内にパスを配置する必要があり、後で面倒であることがわかりました...これは私が使用している現在のコマンドです: 含める (「外部プロジェクト」)

######### Search for required third-party libraries. If not found, attempt to download and build them ########

set ( DEVIL_ROOT "${THIRD_PARTY_OUTPUT_PATH}/DevIL" )
option ( BUILD_DEVIL "Download and build DevIL" FALSE )

find_package ( Devil )
if ( NOT DEVIL_FOUND )
    message ( STATUS "DevIL not found. Forcing to build own copy...")
    set ( BUILD_DEVIL TRUE )
endif()

if ( BUILD_DEVIL )
set ( DEVIL_BUILD_PATH "${THIRD_PARTY_BUILD_PATH}/DevIL/" )
set ( DEVIL_OUTPUT_PATH "${THIRD_PARTY_OUTPUT_PATH}/DevIL" )

message ( STATUS "Downloading DevIL and building...")
file( WRITE ${DEVIL_BUILD_PATH}/DevilCMakeLists.txt "cmake_minimum_required( VERSION 3.0 ) \n  add_subdirectory ( DevIL )" )
ExternalProject_Add ( ThirdParty_DevIL
    PREFIX "${DEVIL_BUILD_PATH}"
    GIT_REPOSITORY "https://github.com/DentonW/DevIL"
    PATCH_COMMAND cmake -E copy "${DEVIL_BUILD_PATH}/DevilCMakeLists.txt" "${DEVIL_BUILD_PATH}/src/ThirdParty_DevIL/DevIL/"
    INSTALL_DIR ${DEVIL_OUTPUT_PATH}
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> )

list ( APPEND THIRD_PARTY_DEPENDENCIES ThirdParty_DevIL )
set ( DEVIL_INCLUDE_DIR "${DEVIL_OUTPUT_PATH}/include" )
set ( DEVIL_LIBRARY devil )
add_definitions ( -DDEVIL )
endif()

list ( APPEND THIRD_PARTY_INCLUDE_DIRS "${DEVIL_INCLUDE_DIR}" )
list ( APPEND THIRD_PARTY_LIBRARIES ${DEVIL_LIBRARY} )

このようにパスをハードコーディングしてみました (「/src/ThirdParty_DevIL/」の部分)。また、これは実際にはgitツリー内のファイルをコピーしているため、cmakeは後で文句を言います

Failed to unstash changes in:
'<yadda yadda>/ThirdParty/build//DevIL//src/ThirdParty_DevIL/'.


You will have to resolve the conflicts manually

このソリューション (一時的な CMakeListst.txt の作成) を機能させる方法はありますか? または、さらに良いことに、 ExternalProject_add を正しく構成するだけで、別の解決策がありますか?

パラメータ、パスなどに関するリクエストはありませんので、何でもお気軽に提案してください。どうすればこれを修正できますか? ありがとう

4

2 に答える 2

4

ソース ツリーにパッチを適用する代わりに、適切なディレクトリをソースとして使用するCONFIGURE_COMMANDオプションを指定できます。

ExternalProject_Add ( ThirdParty_DevIL
    PREFIX "${DEVIL_BUILD_PATH}"
    GIT_REPOSITORY "https://github.com/DentonW/DevIL"
    INSTALL_DIR ${DEVIL_OUTPUT_PATH}
    CONFIGURE_COMMAND ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
        <SOURCE_DIR>/DevIL # Tell CMake to use subdirectory as source.
)

その場合、通常はCMAKE_ARGSCMAKE_CACHE_ARGSなどのオプションで指定されるものをこのコマンドに手動で追加する必要があります。しかし、これは実際の問題ではないはずです。


または、2 つの呼び出しに分割することもできExternalProject_Addます。1 つはパッケージをダウンロードするだけで、もう 1 つは他のすべてを実行します。これらの呼び出しでは、さまざまなSOURCE_DIRオプションを使用できます。

ExternalProject_Add ( ThirdParty_DevIL_download
    PREFIX "${DEVIL_BUILD_PATH}"
    SOURCE_DIR "${DEVIL_BUILD_PATH}/src/ThirdParty_DevIL" # Explicitely set
    GIT_REPOSITORY "https://github.com/DentonW/DevIL"
    CONFIGURE_COMMAND "" # Disable all other steps
    BUILD_COMMAND ""
    INSTALL_COMMAND ""
)

ExternalProject_Add ( ThirdParty_DevIL
    PREFIX "${DEVIL_BUILD_PATH}"
    DOWNLOAD_COMMAND "" # Disable download step
    SOURCE_DIR "${DEVIL_BUILD_PATH}/src/ThirdParty_DevIL/DevIL" # Source dir for configuration
    INSTALL_DIR ${DEVIL_OUTPUT_PATH}
    CMAKE_CACHE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
)

# Add dependency between to calls
add_dependencies(ThirdParty_DevIL ThirdParty_DevIL_download)

PREFIXに基づくSOURCE_DIRの計算は外部プロジェクトの名前に依存し、名前は 2 つの呼び出しで異なるため、このオプションは明示的に設定されます。

このアプローチの欠点は、ビルド ログに多くの「実行されていない」手順に関する行が表示されることです (最初の呼び出しでは構成、ビルド、インストールExternalProject_Add()、2 回目の呼び出しではダウンロード、パス、更新)。

于 2016-06-20T17:58:01.557 に答える