2016-09-22 3 views
0

私は、次のCMakeLists.txtがありますCMakeのをfind_packageにNO_CMAKE_PACKAGE_REGISTRYの影響()

cmake_minimum_required(VERSION 2.6) 

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") 

find_package(FOO QUIET NO_CMAKE_PACKAGE_REGISTRY) 
if (FOO_FOUND) 
    message("FOO is found") 
else (FOO_FOUND) 
    message("FOO not found") 
endif (FOO_FOUND) 

find_package(FOO QUIET) 
if (FOO_FOUND) 
    message("FOO (2) is found") 
else (FOO_FOUND) 
    message("FOO (2) not found") 
endif (FOO_FOUND) 

ファイル${CMAKE_SOURCE_DIR}/cmake/FindFOO.cmakeがあります。私はcmakeを実行したときしかし、それだけで第二の場合には、パッケージFOOを検出:ドキュメントの

-- (...) 
-- Detecting CXX compiler ABI info       
-- Detecting CXX compiler ABI info - done 
FOO not found           
FOO (2) is found          
-- Configuring done            
-- Generating done         
-- Build files have been written to: /home/me/tmp/build 

私の理解では、NO_CMAKE_PACKAGE_REGISTRY~/.cmake/package/FOOを見てfind_package()を禁じますが、私はここに何もないということです。私はcmake 2.8.9とcmake 3.5.1で同じ動作をしています。

なぜfind_package()が最初のケースでファイルを見つけられないのですか?

答えて

1

find_packageの2つのモードがあります:最初のものは、単純では、FindFOO.cmakeモジュールを検索し、より複雑なもう一つは、FOOConfig.cmake設定ファイルを検索します。

デフォルトでは、CMakeは両方のモードを試行します。したがって、モジュールモードでファイルが正常に検出されます。

ただし、NO_CMAKE_PACKAGE_REGISTRYオプションは、設定モードにのみ適用され、どの場合でもファイルを見つけることができません。

find_package(FOO NO_MODULE) 
+0

'FOOConfig.cmake'を' FOOConfig.cmake'に同じ場所でコピーしても動作しません。しかし、 'CMAKE_PREFIX_PATH'がローカルディレクトリ' $ {CMAKE_SOURCE_DIR}/cmake/'を指すように定義していれば、どちらの場合でも実際に動作します。ありがとう! – xiawi

+0

'find_package()'の異なるモードは、検索と異なる変数に対して異なるアルゴスムを使用します。もともと設定した変数 'CMAKE_MODULE_PATH'は**モジュール**モードのみに影響し、変数' CMAKE_PREFIX_PATH'は** config **モードのみに影響します。 – Tsyvarev

関連する問題