1. ホーム
  2. cmake

[解決済み】CMAKE_MODULE_PATHを指定する必要がある場合、find_package()はどのように使用するのでしょうか?

2022-04-12 18:11:03

質問

CMakeを使用してクロスプラットフォームビルドシステムを動作させようとしています。現在、このソフトウェアにはいくつかの依存関係があります。私はそれらを自分でコンパイルし、私のシステムにそれらをインストールしました。

インストールされたいくつかのサンプルファイルです。

-- Installing: /usr/local/share/SomeLib/SomeDir/somefile
-- Installing: /usr/local/share/SomeLib/SomeDir/someotherfile
-- Installing: /usr/local/lib/SomeLib/somesharedlibrary
-- Installing: /usr/local/lib/SomeLib/cmake/FindSomeLib.cmake
-- Installing: /usr/local/lib/SomeLib/cmake/HelperFile.cmake

これでCMakeは find_package() を開くと Find*.cmake のような変数を定義し、システム上のライブラリを検索します。 SomeLib_FOUND などです。

私のCMakeLists.txtには、このようなものが含まれています。

set(CMAKE_MODULE_PATH "/usr/local/lib/SomeLib/cmake/;${CMAKE_MODULE_PATH}")
find_package(SomeLib REQUIRED)

最初のコマンドは、CMake が検索する場所を定義します。 Find*.cmake というディレクトリを追加し SomeLib という名前の FindSomeLib.cmake は見つけることができますので find_package() 動作 は期待通りでした。

しかし、これはちょっと奇妙なことです。 find_package() が存在するのは、クロスプラットフォームでないハードコードされたパスから逃れるためです。

これは通常どのように行われるのでしょうか?をコピーすればいいのでしょうか? cmake/ ディレクトリの SomeLib をプロジェクトに追加し CMAKE_MODULE_PATH 相対的に?

どのように解決するのですか?

コマンド find_package には2つのモードがあります。 Module モードと Config モードを使用します。あなたがやろうとしているのは 使用 Module モードが必要な場合、実際には Config モードを使用します。

モジュールモード

Find<package>.cmake ファイル位置 内の を作成します。このようなものです。

CMakeLists.txt
cmake/FindFoo.cmake
cmake/FindBoo.cmake

CMakeLists.txt のコンテンツを表示します。

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
find_package(Foo REQUIRED) # FOO_INCLUDE_DIR, FOO_LIBRARIES
find_package(Boo REQUIRED) # BOO_INCLUDE_DIR, BOO_LIBRARIES

include_directories("${FOO_INCLUDE_DIR}")
include_directories("${BOO_INCLUDE_DIR}")
add_executable(Bar Bar.hpp Bar.cpp)
target_link_libraries(Bar ${FOO_LIBRARIES} ${BOO_LIBRARIES})

なお CMAKE_MODULE_PATH は優先順位が高く、標準的な Find<package>.cmake ファイルを作成します。

コンフィグモード(インストール)

<package>Config.cmake ファイルの場所 外側 で生成され install のコマンドで、他のプロジェクト( Foo など)。

foo ライブラリを使用します。

> cat CMakeLists.txt 
cmake_minimum_required(VERSION 2.8)
project(Foo)

add_library(foo Foo.hpp Foo.cpp)
install(FILES Foo.hpp DESTINATION include)
install(TARGETS foo DESTINATION lib)
install(FILES FooConfig.cmake DESTINATION lib/cmake/Foo)

設定ファイルの簡易版。

> cat FooConfig.cmake 
add_library(foo STATIC IMPORTED)
find_library(FOO_LIBRARY_PATH foo HINTS "${CMAKE_CURRENT_LIST_DIR}/../../")
set_target_properties(foo PROPERTIES IMPORTED_LOCATION "${FOO_LIBRARY_PATH}")

にインストールされたプロジェクトは、デフォルトで CMAKE_INSTALL_PREFIX ディレクトリに格納されます。

> cmake -H. -B_builds
> cmake --build _builds --target install
-- Install configuration: ""
-- Installing: /usr/local/include/Foo.hpp
-- Installing: /usr/local/lib/libfoo.a
-- Installing: /usr/local/lib/cmake/Foo/FooConfig.cmake

コンフィグモード(使用)

使用方法 find_package(... CONFIG) を含めることができます。 FooConfig.cmake インポートされたターゲットと foo :

> cat CMakeLists.txt 
cmake_minimum_required(VERSION 2.8)
project(Boo)

# import library target `foo`
find_package(Foo CONFIG REQUIRED)

add_executable(boo Boo.cpp Boo.hpp)
target_link_libraries(boo foo)
> cmake -H. -B_builds -DCMAKE_VERBOSE_MAKEFILE=ON
> cmake --build _builds
Linking CXX executable Boo
/usr/bin/c++ ... -o Boo /usr/local/lib/libfoo.a

インポートされたターゲットは 非常に を設定することができます。私の 回答 .

更新情報