327 lines
8.6 KiB
CMake
327 lines
8.6 KiB
CMake
|
#[[.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)
|