OverviewFilesCommitsIssuesDocsReleasesPeers

opencog-cogutil / cmake / FindGuile.cmake

82 lines · cmake ref:
# 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)