diff options
Diffstat (limited to 'cmake/FindGuile.cmake')
-rw-r--r-- | cmake/FindGuile.cmake | 326 |
1 files changed, 326 insertions, 0 deletions
diff --git a/cmake/FindGuile.cmake b/cmake/FindGuile.cmake new file mode 100644 index 000000000000..2b8781c48f48 --- /dev/null +++ b/cmake/FindGuile.cmake @@ -0,0 +1,326 @@ +#[[.rst +# +# FindGuile +# --------- +# Find the development libraries for Guile. +# +# Exported Vars +# ~~~~~~~~~~~~~ +# +# .. variable:: Guile_FOUND +# +# Set to *true* if Guile was found. +# +# .. variable:: Guile_INCLUDE_DIRS +# +# A list of include directories. +# +# .. variable:: Guile_LIBRARIES +# +# A list of libraries needed to build you project. +# +# .. variable:: Guile_VERSION_STRING +# +# Guile full version. +# +# .. variable:: Guile_VERSION_MAJOR +# +# Guile major version. +# +# .. variable:: Guile_VERSION_MINOR +# +# Guile minor version. +# +# .. variable:: Guile_VERSION_PATCH +# +# Guile patch version. +# +# .. variable:: Guile_EXECUTABLE +# +# Guile executable (optional). +# +# .. variable:: Guile_CONFIG_EXECUTABLE +# +# Guile configuration executable (optional). +# +# .. variable:: Guile_ROOT_DIR +# +# Guile installation root dir (optional). +# +# .. variable:: Guile_SITE_DIR +# +# Guile installation module site dir (optional). +# +# .. variable:: Guile_EXTENSION_DIR +# +# Guile installation extension dir (optional). +# +# Control VARS +# ~~~~~~~~~~~~ +# :envvar:`Guile_ROOT_DIR` +# +# Use this variable to provide hints to :filename:`find_{*}` commands, +# you may pass it to :command:`cmake` or set the environtment variable. +# +# .. code-block:: cmake +# +# % cmake . -Bbuild -DGuile_ROOT_DIR=<extra-path> +# +# # or +# % export Guile_ROOT_DIR=<extra-path>; +# % cmake . -Bbuild +# +# # or +# % Guile_ROOT_DIR=<extra-path> cmake . -Bbuild +# +# +#]] + + +#[[.rst +# +# Copyright © 2016, Edelcides Gonçalves <eatg75 |0x40| gmail> +# +# Permission to use, copy, modify, and/or distribute this software for +# any purpose with or without fee is hereby granted, provided that the +# above copyright notice and this permission notice appear in all +# copies. +# +# *THE SOFTWARE IS PROVIDED* **AS IS** *AND ISC DISCLAIMS ALL +# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE +# LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +# OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +# PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE*. +# +# This file is not part of CMake +# +#]] + + +include (SelectLibraryConfigurations) +include (FindPackageHandleStandardArgs) + +function (_guile_find_component_include_dir component header) + find_path ("${component}_INCLUDE_DIR" + ${header} + HINTS + "${GUile_ROOT_DIR}" + ENV Guile_ROOT_DIR + PATH_SUFFIXES + Guile guile Guile-2.0 guile-2.0 Guile/2.0 guile/2.0 GC + gc) + + set ("${component}_INCLUDE_DIR" "${${component}_INCLUDE_DIR}" + PARENT_SCOPE) +endfunction () + +function (_guile_find_component_library component_name component) + + find_library ("${component_name}_LIBRARY_RELEASE" + NAMES "${component}" "${component}-2.0" + HINTS + "${GUile_ROOT_DIR}" + ENV Guile_ROOT_DIR + PATHS + /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE} + /usr/lib64/${CMAKE_LIBRARY_ARCHITECTURE} + /usr/lib32/${CMAKE_LIBRARY_ARCHITECTURE}) + + if (${component_name}_LIBRARY_RELEASE) + select_library_configurations (${component_name}) + set ("${component_name}_LIBRARY_RELEASE" + "${${component_name}_LIBRARY_RELEASE}" PARENT_SCOPE) + set ("${component_name}_LIBRARY" + "${${component_name}_LIBRARY}" PARENT_SCOPE) + set ("${component_name}_LIBRARIES" + "${${component_name}_LIBRARIES}" PARENT_SCOPE) + endif () +endfunction () + +function (_guile_find_version_2 header_file macro_name) + file (STRINGS "${header_file}" _VERSION + REGEX "#define[\t ]+${macro_name}[\t ]+[0-9]+") + + if (_VERSION) + string (REGEX REPLACE + ".*#define[\t ]+${macro_name}[\t ]+([0-9]+).*" + "\\1" _VERSION_VALUE "${_VERSION}") + if ("${_VERSION}" STREQUAL "${_VERSION_VALUE}") + set (_VERSION_FOUND 0 PARENT_SCOPE) + else () + set (_VERSION_FOUND 1 PARENT_SCOPE) + set (_VERSION "${_VERSION_VALUE}" PARENT_SCOPE) + endif () + else () + set (_VERSION_FOUND 0 PARENT_SCOPE) + endif () +endfunction () + + +##### Entry Point ##### + +set (Guile_FOUND) +set (Guile_INCLUDE_DIRS) +set (Guile_LIBRARIES) +set (Guile_VERSION_STRING) +set (Guile_VERSION_MAJOR) +set (Guile_VERSION_MINOR) +set (Guile_VERSION_PATCH) +set (Guile_EXECUTABLE) + +_guile_find_component_include_dir (Guile "libguile.h") +if (Guile_INCLUDE_DIR) + _guile_find_version_2 ("${Guile_INCLUDE_DIR}/libguile/version.h" + SCM_MAJOR_VERSION) + if (_VERSION_FOUND) + set (Guile_VERSION_MAJOR "${_VERSION}") + else () + message (FATAL_ERROR "FindGuile: Failed to find Guile_MAJOR_VERSION.") + endif () + + _guile_find_version_2 ("${Guile_INCLUDE_DIR}/libguile/version.h" + SCM_MINOR_VERSION) + if (_VERSION_FOUND) + set (Guile_VERSION_MINOR "${_VERSION}") + else () + message (FATAL_ERROR "FindGuile: Failed to find Guile_MINOR_VERSION.") + endif () + + _guile_find_version_2 ("${Guile_INCLUDE_DIR}/libguile/version.h" + SCM_MICRO_VERSION) + if (_VERSION_FOUND) + set (Guile_VERSION_PATCH "${_VERSION}") + else () + message (FATAL_ERROR "FindGuile: Failed to find Guile_MICRO_VERSION.") + endif () + set (Guile_VERSION_STRING "${Guile_VERSION_MAJOR}.${Guile_VERSION_MINOR}.${Guile_VERSION_PATCH}") + + unset (_VERSION_FOUND) + unset (_VERSION) +endif () + +_guile_find_component_include_dir (Guile_GC "gc.h") +_guile_find_component_library (Guile guile) +_guile_find_component_library (Guile_GC gc) + +find_program (Guile_EXECUTABLE + guile + DOC "Guile executable.") + +if (Guile_EXECUTABLE) + execute_process (COMMAND ${Guile_EXECUTABLE} --version + RESULT_VARIABLE _status + OUTPUT_VARIABLE _output + OUTPUT_STRIP_TRAILING_WHITESPACE) + + string (REGEX REPLACE ".*\\(GNU Guile\\)[\t ]+([0-9]+)\\..*" "\\1" + _guile_ver_major "${_output}") + + string (REGEX REPLACE ".*\\(GNU Guile\\)[\t ]+[0-9]+\\.([0-9]+).*" "\\1" + _guile_ver_minor "${_output}") + + string (REGEX REPLACE ".*\\(GNU Guile\\)[\t ]+[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" + _guile_ver_patch "${_output}") + + set (_version "${_guile_ver_major}.${_guile_ver_minor}.${_guile_ver_patch}") + + if (NOT Guile_FIND_QUIETLY) + if (NOT Guile_VERSION_STRING STREQUAL _version) + message (WARNING "FindGuile: Versions provided by library differs from the one provided by executable.") + endif () + + if (NOT _status STREQUAL "0") + message (WARNING "FindGuile: guile (1) process exited abnormally.") + endif () + endif () + + unset (_version) + unset (_status) + unset (_version) + unset (_guile_ver_major) + unset (_guile_ver_minor) + unset (_guile_ver_patch) +endif () + +find_package_handle_standard_args (GC + "FindGuile: Failed to find dependency GC." + Guile_GC_INCLUDE_DIR + Guile_GC_LIBRARY + Guile_GC_LIBRARIES + Guile_GC_LIBRARY_RELEASE) + +find_package_handle_standard_args (Guile + REQUIRED_VARS + Guile_INCLUDE_DIR + Guile_LIBRARY + Guile_LIBRARIES + Guile_LIBRARY_RELEASE + GC_FOUND + VERSION_VAR Guile_VERSION_STRING) + +if (Guile_FOUND) + list (APPEND Guile_INCLUDE_DIRS "${Guile_INCLUDE_DIR}" + "${Guile_GC_INCLUDE_DIR}") + + if (NOT TARGET Guile::Library AND NOT TARGET GC::Library) + add_library (Guile::GC::Library UNKNOWN IMPORTED) + set_property (TARGET Guile::GC::Library APPEND + PROPERTY IMPORTED_CONFIGURATIONS RELEASE) + + set_target_properties (Guile::GC::Library + PROPERTIES + INTERFACE_INCLUDE_DIRS + "${Guile_GC_INCLUDE_DIR}" + IMPORTED_LOCATION + "${Guile_GC_LIBRARY}" + IMPORTED_LOCATION_RELEASE + "${Guile_GC_LIBRARY_RELEASE}") + + add_library (Guile::Library UNKNOWN IMPORTED) + set_property (TARGET Guile::Library APPEND + PROPERTY IMPORTED_CONFIGURATIONS RELEASE) + set_property (TARGET Guile::Library APPEND + PROPERTY + INTERFACE_LINK_LIBRARIES + Guile::GC::Library) + + set_target_properties (Guile::Library + PROPERTIES + INTERFACE_INCLUDE_DIRSr + "${Guile_INCLUDE_DIR}" + IMPORTED_LOCATION "${Guile_LIBRARY}" + IMPORTED_LOCATION_RELEASE + "${Guile_LIBRARY_RELEASE}") + + set (Guile_LIBRARIES Guile::Library Guile::GC::Library) + endif () +endif () + +find_program(Guile_CONFIG_EXECUTABLE + NAMES guile-config + DOC "Guile configutration binary") + +if (Guile_CONFIG_EXECUTABLE) + execute_process (COMMAND ${Guile_CONFIG_EXECUTABLE} info prefix + OUTPUT_VARIABLE Guile_ROOT_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE) + + execute_process (COMMAND ${Guile_CONFIG_EXECUTABLE} info sitedir + OUTPUT_VARIABLE Guile_SITE_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE) + + execute_process (COMMAND ${Guile_CONFIG_EXECUTABLE} info extensiondir + OUTPUT_VARIABLE Guile_EXTENSION_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE) +endif () + +mark_as_advanced (Guile_EXECUTABLE + Guile_INCLUDE_DIR + Guile_LIBRARY + Guile_LIBRARY_RELEASE + Guile_GC_INCLUDE_DIR + Guile_GC_LIBRARY + Guile_GC_LIBRARY_RELEASE) |