Функция find_package_message
предназначена для однократной печати сообщения до тех пор, пока «детали» не будут изменены. Для достижения другой семантики c - печатать сообщение один раз за cmake
вызов - есть небольшой смысл использовать эту функцию, но реализует свою собственную одну.
Чтобы отличить первый вызов функции от последующих, можно проверить, определено ли свойство GLOBAL :
function(print_message_once name message)
# Name of the custom GLOBAL property to check
set(pname PRINT_MESSAGE_ONCE_DUMMY_${name})
get_property(prop_defined GLOBAL PROPERTY ${pname} DEFINED)
if (NOT prop_defined)
message(STATUS "${message}")
# Define a property so next time it will exist
define_property(GLOBAL PROPERTY ${pname} BRIEF_DOCS "${name}" FULL_DOCS "${name}")
endif()
endfunction()
Обратите внимание, что эта функция больше не требует аргумента details
. Маловероятно, что во время одного вызова cmake
после первого поиска пакета очистится кэш и будет выполнен второй поиск с другими параметрами.
В качестве альтернативы, вместо проверки свойства можно проверить существование function :
function(print_message_once name message)
# Name of the custom function to check
set(fname _check_first_dummy_${name})
if (NOT COMMAND ${fname})
message(STATUS "${message}")
# Define a function so next time it will exist
function(${fname})
endfunction()
endif()
endfunction()
Использование функции print_message_once
(определено выше любым из двух способов), "совместимой" с find_package_message
, является
if(NOT foobar_FIND_QUIETLY)
print_message_once(foobar
"Found foobar: ${info} (version ${foobar_VERSION})"
)
endif()
Если При желании проверка переменной XXX_FIND_QUIETLY
(которая отражает опцию QUIET вызова find_package()
) может быть включена в саму функцию print_message_once
.