blob: 2c5cb93e36f2cbcf367f610c32756ef3f30ceee4 [file] [log] [blame]
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.
#[=======================================================================[.rst:
FindASPELL
----------
Finds the GNU Aspell spell checker library.
Components
^^^^^^^^^^
This module supports the following components:
``ASPELL``
.. versionadded:: 4.1
Finds the Aspell library and its include paths.
``Executable``
.. versionadded:: 4.1
Finds the Aspell command-line interactive spell checker executable.
Components can be specified using the standard CMake syntax:
.. code-block:: cmake
find_package(ASPELL [COMPONENTS <components>...])
If no ``COMPONENTS`` are specified, the module searches for both the ``ASPELL``
and ``Executable`` components by default.
Imported Targets
^^^^^^^^^^^^^^^^
This module provides the following :ref:`Imported Targets` when
:prop_gbl:`CMAKE_ROLE` is ``PROJECT``:
``ASPELL::ASPELL``
.. versionadded:: 4.1
Target encapsulating the Aspell library usage requirements. It is available
only when the ``ASPELL`` component is found.
``ASPELL::Executable``
.. versionadded:: 4.1
Target encapsulating the Aspell command-line spell checker executable. It is
available only when the ``Executable`` component is found.
Result Variables
^^^^^^^^^^^^^^^^
This module defines the following variables:
``ASPELL_FOUND``
Boolean indicating whether the requested Aspell components have been found.
``ASPELL_VERSION``
.. versionadded:: 4.1
Version string of the found Aspell if any. It may be only determined if the
``Executable`` component is found. If version isn't determined, version value
is not set.
``ASPELL_INCLUDE_DIRS``
.. versionadded:: 4.1
Include directories needed to use Aspell. They are available when the
``ASPELL`` component is found.
The Aspell library may also provide a backward-compatible interface for Pspell
via the ``pspell.h`` header file. If such an interface is found, it is also
added to the list of include directories.
``ASPELL_LIBRARIES``
Libraries needed to link to Aspell. They are available when the ``ASPELL``
component is found.
.. versionchanged:: 4.1
This variable is now set as a regular result variable instead of being a
cache variable.
Cache Variables
^^^^^^^^^^^^^^^
The following cache variables may also be set:
``ASPELL_INCLUDE_DIR``
The directory containing the ``aspell.h`` header file when using the
``Executable`` component.
``ASPELL_LIBRARY``
.. versionadded:: 4.1
The path to the Aspell library when using the ``ASPELL`` component.
``ASPELL_EXECUTABLE``
The path to the ``aspell`` command-line spell checker program when using the
``Executable`` component.
Examples
^^^^^^^^
Finding the Aspell library with CMake 4.1 or later and linking it to a project
target:
.. code-block:: cmake
find_package(ASPELL COMPONENTS ASPELL)
target_link_libraries(project_target PRIVATE ASPELL::ASPELL)
When writing backward-compatible code that supports CMake 4.0 and earlier, a
local imported target can be defined directly in the project:
.. code-block:: cmake
find_package(ASPELL COMPONENTS ASPELL)
if(ASPELL_FOUND AND NOT TARGET ASPELL::ASPELL)
add_library(ASPELL::ASPELL INTERFACE IMPORTED)
set_target_properties(
ASPELL::ASPELL
PROPERTIES
INTERFACE_LINK_LIBRARIES "${ASPELL_LIBRARIES}"
INTERFACE_INCLUDE_DIRECTORIES "${ASPELL_INCLUDE_DIR}"
)
endif()
target_link_libraries(project_target PRIVATE ASPELL::ASPELL)
Example, how to execute the ``aspell`` command-line spell checker in a project:
.. code-block:: cmake
find_package(ASPELL COMPONENTS Executable)
execute_process(COMMAND ${ASPELL_EXECUTABLE} --help)
#]=======================================================================]
set(_ASPELL_REASON_FAILURE_MESSAGE "")
set(_ASPELL_REQUIRED_VARS "")
# Set default components, when 'COMPONENTS <components>...' are not specified in
# the 'find_package(ASPELL ...)' call.
if(NOT ASPELL_FIND_COMPONENTS)
set(ASPELL_FIND_COMPONENTS "ASPELL" "Executable")
set(ASPELL_FIND_REQUIRED_ASPELL TRUE)
set(ASPELL_FIND_REQUIRED_Executable TRUE)
endif()
if("ASPELL" IN_LIST ASPELL_FIND_COMPONENTS)
find_path(
ASPELL_INCLUDE_DIR
NAMES aspell.h
DOC "The directory containing <aspell.h>."
)
mark_as_advanced(ASPELL_INCLUDE_DIR)
if(NOT ASPELL_INCLUDE_DIR)
string(APPEND _ASPELL_REASON_FAILURE_MESSAGE "aspell.h could not be found. ")
endif()
# Find backward-compatibility interface for Pspell.
find_path(
ASPELL_PSPELL_INCLUDE_DIR
NAMES pspell.h
PATH_SUFFIXES pspell
DOC "Directory containing <pspell.h> BC interface header"
)
mark_as_advanced(ASPELL_PSPELL_INCLUDE_DIR)
# For backward compatibility in projects supporting CMake 4.0 or earlier.
# Previously the ASPELL_LIBRARIES was a cache variable storing the
# find_library result.
if(DEFINED ASPELL_LIBRARIES AND NOT DEFINED ASPELL_LIBRARY)
set(ASPELL_LIBRARY ${ASPELL_LIBRARIES})
endif()
find_library(
ASPELL_LIBRARY
NAMES aspell aspell-15 libaspell-15 libaspell
DOC "The path to the Aspell library."
)
mark_as_advanced(ASPELL_LIBRARY)
if(NOT ASPELL_LIBRARY)
string(APPEND _ASPELL_REASON_FAILURE_MESSAGE "Aspell library not found. ")
endif()
if(ASPELL_INCLUDE_DIR AND ASPELL_LIBRARY)
set(ASPELL_ASPELL_FOUND TRUE)
else()
set(ASPELL_ASPELL_FOUND FALSE)
endif()
if(ASPELL_FIND_REQUIRED_ASPELL)
list(APPEND _ASPELL_REQUIRED_VARS ASPELL_LIBRARY ASPELL_INCLUDE_DIR)
endif()
endif()
if("Executable" IN_LIST ASPELL_FIND_COMPONENTS)
find_program(
ASPELL_EXECUTABLE
NAMES aspell
DOC "The path to the aspell command-line utility program."
)
mark_as_advanced(ASPELL_EXECUTABLE)
if(NOT ASPELL_EXECUTABLE)
string(
APPEND
_ASPELL_REASON_FAILURE_MESSAGE
"Aspell command-line executable not found. "
)
set(ASPELL_Executable_FOUND FALSE)
else()
set(ASPELL_Executable_FOUND TRUE)
block(PROPAGATE ASPELL_VERSION)
execute_process(
COMMAND ${ASPELL_EXECUTABLE} --version
OUTPUT_VARIABLE output
RESULT_VARIABLE result
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(result EQUAL 0 AND output MATCHES "([0-9.]+)[)]?$")
set(ASPELL_VERSION ${CMAKE_MATCH_1})
endif()
endblock()
endif()
if(ASPELL_FIND_REQUIRED_Executable)
list(APPEND _ASPELL_REQUIRED_VARS ASPELL_EXECUTABLE)
endif()
endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(
ASPELL
REQUIRED_VARS ${_ASPELL_REQUIRED_VARS}
HANDLE_COMPONENTS
VERSION_VAR ASPELL_VERSION
REASON_FAILURE_MESSAGE "${_ASPELL_REASON_FAILURE_MESSAGE}"
)
unset(_ASPELL_REASON_FAILURE_MESSAGE)
unset(_ASPELL_REQUIRED_VARS)
if(NOT ASPELL_FOUND)
return()
endif()
get_property(_ASPELL_ROLE GLOBAL PROPERTY CMAKE_ROLE)
if("ASPELL" IN_LIST ASPELL_FIND_COMPONENTS AND ASPELL_ASPELL_FOUND)
set(ASPELL_INCLUDE_DIRS ${ASPELL_INCLUDE_DIR})
if(ASPELL_PSPELL_INCLUDE_DIR)
list(APPEND ASPELL_INCLUDE_DIRS ${ASPELL_PSPELL_INCLUDE_DIR})
list(REMOVE_DUPLICATES ASPELL_INCLUDE_DIRS)
endif()
set(ASPELL_LIBRARIES ${ASPELL_LIBRARY})
if(_ASPELL_ROLE STREQUAL "PROJECT" AND NOT TARGET ASPELL::ASPELL)
if(IS_ABSOLUTE "${ASPELL_LIBRARY}")
add_library(ASPELL::ASPELL UNKNOWN IMPORTED)
set_target_properties(
ASPELL::ASPELL
PROPERTIES
IMPORTED_LOCATION "${ASPELL_LIBRARY}"
)
else()
add_library(ASPELL::ASPELL INTERFACE IMPORTED)
set_target_properties(
ASPELL::ASPELL
PROPERTIES
IMPORTED_LIBNAME "${ASPELL_LIBRARY}"
)
endif()
set_target_properties(
ASPELL::ASPELL
PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${ASPELL_INCLUDE_DIRS}"
)
endif()
endif()
if(
_ASPELL_ROLE STREQUAL "PROJECT"
AND "Executable" IN_LIST ASPELL_FIND_COMPONENTS
AND ASPELL_Executable_FOUND
AND NOT TARGET ASPELL::Executable
)
add_executable(ASPELL::Executable IMPORTED)
set_target_properties(
ASPELL::Executable
PROPERTIES
IMPORTED_LOCATION "${ASPELL_EXECUTABLE}"
)
endif()
unset(_ASPELL_ROLE)