freebsd-ports/Mk/bsd.wx.mk
Mark Linimon d4842a4759 Add common code to support for WxWidgets based ports.
PR:		ports/89398
Submitted by:	alepulver
2006-07-05 02:13:12 +00:00

534 lines
16 KiB
Makefile

#-*- mode: makefile; tab-width: 4; -*-
# ex:ts=4
#
# $FreeBSD$
#
# bsd.wx.mk - Support for WxWidgets based ports.
#
# Created by: Alejandro Pulver <alepulver@FreeBSD.org>
#
# Please view me with 4 column tabs!
#
# The following variables can be defined in a port that uses the WxWidgets
# library, contributed libraries, WxPython and/or more WxWidgets related
# components (with run and/or build dependencies). It can be used after and/or
# before bsd.port.pre.mk, but Python components will only work if Python
# variables (e.g. USE_PYTHON) are defined before it (this is a bsd.python.mk
# limitation).
# USE_WX - Set to the list of WxWidgets versions that can be used by
# the port. The syntax allows the following elements:
# - Single version (e.g. "2.4").
# - Range of versions (e.g. "2.4-2.6"). Must be ascending.
# - Partial range: single version and upper (e.g. "2.4+").
# - Partial range: single version and lower (e.g. "-2.6").
# Multiple elements can be specified separated by spaces.
# USE_WX_NOT - Set to the list of WxWidgets versions that can't be used by
# the port. In other words, it removes some versions from
# USE_WX. If the latter is not defined, it will have the value
# of all the possible versions. The syntax is like USE_WX.
# WX_COMPS - Set to the list of WxWidgets components the port uses.
# Several components can be specified separated by spaces. By
# default it will have the value of "wx". Suffixes in the form
# "_xxx" may be added to the components to determine the
# dependency type.
# The available components are:
# wx - The WxWidgets library.
# contrib - The WxWidgets contributed libraries.
# python - The WxWidgets API for Python (WxPython).
# mozilla - WxMozilla (only for 2.4).
# svg - WxSVG (only for 2.6).
# The available dependency types are:
# build - Requires component for building.
# lib - Requires component for building and running.
# run - Requires component for running.
# If no suffix is present then "lib" will be used.
# WX_CONF_ARGS - Set to "absolute" or "relative" if the port needs configure
# arguments in addition to the WX_CONFIG environment variable.
# It determines the type of parameters that have to be passed
# to the configure script. In the first case it adds
# "--with-wx-config=${WX_CONFIG}" (absolute path of WX_CONFIG),
# and in second one "--with-wx=${X11BASE}" and
# "--with-wx-config=${WX_CONFIG:T} (prefix and name).
# WX_UNICODE - Set to "yes" (or anything) if the port needs the Unicode
# version of the WxWidgets library and/or contributed
# libraries.
# NOTE: this should NOT be used for ports that can be compiled
# with Unicode or not, but for the ones that require it. The
# first case is handled by the user variable WITH_UNICODE.
# WANT_WX - Set to "yes" or a valid single version (no ranges, etc).
# In both cases it will detect the installed WxWidgets
# components and add them to the variable HAVE_WX. If a
# version is selected, HAVE_WX will contain a list of
# components in the other case it will contain a list of
# "component-version" pairs (e.g. wx-2.6, contrib-2.4, etc).
# It has to be used before bsd.port.pre.mk.
# WANT_WX_VER - Set to the prefered WxWidgets version for the port. It must
# be present in USE_WX or missing in USE_WX_NOT. This is
# overriden by the user variable WITH_WX_VER if set. It can
# contain multiple versions in order of preference (last ones
# are tried first).
#
# The following variables are intended for the user and can be defined in
# make.conf.
# WITH_UNICODE - If the variable is defined and both the running FreeBSD
# version and the selected WxWidgets version support Unicode,
# then the Unicode version of WxWidgets is used.
# WITH_WX_VER - If the variable is defined the version it contains will be
# used as the default for ports that support multiple
# WxWidgets versions. It can contain multiple versions, and
# the last possible one will be used.
#
# The following variables are defined by this file, to be read from the port.
# WX_UNICODE - If this variable is not defined by the port (which means it
# requires the Unicode version of WxWidgets), it will be
# defined in the case the Unicode version is used (enabled by
# the user through WITH_UNICODE).
# WX_VERSION - The WxWidgets version that is going to be used.
# HAVE_WX - The list of WxWidgets components installed, if WANT_WX was
# defined. The components will have version suffix if it was
# set to "yes").
#
# Examples:
# - A port that needs WxWidgets 2.6 and contributed libraries with Unicode.
# USE_WX= 2.6
# WX_COMPS= wx contrib
# WX_UNICODE= yes
# - A port that needs WxPython 2.4 for running.
# USE_PYTHON= yes
# USE_WX= 2.4
# WX_COMPS= python_run
# - A port that needs WxPython 2.4 or 2.6 for building.
# USE_PYTHON= yes
# USE_WX= 2.4 2.6
# WX_COMPS= python_build
# - A port that needs WxWidgets version 2.4 or higher and contributed
# libraries.
# USE_WX= 2.4+
# WX_COMPS= wx contrib
# - A port that needs WxWidgets of any version other than 2.4.
# USE_WX_NOT= 2.4
#
# Notes:
# - The version is processed on each inclusion, so USE_WX, USE_WX_NOT and
# WX_UNICODE can be modified before and after including bsd.port.pre.mk.
# After determining the version and Unicode, WX_CONFIG will be defined.
#
WX_Include_MAINTAINER= alepulver@FreeBSD.org
#
# Global definitions.
#
.if !defined(_WX_Definitions_Done)
_WX_Definitions_Done= yes
#
# Common variables:
# _WX_COMPS_ALL - List of valid components.
# _WX_DEP_TYPES_ALL - List of valid dependency types.
# _WX_VERS_ALL - List of supported versions.
# _WX_VERS_UC_ALL - List of Unicode capable versions.
# _WX_CHANGE_VARS - List of variables allowed to change between pre and
# post inclusions (related to version).
# _WX_LISTS_ORDER - Reverse lists preference order.
# _WX_AUTO_VARS - Variables defined sometimes that may have to be
# redefined later.
#
_WX_COMPS_ALL= wx contrib python mozilla svg
_WX_DEP_TYPES_ALL= build lib run
_WX_VERS_ALL= 2.4 2.6
_WX_VERS_UC_ALL= 2.6
_WX_CHANGE_VARS= USE_WX USE_WX_NOT WX_UNICODE
_WX_LISTS_ORDER= _WX_VER_FINAL WANT_WX_VER WITH_WX_VER
_WX_AUTO_VARS= USE_WX WX_CONFIG
#
# Variables used to determine what is needed:
# _WX_PORT_comp_ver - Port directory.
# _WX_LIB_comp_ver - Name of the shared library (optional).
# _WX_SHVER_comp_ver - Shared library version (optional).
# _WX_FILE_comp_ver - File installed by that component.
#
_WX_PORT_wx_2.4= wxgtk24
_WX_LIB_wx_2.4= wx_gtk2-2.4
_WX_PORT_contrib_2.4= wxgtk24-contrib
_WX_LIB_contrib_2.4= wx_gtk2_canvas-2.4
_WX_PORT_python_2.4= py-wxPython24
_WX_FILE_python_2.4= ${PYTHON_SITELIBDIR}/wx/__init__.py
_WX_PORT_mozilla_2.4= wxmozilla
_WX_LIB_mozilla_2.4= wxmozilla_gtk2-2.4
_WX_PORT_wx_2.6= wxgtk26${_WX_UCL}
_WX_LIB_wx_2.6= wx_base${_WX_UC}-2.6
_WX_PORT_contrib_2.6= wxgtk26${_WX_UCL}-contrib
_WX_LIB_contrib_2.6= wx_gtk2${_WX_UC}_animate-2.6
_WX_PORT_python_2.6= py-wxPython26${_WX_UCL}
_WX_FILE_python_2.6= ${PYTHON_SITELIBDIR}/wx-2.6-gtk2${_WX_PYSUFX}/wx/__init__.py
_WX_PORT_svg_2.6= wxsvg
_WX_LIB_svg_2.6= wxsvg
# Set _WX_SHVER_comp_ver to 0 and _WX_FILE_comp_ver for libs appropiately.
.for comp in ${_WX_COMPS_ALL}
. for ver in ${_WX_VERS_ALL}
. if defined(_WX_LIB_${comp}_${ver})
_WX_SHVER_${comp}_${ver}= 0
_WX_FILE_${comp}_${ver}= ${X11BASE}/lib/lib${_WX_LIB_${comp}_${ver}}.so.${_WX_SHVER_${comp}_${ver}}
. endif
. endfor
.endfor
.endif # !_WX_Defined_Done
#
# Check for present components.
#
.if !defined(AFTERPORTMK) && defined(WANT_WX)
# Check if Unicode will be used.
. for __WANT_WX in ${WANT_WX}
. if defined(WITH_UNICODE) && ${OSVERSION} >= 500000 && \
(${_WX_VERS_UC_ALL:M${__WANT_WX}} != "" || ${WANT_WX:L} == "yes")
_WX_WANT_UNICODE= yes
. endif
. endfor
# These variables are reprocessed later so they won't affect other parts.
. if defined(WX_UNICODE) || defined(_WX_WANT_UNICODE)
_WX_VER_FINAL= ${_WX_VERS_UC_ALL}
_WX_UC= u
_WX_UCL= -unicode
_WX_PYSUFX= -unicode
. else
_WX_VER_FINAL= ${_WX_VERS_ALL}
_WX_UC= #
_WX_UCL= #
_WX_PYSUFX= -ansi
. endif
# Fill HAVE_WX with the installed components.
. for __WANT_WX in ${WANT_WX}
# Check if WANT_WX contains more than one word.
. if defined(HAVE_WX)
IGNORE?= selected multiple values for WANT_WX: ${WANT_WX}
. endif
HAVE_WX= #
# Check for all versions.
. if ${WANT_WX:L} == "yes"
. for comp in ${_WX_COMPS_ALL}
. for ver in ${_WX_VER_FINAL}
_WX_COMP= _WX_FILE_${comp}_${ver}
. if defined(${_WX_COMP}) && exists(${${_WX_COMP}})
HAVE_WX+= ${comp}-${ver}
. endif
. endfor
. endfor
# Check for a specific version.
. elif ${_WX_VERS_ALL:M${__WANT_WX}}
. for comp in ${_WX_COMPS_ALL}
. if exists(${_WX_FILE_${comp}_${__WANT_WX}})
HAVE_WX+= ${comp}
. endif
. endfor
. else
IGNORE?= selected an invalid value for WANT_WX: ${__WANT_WX}
. endif
. endfor
.endif # ! AFTERPORTMK && WANT_WX
#
# Check if the version has changed between inclusions.
#
.if defined(_WX_Version_Done)
. undef _WX_HAS_CHANGED
. for var in ${_WX_CHANGE_VARS}
. if (defined(${var}) && !defined(_WX_OLD_${var})) || \
(!defined(${var}) && defined(_WX_OLD_${var})) || \
(defined(_WX_OLD_${var}) && ${_WX_OLD_${var}} != ${${var}})
_WX_HAS_CHANGED= yes
. endif
. endfor
.endif # _WX_Version_Done
#
# Select WxWidgets version.
#
.if (!defined(_WX_Version_Done) || defined(_WX_HAS_CHANGED)) && \
(defined(USE_WX) || defined(USE_WX_NOT))
_WX_Version_Done= yes
# Handle automatic variables.
.for var in ${_WX_AUTO_VARS}
. if defined(_WX_${var}_DEFINED)
. undef ${var}
. endif
. if !defined(${var})
_WX_${var}_DEFINED= yes
. endif
.endfor
# Reset old variable values.
.if defined(_WX_HAS_CHANGED)
. undef _WX_VER
. undef _WX_IGNORE
.endif
# Set defaults (if one isn't present).
USE_WX?= ${_WX_VERS_ALL}
USE_WX_NOT?= #
#
# Make lists of valid and invalid versions.
#
# The following variables are used:
# _WX_VER_CHECK - If the version is a single one, express in a range.
# _WX_VER_MIN - Lower version of the range.
# _WX_VER_MAX - Higher version of the range.
# _WX_VER_LIST - List of requested versions.
# _WX_VER_NOT_LIST - List of disallowed versions.
# _WX_VER_MERGED - List of requested version without disallowed ones.
#
.for list in VER VER_NOT
_WX_${list}_LIST= #
. for ver in ${USE_WX${list:C/VER//}}
_WX_VER_CHECK:= ${ver:C/^([[:digit:]]+(\.[[:digit:]]+)*)$/\1-\1/}
_WX_VER_MIN:= ${_WX_VER_CHECK:C/([[:digit:]]+(\.[[:digit:]]+)*)[-+].*/\1/}
_WX_VER_MAX:= ${_WX_VER_CHECK:C/.*-([[:digit:]]+(\.[[:digit:]]+)*)/\1/}
# Minimum version not specified.
. if ${_WX_VER_MIN} == ${_WX_VER_CHECK}
. undef _WX_VER_MIN
. for v in ${_WX_VERS_ALL}
_WX_VER_MIN?= ${v}
. endfor
. endif
# Maximum version not specified.
. if ${_WX_VER_MAX} == ${_WX_VER_CHECK}
. for v in ${_WX_VERS_ALL}
_WX_VER_MAX= ${v}
. endfor
. endif
# Expand versions and add valid ones to each list.
. for v in ${_WX_VERS_ALL}
. if ${_WX_VER_MIN} <= ${v} && ${_WX_VER_MAX} >= ${v} && \
${_WX_${list}_LIST:M${v}} == ""
_WX_${list}_LIST+= ${v}
. endif
. endfor
. endfor
.endfor
# Merge the lists into a single list of valid versions.
_WX_VER_MERGED= #
.for ver in ${_WX_VER_LIST}
. if ${_WX_VER_NOT_LIST:M${ver}} == ""
_WX_VER_MERGED+= ${ver}
. endif
.endfor
# Check for a null version.
.if empty(_WX_VER_MERGED)
_WX_IGNORE?= selected a null or invalid WxWidgets version
.endif
#
# Unicode support.
#
# Create a list of capable versions.
_WX_VER_UC= #
.for ver in ${_WX_VER_MERGED}
. if ${_WX_VERS_UC_ALL:M${ver}} != ""
_WX_VER_UC+= ${ver}
. endif
.endfor
# Requested by the user (optional).
.if defined(WITH_UNICODE) && ${OSVERSION} >= 500000
. for ver in ${_WX_VER_UC}
. if ${_WX_VERS_UC_ALL:M${ver}} != ""
WX_UNICODE= yes
. endif
. endfor
.endif
# Requested by the port (mandatory).
.if defined(WX_UNICODE)
. if ${OSVERSION} < 500000
_WX_IGNORE?= requires FreeBSD versions >= 5.X (because of Unicode)
. elif empty(_WX_VER_UC)
_WX_IGNORE?= selected a WxWidgets version which does not support Unicode: ${_WX_VER_MERGED}
. endif
.endif
# Set Unicode variables.
.if defined(WX_UNICODE)
_WX_VER_FINAL= ${_WX_VER_UC}
_WX_UC= u
_WX_UCL= -unicode
_WX_PYSUFX= -unicode
.else
_WX_VER_FINAL= ${_WX_VER_MERGED}
_WX_UC= #
_WX_UCL= #
_WX_PYSUFX= -ansi
.endif
#
# Choose final version.
#
#
# Check for the following (in order):
# 1) WITH_WX_VER - User preference.
# 2) WANT_WX_VER - Port preference.
# 3) _WX_VER_FINAL - Available versions.
#
.for list in ${_WX_LISTS_ORDER}
. if defined(${list})
. for ver in ${${list}}
. if ${_WX_VER_FINAL:M${ver}} != ""
_WX_VER= ${ver}
. endif
. endfor
. endif
.endfor
#
# Set variables.
#
WX_VERSION= ${_WX_VER}
WX_CONFIG?= ${X11BASE}/bin/wxgtk2${_WX_UC}-${_WX_VER}-config
# Define old values for detecting changes.
.for var in ${_WX_CHANGE_VARS}
. if defined(${var})
_WX_OLD_${var}:= ${${var}}
. endif
.endfor
.endif # ! _WX_Version_Done || _WX_HAS_CHANGED
#
# Process components list and add dependencies, variables, etc.
#
.if !defined(BEFOREPORTMK)
# Error check.
.if defined(_WX_IGNORE)
IGNORE?= ${_WX_IGNORE}
.endif
#
# Component parsing.
#
# The variables used are:
# _WX_COMP - Component part.
# _WX_DEP_TYPE - Dependency type part.
# _WX_COMP_NEW - Component + dependency type.
# _WX_COMPS_FINAL - Final list of components with dependency types.
#
# Default components.
WX_COMPS?= wx
# Detect invalid and duplicated components.
_WX_COMPS_FINAL= #
.for comp in ${WX_COMPS}
_WX_COMP= ${comp:C/_([[:alpha:]]+)$//}
_WX_DEP_TYPE= ${comp:C/.+_([[:alpha:]]+)$/\1/}
. if ${_WX_COMP} == ${comp}
_WX_DEP_TYPE= lib
. endif
_WX_COMP_NEW= ${_WX_COMP}_${_WX_DEP_TYPE}
. for __WX_COMP in ${_WX_COMP}
. if ${_WX_COMPS_ALL:M${__WX_COMP}} == ""
IGNORE?= selected an invalid WxWidgets component: ${__WX_COMP}
. endif
. endfor
. for __WX_DEP_TYPE in ${_WX_DEP_TYPE}
. if ${_WX_DEP_TYPES_ALL:M${__WX_DEP_TYPE}} == ""
IGNORE?= selected an invalid WxWidgets dependency type: ${__WX_DEP_TYPE}
. endif
. endfor
. if !defined(_WX_PORT_${_WX_COMP}_${_WX_VER})
IGNORE?= selected a WxWidgets component (${_WX_COMP}) which is not available for the selected version (${_WX_VER})
. endif
. for newcomp in ${_WX_COMP_NEW}
. if ${_WX_COMPS_FINAL:M${newcomp}} == ""
_WX_COMPS_FINAL+= ${newcomp}
. endif
. endfor
.endfor
# Add dependencies.
#
# The variable used are:
# _WX_COMP - - Component part.
# _WX_DEP_TYPE - Dependency type part.
.for comp in ${_WX_COMPS_FINAL}
_WX_COMP= ${comp:C/_([[:alpha:]]+)$//}
_WX_DEP_TYPE= ${comp:C/.+_([[:alpha:]]+)$/\1/}
. if ${_WX_DEP_TYPE} == "lib"
. if defined(_WX_LIB_${_WX_COMP}_${_WX_VER})
LIB_DEPENDS+= ${_WX_LIB_${_WX_COMP}_${_WX_VER}}:${PORTSDIR}/x11-toolkits/${_WX_PORT_${_WX_COMP}_${_WX_VER}}
. else
BUILD_DEPENDS+= ${_WX_FILE_${_WX_COMP}_${_WX_VER}}:${PORTSDIR}/x11-toolkits/${_WX_PORT_${_WX_COMP}_${_WX_VER}}
RUN_DEPENDS+= ${_WX_FILE_${_WX_COMP}_${_WX_VER}}:${PORTSDIR}/x11-toolkits/${_WX_PORT_${_WX_COMP}_${_WX_VER}}
. endif
. else
${_WX_DEP_TYPE:U}_DEPENDS+= ${_WX_FILE_${_WX_COMP}_${_WX_VER}}:${PORTSDIR}/x11-toolkits/${_WX_PORT_${_WX_COMP}_${_WX_VER}}
. endif
.endfor
#
# Set build related variables.
#
MAKE_ENV+= WX_CONFIG=${WX_CONFIG}
CONFIGURE_ENV+= WX_CONFIG=${WX_CONFIG}
.if defined(WX_CONF_ARGS)
. if ${WX_CONF_ARGS:L} == "absolute"
CONFIGURE_ARGS+= --with-wx-config=${WX_CONFIG}
. elif ${WX_CONF_ARGS:L} == "relative"
CONFIGURE_ARGS+= --with-wx=${X11BASE} \
--with-wx-config=${WX_CONFIG:T}
. else
IGNORE?= selected an invalid WxWidgets configure argument type: ${WX_CONF_ARGS}
. endif
.endif
.endif # ! BEFOREPORTMK