Как напечатать сообщение ровно один раз за вызов cmake? - PullRequest
0 голосов
/ 04 апреля 2020

Желание заставить foobar пакета печатать там, где оно было найдено, при использовании

find_package(foobar CONFIG)

Я использую

find_package_message(foobar
  "Found foobar: ${info} (version ${foobar_VERSION})"
  "[${info}][${foobar_VERSION}]"
)

Идея использования find_package_message состоит в том, чтобы печатать только это сообщение один раз.

Однако я хочу напечатать его каждый раз, когда cmake запускается с самого начала. Я только хочу избежать дубликатов во время одного и того же запуска cmake.

find_package_message сохраняет переменную в кэше (FIND_PACKAGE_MESSAGE_DETAILS_foobar), содержащую значение указанного выше третьего аргумента ("[${info}][${foobar_VERSION}]"), и печатает сообщение снова, когда эта переменная не существует или не изменилась.

Итак, результат повторного запуска cmake - ничего не печатается: FIND_PACKAGE_MESSAGE_DETAILS_foobar уже существует в кэше и не изменилось.

Как это исправить, чтобы печатать сообщение один раз каждый новый вызов cmake?

1 Ответ

0 голосов
/ 04 апреля 2020

Функция 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...