1
0
mirror of https://git.FreeBSD.org/ports.git synced 2025-01-19 08:13:21 +00:00
freebsd-ports/Mk/Uses/guile.mk
Andrew "RhodiumToad" Gierth 94218d3a91 Mk/Uses: Add guile.mk
This patch adds USES=guile[:options], a framework to permit the
concurrent installation of different guile versions, allowing
ports to specify which guile they need.

lang/guile is now a meta-port, installing the default guile version;
guile 3 is now shipped in lang/guile3.

A new port lang/guile-aclocal holds the guile.m4 file from guile3
to permit ports written against guile1 or guile2 to avoid conflicts.

PR:		260960
Reported by:	Martin Neubauer <m.ne@gmx.net>
Approved by:	bofh
Differential Revision:	https://reviews.freebsd.org/D40194
2023-07-31 01:59:04 +03:00

264 lines
8.3 KiB
Makefile

# Provide support for guile
#
# MAINTAINER: ports@FreeBSD.org
# Usage:
#
# USES+= guile[:options,...]
#
# Options:
#
# X.Y specify a Guile version, e.g. 2.2 or 3.0
#
# flavors define FLAVOR / FLAVORS as guileX from the allowed versions
#
# build add dependency to BUILD_DEPENDS instead of LIB_DEPENDS
# run add dependency to RUN_DEPENDS instead of LIB_DEPENDS
#
# env define only the GUIL[DE]_* vars and add them to PLIST_SUB,
# do not add dependencies or other global state
#
# alias add BINARY_ALIAS for guile tools
#
# conflicts add GUILE_NEWER_PKGS to CONFLICTS_BUILD, this tries to
# ensure that non-clean builds of programs that insist on
# using the latest available version (there are a surprising
# number of these) will fail if the selected version is wrong.
#
# noextra don't add _GUILE_EXTRA_LIB_DEPENDS
#
# nopkgconf don't add to PKGCONFIG_PATHS
#
# nocmds don't add GUILE_*CMD* to CONFIGURE_ENV and MAKE_ENV
# (but still define them)
#
# Variables defined for use by the port:
#
# GUILE_VER e.g. 2.2
# GUILE_SFX e.g. 2 (be careful, consider the possibility of 3.1)
# GUILE_FLAVOR e.g. guile22
# GUILE_PORT e.g. lang/guile2
# GUILE_CMD name of guile binary, e.g. guile-2.2
# GUILE_*_CMD name of guile-* binary (legacy)
# GUILD_CMD name of guild binary, e.g. guild-2.2
# GUIL*_CMDPATH full paths of commands
# GUILE_PKGCONFIG_DIR directory for version-specific .pc files
# (relative to PREFIX or LOCALBASE)
# GUILE_PREFIX
# GUILE_GLOBAL_SITE_DIR
# GUILE_SITE_DIR
# GUILE_SITE_CCACHE_DIR
# GUILE_DOCS_DIR where to put version-specific docs
# GUILE_EXAMPLES_DIR where to put version-specific examples
# GUILE_INFO_PATH a suitable value for INFO_PATH
#
# (the _DIR vars are relativized and added to PLIST_SUB without the
# _DIR suffix)
#
.if !defined(_INCLUDE_USES_GUILE_MK)
_INCLUDE_USES_GUILE_MK= yes
# When adding a version, please keep the comment in
# Mk/bsd.default-versions.mk in sync.
_GUILE_VALID_VERSIONS:= 1.8 2.2 3.0
. if defined(_GUILE_EXTRA_VER)
_GUILE_VALID_VERSIONS+= ${_GUILE_EXTRA_VER}
. endif
_GUILE_DEFAULT_VERSION:= ${GUILE_DEFAULT}
. if ! ${_GUILE_VALID_VERSIONS:M${_GUILE_DEFAULT_VERSION}}
IGNORE= Invalid default Guile version ${GUILE_DEFAULT}
. endif
# args. Allow a list of numeric versions
_GUILE_ARG_VERSIONS:= ${guile_ARGS:M[1-9].[0-9]}
# We anticipate which args will be almost universally required
# and define them negatively. In practice "alias" is needed a lot
# thanks to makefile assumptions, but it's intrusive enough that
# we require it to be stated explicitly.
_GUILE_ARG_NAMES:= flavors build run env alias conflicts \
noextra nopkgconf nocmds
# Define an 0/1 flag for each arg
. for _v in ${_GUILE_ARG_NAMES}
. if ${_v:Mno*}
_GUILE_ARG_${_v:tu:S/^NO//}:=${"${guile_ARGS:M${_v}}":?0:1}
. else
_GUILE_ARG_${_v:tu}:=${"${guile_ARGS:M${_v}}":?1:0}
. endif
. endfor
#
# Parse ver arguments
#
# If multiple versions are specified, we are either doing flavors (in
# which case we build them all) or we are supposed to pick just one, in
# which case we pick the default version if it was specified, otherwise
# the highest.
#
_GUILE_CHOSEN_VER:=
_GUILE_REQUESTED_VERS:=
# check args for validity first
. for _v in ${_GUILE_ARG_VERSIONS}
. if ! ${_GUILE_VALID_VERSIONS:M${_v}}
IGNORE= Invalid Guile version ${_v}
. else
_GUILE_REQUESTED_VERS+= ${_v}
. endif
. endfor
. if ${_GUILE_ARG_FLAVORS}
# default to all versions (unlikely in practice)
. if empty(_GUILE_REQUESTED_VERS)
_GUILE_REQUESTED_VERS:= ${_GUILE_VALID_VERSIONS}
. endif
# Note that we organize the FLAVORS list so that the
# first (default) one corresponds to the default version.
. if empty(FLAVORS)
FLAVORS=${_GUILE_DEFAULT_VERSION:S/.//:S/^/guile/} \
${_GUILE_REQUESTED_VERS:N${_GUILE_DEFAULT_VERSION}:S/.//:S/^/guile/}
. endif
# User may have specified this; we must respect that.
. if empty(FLAVOR)
FLAVOR= ${FLAVORS:[1]}
. endif
# Translate the selected (possibly by the user) flavor back to the
# corresponding Guile version.
_GUILE_CHOSEN_VER:= ${FLAVOR:S/^guile//:C/./&./}
. else # !${_GUILE_ARG_FLAVORS}
# default to default version
. if empty(_GUILE_REQUESTED_VERS)
_GUILE_REQUESTED_VERS:= ${_GUILE_DEFAULT_VERSION}
. endif
# Find default version, or highest. (We abuse alphabetic sort here.)
_GUILE_CHOSEN_VER:= ${_GUILE_REQUESTED_VERS:M${_GUILE_DEFAULT_VERSION}}
. if empty(_GUILE_CHOSEN_VER)
_GUILE_CHOSEN_VER:= ${_GUILE_REQUESTED_VERS:O:[-1]}
. endif
. endif # ${_GUILE_ARG_FLAVORS}
# _GUILE_CHOSEN_VER is now the desired version in all cases.
#
# The GUILE_VER / GUILE_SFX here is the existing usage, but if a
# version 3.1 comes along, that'll all need to be revisited. (So
# we discourage the use of GUILE_SFX for anything important.)
#
# GUILE_VER= 3.0 (for example)
# GUILE_SFX= 3
# GUILE_FLAVOR= guile30
#
# GUILE_OTHER/NEWER_PKGS is defined such that it can be placed in
# CONFLICTS_BUILD for ports that use non-overridable version searches.
# This gives a proper diagnostic for non-clean builds.
GUILE_VER= ${_GUILE_CHOSEN_VER}
GUILE_SFX= ${_GUILE_CHOSEN_VER:R}
GUILE_OTHER_PKGS:=${_GUILE_VALID_VERSIONS:@_v@${${_v} != ${_GUILE_CHOSEN_VER}:?guile${_v:R}:}@}
GUILE_NEWER_PKGS:=${_GUILE_VALID_VERSIONS:@_v@${${_v} > ${_GUILE_CHOSEN_VER}:?guile${_v:R}:}@}
. if ${_GUILE_ARG_CONFLICTS}
CONFLICTS_BUILD+=${GUILE_NEWER_PKGS}
. endif
GUILE_PORT= lang/guile${GUILE_SFX}
GUILE_FLAVOR= guile${GUILE_VER:S/.//}
GUILE_PREFIX= ${PREFIX}
GUILE_GLOBAL_SITE_DIR= ${GUILE_PREFIX}/share/guile/site
GUILE_SITE_DIR= ${GUILE_GLOBAL_SITE_DIR}/${GUILE_VER}
GUILE_SITE_CCACHE_DIR= ${GUILE_PREFIX}/lib/guile/${GUILE_VER}/site-ccache
GUILE_DOCS_DIR= ${GUILE_PREFIX}/share/doc/${GUILE_FLAVOR}
GUILE_EXAMPLES_DIR= ${GUILE_PREFIX}/share/examples/${GUILE_FLAVOR}
GUILE_INFO_PATH= share/info/guile${GUILE_SFX}
_GUILE_CMDNAMES:= guile guile-snarf guile-config guile-tools
. if ${GUILE_SFX} > 1
_GUILE_CMDNAMES+= guild
. endif
. for _c in ${_GUILE_CMDNAMES}
${_c:S/-/_/:tu}_CMD:= ${_c}-${GUILE_VER}
${_c:S/-/_/:tu}_CMDPATH:= ${LOCALBASE}/bin/${_c}-${GUILE_VER}
. endfor
PLIST_SUB+= GUILE_VER=${GUILE_VER} GUILE_SFX=${GUILE_SFX} \
GUILE_SITE=${GUILE_SITE_DIR:S,^${GUILE_PREFIX}/,,} \
GUILE_GLOBAL_SITE=${GUILE_GLOBAL_SITE_DIR:S,^${GUILE_PREFIX}/,,} \
GUILE_SITE_CCACHE=${GUILE_SITE_CCACHE_DIR:S,^${GUILE_PREFIX}/,,} \
GUILE_DOCS=${GUILE_DOCS_DIR:S,^${GUILE_PREFIX}/,,} \
GUILE_EXAMPLES=${GUILE_EXAMPLES_DIR:S,^${GUILE_PREFIX}/,,}
# This may reduce the need for BINARY_ALIAS
GUILE_ENV= ${_GUILE_CMDNAMES:tu:S/-/_/:@t@${t}=${${t}_CMDPATH}@}
# XXX XXX XXX
#
# This all assumes that the underlying Guile >= 2 is built with the
# threading option, which is on by default.
_GUILE_1.8_EXTRA_LIB_DEPENDS= \
libgmp.so:math/gmp \
libltdl.so:devel/libltdl
_GUILE_2.2_EXTRA_LIB_DEPENDS= \
libgc-threaded.so:devel/boehm-gc-threaded
_GUILE_3.0_EXTRA_LIB_DEPENDS= \
libgc-threaded.so:devel/boehm-gc-threaded
. if ${_GUILE_ARG_EXTRA}
_GUILE_EXTRA_LIB_DEPENDS= ${_GUILE_${GUILE_VER}_EXTRA_LIB_DEPENDS}
. else
_GUILE_EXTRA_LIB_DEPENDS?=
. endif
. if !${_GUILE_ARG_ENV}
. if ${_GUILE_ARG_BUILD}
BUILD_DEPENDS+= ${GUILE_CMD}:${GUILE_PORT}
. endif
. if ${_GUILE_ARG_RUN}
RUN_DEPENDS+= ${GUILE_CMD}:${GUILE_PORT}
. endif
. if !${_GUILE_ARG_BUILD} && !${_GUILE_ARG_RUN}
. if ${GUILE_SFX} > 1
LIB_DEPENDS+= libguile-${GUILE_VER}.so:${GUILE_PORT} ${_GUILE_EXTRA_LIB_DEPENDS}
. else
LIB_DEPENDS+= libguile.so:${GUILE_PORT} ${_GUILE_EXTRA_LIB_DEPENDS}
. endif
. endif
. if ${_GUILE_ARG_CMDS}
. if ${_GUILE_ARG_ALIAS}
# If we're doing binary-alias, then only add GUILE itself to the
# environment, not the build-only tools. This helps when dealing with
# broken configure scripts that respect e.g. GUILE_CONFIG but then
# barf on the output if the program name has a suffix.
CONFIGURE_ENV+= GUILE=${GUILE_CMDPATH}
MAKE_ENV+= GUILE=${GUILE_CMDPATH}
. else
CONFIGURE_ENV+= ${GUILE_ENV}
MAKE_ENV+= ${GUILE_ENV}
. endif
. endif # ${_GUILE_ARG_CMDS}
CONFIGURE_ENV+= GUILE_EFFECTIVE_VERSION=${GUILE_VER}
. endif # !${_GUILE_ARG_ENV}
. if ${_GUILE_ARG_ALIAS}
BINARY_ALIAS+= ${_GUILE_CMDNAMES:@t@${t}=${${t:tu:S/-/_/}_CMD}@}
. endif
. if ${_GUILE_ARG_PKGCONF}
GUILE_PKGCONFIG_DIR:= libdata/pkgconfig/guile/${GUILE_VER}
PKGCONFIG_PATHS+= ${LOCALBASE}/${GUILE_PKGCONFIG_DIR}
PLIST_SUB+= GUILE_PKGCONFIG_DIR=${GUILE_PKGCONFIG_DIR}
. endif
.endif