How to print a message exactly once per cmake invocation?

故事扮演 提交于 2020-04-30 07:02:21

问题


Wanting to cause a package foobar to print where it was found, when using

find_package(foobar CONFIG)

I am using

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

The idea of using find_package_message is to only print this message once.

However, I want to print it every time cmake is run from the start. I only want to avoid duplicates during the same run of cmake.

find_package_message stores a variable in the cache (FIND_PACKAGE_MESSAGE_DETAILS_foobar) containing the value of the above third argument ("[${info}][${foobar_VERSION}]") and prints the message again when that variable doesn't exist or changed.

So, the result of running cmake a second time is that nothing is printed: FIND_PACKAGE_MESSAGE_DETAILS_foobar already exists in the cache and didn't change.

How can I fix this to print a message once every new invocation of cmake?


回答1:


Function find_package_message is intended for print the message once until "details" are changed. For achieve different semantic - print message once per cmake invocation - there are a little sense to use this function but implement your own one.

For differentiate the first function invocation from further ones one may check whether GLOBAL property is defined:

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()

Note, this function is no longer requires details argument. It is very unlikely that during a single cmake invocation one will clear the cache after the first finding the package and performs second search with different parameters.

Alternatively, instead of property check, one may check existence of the 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()

Usage of function print_message_once (defined above using any of 2 ways) "compatible" with find_package_message is

if(NOT foobar_FIND_QUIETLY)
  print_message_once(foobar
    "Found foobar: ${info} (version ${foobar_VERSION})"
  )
endif()

If desired, checking for XXX_FIND_QUIETLY variable (which reflects QUIET option of find_package() call) could be incorporated into print_message_once function itself.



来源:https://stackoverflow.com/questions/61024065/how-to-print-a-message-exactly-once-per-cmake-invocation

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!