# Copyright (c) 2008, 2014, 2025 OpenCog.org (http://opencog.org)
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
# - Try to find Guile using pkg-config; Once done this will define
#
# GUILE_FOUND - system has the GUILE library
# GUILE_INCLUDE_DIRS - the GUILE include directory
# GUILE_LIBRARIES - The libraries needed to use GUILE
FIND_PACKAGE(PkgConfig)
# Try guile-3.0 first, then 2.2
PKG_CHECK_MODULES(GUILE guile-3.0 QUIET)
IF(NOT GUILE_FOUND)
PKG_CHECK_MODULES(GUILE guile-2.2 QUIET)
ENDIF()
IF(GUILE_FOUND)
# pkg-config sets GUILE_INCLUDE_DIRS and GUILE_LIBRARIES
# but we also need GUILE_INCLUDE_DIR (singular) for version check
LIST(GET GUILE_INCLUDE_DIRS 0 GUILE_INCLUDE_DIR)
ENDIF()
# Check guile's version from the header file
IF(GUILE_INCLUDE_DIR)
SET(GUILE_VERSION_MAJOR 0)
SET(GUILE_VERSION_MINOR 0)
SET(GUILE_VERSION_PATCH 0)
IF(NOT EXISTS "${GUILE_INCLUDE_DIR}/libguile/version.h")
MESSAGE(FATAL_ERROR "Found ${GUILE_INCLUDE_DIR}/libguile.h but not version.h; check your guile installation!")
ENDIF()
# Extract the libguile version from the 'version.h' file
FILE(READ "${GUILE_INCLUDE_DIR}/libguile/version.h" _GUILE_VERSION_H_CONTENTS)
STRING(REGEX MATCH "#define SCM_MAJOR_VERSION[ ]+([0-9])" _MATCH "${_GUILE_VERSION_H_CONTENTS}")
SET(GUILE_VERSION_MAJOR ${CMAKE_MATCH_1})
STRING(REGEX MATCH "#define SCM_MINOR_VERSION[ ]+([0-9]+)" _MATCH "${_GUILE_VERSION_H_CONTENTS}")
SET(GUILE_VERSION_MINOR ${CMAKE_MATCH_1})
STRING(REGEX MATCH "#define SCM_MICRO_VERSION[ ]+([0-9]+)" _MATCH "${_GUILE_VERSION_H_CONTENTS}")
SET(GUILE_VERSION_PATCH ${CMAKE_MATCH_1})
SET(GUILE_VERSION "${GUILE_VERSION_MAJOR}.${GUILE_VERSION_MINOR}.${GUILE_VERSION_PATCH}")
# Check found version against required one
IF (DEFINED Guile_FIND_VERSION AND ${GUILE_VERSION} VERSION_LESS Guile_FIND_VERSION)
SET(GUILE_FOUND FALSE)
ENDIF ()
ENDIF()
IF (GUILE_FOUND AND GUILE_VERSION_MAJOR EQUAL 3)
ADD_DEFINITIONS(-DHAVE_GUILE3)
ENDIF ()
IF (GUILE_FOUND AND GUILE_VERSION_MAJOR EQUAL 2)
ADD_DEFINITIONS(-DHAVE_GUILE2)
IF (GUILE_VERSION_MINOR GREATER 0)
ADD_DEFINITIONS(-DHAVE_GUILE_2_2)
ENDIF ()
ENDIF ()
# Report the results.
IF(GUILE_FOUND)
IF(NOT GUILE_FIND_QUIETLY)
MESSAGE(STATUS "Guile ${GUILE_VERSION} was found at ${GUILE_INCLUDE_DIR}")
ENDIF()
ELSE()
SET(GUILE_DIR_MESSAGE "Guile was not found. Install guile-3.0-dev or guile-2.2-dev, or set GUILE_LIBRARY and GUILE_INCLUDE_DIR.")
IF(NOT GUILE_FIND_QUIETLY)
MESSAGE(STATUS "${GUILE_DIR_MESSAGE}")
ELSE()
IF(GUILE_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "${GUILE_DIR_MESSAGE}")
ENDIF()
ENDIF()
ENDIF()
MARK_AS_ADVANCED(GUILE_INCLUDE_DIR GUILE_LIBRARIES)