mirror of
https://git.FreeBSD.org/ports.git
synced 2025-01-19 08:13:21 +00:00
94218d3a91
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
264 lines
8.3 KiB
Makefile
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
|