# FindPackageHandleStandardArgs

This module provides functions intended to be used in Find Modules implementing `find_package(<PackageName>)` calls.

`find_package_handle_standard_args`

  This command handles the `REQUIRED`, `QUIET` and version-related arguments of `find_package()`. It also sets the `<PackageName>_FOUND` variable. The package is considered found if all variables listed contain valid results, e.g. valid filepaths.

  There are two signatures:

      find_package_handle_standard_args(<PackageName>
        (DEFAULT_MSG|<custom-failure-message>)
        <required-var>...
        )

      find_package_handle_standard_args(<PackageName>
        [FOUND_VAR <result-var>]
        [REQUIRED_VARS <required-var>...]
        [VERSION_VAR <version-var>]
        [HANDLE_VERSION_RANGE]
        [HANDLE_COMPONENTS]
        [CONFIG_MODE]
        [NAME_MISMATCHED]
        [REASON_FAILURE_MESSAGE <reason-failure-message>]
        [FAIL_MESSAGE <custom-failure-message>]
        )

  The `<PackageName>_FOUND` variable will be set to `TRUE` if all the variables `<required-var>...` are valid and any optional constraints are satisfied, and `FALSE` otherwise. A success or failure message may be displayed based on the results and on whether the `REQUIRED` and/or `QUIET` option was given to the `find_package()` call.

  The options are:

  `(DEFAULT_MSG|<custom-failure-message>)`

    In the simple signature this specifies the failure message. Use `DEFAULT_MSG` to ask for a default message to be computed (recommended). Not valid in the full signature.

  `FOUND_VAR <result-var>`

    Obsolete. Specifies either `<PackageName>_FOUND` or `<PACKAGENAME>_FOUND` as the result variable. This exists only for compatibility with older versions of CMake and is now ignored. Result variables of both names are always set for compatibility.

  `REQUIRED_VARS <required-var>...`

    Specify the variables which are required for this package. These may be named in the generated failure message asking the user to set the missing variable values. Therefore these should typically be cache entries such as `FOO_LIBRARY` and not output variables like `FOO_LIBRARIES`. This option is mandatory if `HANDLE_COMPONENTS` is not specified.

  `VERSION_VAR <version-var>`

    Specify the name of a variable that holds the version of the package that has been found. This version will be checked against the (potentially) specified required version given to the `find_package()` call, including its `EXACT` option. The default messages include information about the required version and the version which has been actually found, both if the version is ok or not.

  `HANDLE_VERSION_RANGE`

    Enable handling of a version range, if one is specified. Without this option, a developer warning will be displayed if a version range is specified.

  `HANDLE_COMPONENTS`

    Enable handling of package components. In this case, the command will report which components have been found and which are missing, and the `<PackageName>_FOUND` variable will be set to `FALSE` if any of the required components (i.e. not the ones listed after the `OPTIONAL_COMPONENTS` option of `find_package()`) are missing.

  `CONFIG_MODE`

    Specify that the calling find module is a wrapper around a call to `find_package(<PackageName> NO_MODULE)`. This implies a `VERSION_VAR` value of `<PackageName>_VERSION`. The command will automatically check whether the package configuration file was found.

  `REASON_FAILURE_MESSAGE <reason-failure-message>`

    Specify a custom message of the reason for the failure which will be appended to the default generated message.

  `FAIL_MESSAGE <custom-failure-message>`

    Specify a custom failure message instead of using the default generated message. Not recommended.

  `NAME_MISMATCHED`

    Indicate that the `<PackageName>` does not match `${CMAKE_FIND_PACKAGE_NAME}`. This is usually a mistake and raises a warning, but it may be intentional for usage of the command for components of a larger package.

Example for the simple signature:

    find_package_handle_standard_args(LibXml2 DEFAULT_MSG
      LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR)

The `LibXml2` package is considered to be found if both `LIBXML2_LIBRARY` and `LIBXML2_INCLUDE_DIR` are valid. Then also `LibXml2_FOUND` is set to `TRUE`. If it is not found and `REQUIRED` was used, it fails with a `message(FATAL_ERROR)`, independent whether `QUIET` was used or not. If it is found, success will be reported, including the content of the first `<required-var>`. On repeated CMake runs, the same message will not be printed again.

Note

If `<PackageName>` does not match `CMAKE_FIND_PACKAGE_NAME` for the calling module, a warning that there is a mismatch is given. The `FPHSA_NAME_MISMATCHED` variable may be set to bypass the warning if using the old signature and the `NAME_MISMATCHED` argument using the new signature. To avoid forcing the caller to require newer versions of CMake for usage, the variable’s value will be used if defined when the `NAME_MISMATCHED` argument is not passed for the new signature (but using both is an error)..

Example for the full signature:

    find_package_handle_standard_args(LibArchive
      REQUIRED_VARS LibArchive_LIBRARY LibArchive_INCLUDE_DIR
      VERSION_VAR LibArchive_VERSION)

In this case, the `LibArchive` package is considered to be found if both `LibArchive_LIBRARY` and `LibArchive_INCLUDE_DIR` are valid. Also the version of `LibArchive` will be checked by using the version contained in `LibArchive_VERSION`. Since no `FAIL_MESSAGE` is given, the default messages will be printed.

Another example for the full signature:

    find_package(Automoc4 QUIET NO_MODULE HINTS /opt/automoc4)
    find_package_handle_standard_args(Automoc4  CONFIG_MODE)

In this case, a `FindAutmoc4.cmake` module wraps a call to `find_package(Automoc4 NO_MODULE)` and adds an additional search directory for `automoc4`. Then the call to `find_package_handle_standard_args` produces a proper success/failure message.

`find_package_check_version`

  Helper function which can be used to check if a `<version>` is valid against version-related arguments of `find_package()`.

      find_package_check_version(<version> <result-var>
        [HANDLE_VERSION_RANGE]
        [RESULT_MESSAGE_VARIABLE <message-var>]
        )

  The `<result-var>` will hold a boolean value giving the result of the check.

  The options are:

  `HANDLE_VERSION_RANGE`

    Enable handling of a version range, if one is specified. Without this option, a developer warning will be displayed if a version range is specified.

  `RESULT_MESSAGE_VARIABLE <message-var>`

    Specify a variable to get back a message describing the result of the check.

Example for the usage:

    find_package_check_version(1.2.3 result HANDLE_VERSION_RANGE
      RESULT_MESSAGE_VARIABLE reason)
    if (result)
      message (STATUS "${reason}")
    else()
      message (FATAL_ERROR "${reason}")
    endif()