2016-09-22 3 views
0

У меня есть следующие CMakeLists.txt:влияние NO_CMAKE_PACKAGE_REGISTRY на CMake find_package()

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 запрещает find_package() смотреть на ~/.cmake/package/FOO, но я не имею ничего здесь. У меня такое же поведение с cmake 2.8.9 и cmake 3.5.1.

Почему find_package() не находит файл в первом случае?

ответ

1

Есть два способа find_package: первый, простой, поиск FindFOO.cmakeмодуль, второй, более сложный, ищет FOOConfig.cmakeконфигурационный файл.

По умолчанию CMake пробует оба режима, поэтому модуль режим успешно находит ваш файл.

Но вариант NO_CMAKE_PACKAGE_REGISTRY применим только для config режим, который не может найти ваш файл в любом случае. Тот же эффект будет вызван

find_package(FOO NO_MODULE) 
+0

Если я копирую 'FindFOO.cmake' в' FOOConfig.cmake' в том же месте, он не работает. Но если я определяю 'CMAKE_PREFIX_PATH', чтобы указать на мой локальный каталог' $ {CMAKE_SOURCE_DIR}/cmake/', то он работает в обоих случаях. Благодаря! – xiawi

+0

В разных режимах 'find_package()' используются разные альготы для поиска и разные переменные. Переменная 'CMAKE_MODULE_PATH', которую вы устанавливаете первоначально, влияет только на режим ** module **, переменная' CMAKE_PREFIX_PATH' влияет только на режим ** config **. – Tsyvarev

Смежные вопросы