openbsd-ports/lang/ruby/ruby.port.mk
jeremy 930db13bc9 Handle split of rspec port into subdirs. In MODRUBY_REGRESS, support
rspec 1 using rspec and rspec 2 using rspec2.  Additionally, add
support for ruby and testrb, calling the appropriate binary for the
ruby implementation.

Start checking sanity of MODRUBY_REGRESS entry, using a fatal error
if it is defined and doesn't contain a recognized word.

Instead of RAKE_REGRESS_TARGET and RSPEC_REGRESS_TARGET, just use
MODRUBY_REGRESS_TARGET for all cases.  On ruby 1.9, modifying the
environment to always look in the current directory for libraries
(the ruby 1.8 behavior), since many ports depend on that for regress.
Allow ports to set their own regress environment and current directory
using MODRUBY_REGRESS_ENV and MODRUBY_REGRESS_DIR.
2011-11-17 15:24:01 +00:00

460 lines
15 KiB
Makefile

# $OpenBSD: ruby.port.mk,v 1.48 2011/11/17 15:24:01 jeremy Exp $
# ruby module
CATEGORIES+= lang/ruby
# Whether the ruby module should automatically add FLAVORs.
# If left blank, does so only for gem and extconf ports.
.if ${CONFIGURE_STYLE:L:Mgem} || ${CONFIGURE_STYLE:L:Mextconf}
MODRUBY_HANDLE_FLAVORS ?= Yes
.else
MODRUBY_HANDLE_FLAVORS ?= No
.endif
# This allows you to build ruby 1.8, ruby 1.9, and jruby packages using
# the same port directory for gem and extconf based ports. It does this
# by adding FLAVORS automatically, unless FLAVORS are already defined
# or the port defines MODRUBY_REV to tie the port to a specific ruby
# version. For example, JDBC gem ports want to set MODRUBY_REV=jruby,
# since they don't work on ruby 1.8 or ruby 1.9.
.if !defined(MODRUBY_REV)
. if ${MODRUBY_HANDLE_FLAVORS:L:Myes}
. if !defined(FLAVORS)
FLAVORS?= ruby19 rbx jruby
. endif
# Instead of adding flavors to the end of the package name, we use
# different package stems for ruby 1.8, ruby 1.9, and jruby packages.
# ruby 1.8 uses the historical ruby-* package stem, ruby 1.9 uses
# ruby19-* and jruby uses jruby-*. In most cases, PKGNAME in the port
# should be set to the same as DISTNAME, and this will insert the
# correct package prefix.
FULLPKGNAME?= ${MODRUBY_PKG_PREFIX}-${PKGNAME}
# If the port can work on both ruby 1.9 and another version of ruby,
# and gem installs binaries for it, the binaries on ruby 1.9 are installed
# with a 19 suffix. GEM_BIN_SUFFIX should be added after such a filename
# in the PLIST so that the gem will correctly package on all supported
# versions of ruby. Because the rbx, jruby, and default FLAVORs all use
# same binary names but in different directories, GEM_MAN_SUFFIX is
# used for the man pages to avoid conflicts since all man files go
# in the same directory.
SUBST_VARS+= GEM_BIN_SUFFIX GEM_MAN_SUFFIX
FLAVOR?=
# Without a FLAVOR, assume the use of ruby 1.8.
. if empty(FLAVOR)
MODRUBY_REV= 1.8
# Check for conflicting FLAVORs and set MODRUBY_REV appropriately based
# on the FLAVOR.
. elif ${FLAVOR:L:Mruby19}
. if ${FLAVOR:L:Mjruby} || ${FLAVOR:L:Mrbx}
ERRORS+= "Fatal: Conflicting flavors used: ${FLAVOR}"
. endif
MODRUBY_REV= 1.9
. elif ${FLAVOR:L:Mjruby}
. if ${FLAVOR:L:Mruby19} || ${FLAVOR:L:Mrbx}
ERRORS+= "Fatal: Conflicting flavors used: ${FLAVOR}"
. endif
MODRUBY_REV= jruby
. elif ${FLAVOR:L:Mrbx}
. if ${FLAVOR:L:Mruby19} || ${FLAVOR:L:Mjruby}
ERRORS+= "Fatal: Conflicting flavors used: ${FLAVOR}"
. endif
MODRUBY_REV= rbx
. endif
. endif
.endif
# Other non-gem and non-extconf based ruby ports should default to
# using ruby 1.8. Ports that require a different ruby version such
# set MODRUBY_REV in their makefile with either 1.9 or jruby to
# build on ruby 1.9 or jruby respectively.
MODRUBY_REV?= 1.8
# Have the man pages for the rbx and jruby versions of a gem file
# use an -rbx or -jruby suffix to avoid conflicts with the
# default ruby 1.8 man page.
GEM_MAN_SUFFIX = -${MODRUBY_FLAVOR}
# Use the FLAVOR as the prefix for the package, to avoid conflicts.
# Each of the FLAVORs defined in ruby.port.mk should be independent
# from the others if possible.
MODRUBY_PKG_PREFIX = ${MODRUBY_FLAVOR}
GEM_BIN_SUFFIX =
.if ${MODRUBY_REV} == 1.8
MODRUBY_LIBREV= 1.8
MODRUBY_BINREV= 18
MODRUBY_PKG_PREFIX= ruby
MODRUBY_FLAVOR =
GEM_MAN_SUFFIX =
.elif ${MODRUBY_REV} == 1.9
MODRUBY_LIBREV= 1.9.1
MODRUBY_BINREV= 19
MODRUBY_FLAVOR = ruby19
GEM_BIN_SUFFIX= 19
# Have the ruby 1.9 manpage match the binary name.
GEM_MAN_SUFFIX = ${GEM_BIN_SUFFIX}
.elif ${MODRUBY_REV} == jruby
MODRUBY_LIBREV= 1.8
# Set these during development of ruby.port.mk to make sure
# nothing is broken. However, turn them off before committing,
# since they result in bad error messages when, for example, an
# invalid flavor is used.
#.poison MODRUBY_BINREV
#.poison MODRUBY_WANTLIB
MODRUBY_FLAVOR = jruby
.elif ${MODRUBY_REV} == rbx
MODRUBY_LIBREV = 1.8
#.poison MODRUBY_BINREV
#.poison MODRUBY_WANTLIB
MODRUBY_FLAVOR = rbx
.endif
MODRUBY_RAKE_DEPENDS =
MODRUBY_RSPEC_DEPENDS = devel/ruby-rspec/1,${MODRUBY_FLAVOR}<2.0
MODRUBY_RSPEC2_DEPENDS = devel/ruby-rspec/rspec,${MODRUBY_FLAVOR}>=2.0
# Set the path for the ruby interpreter and the rake and rspec
# commands used by MODRUBY_REGRESS and manually in some port
# targets.
.if ${MODRUBY_REV} == jruby
RUBY= ${LOCALBASE}/jruby/bin/jruby
RAKE= ${RUBY} -S rake
RSPEC= ${RUBY} -S spec
MODRUBY_BIN_RSPEC = ${RUBY} -S rspec
MODRUBY_BIN_TESTRB = ${RUBY} -S testrb
# Without this, JRuby often fails with a memory error.
MAKE_ENV+= JAVA_MEM='-Xms256m -Xmx256m'
.elif ${MODRUBY_REV} == rbx
RUBY= ${LOCALBASE}/bin/rbx
RAKE= ${RUBY} -S rake
RSPEC= ${RUBY} -S spec
MODRUBY_BIN_RSPEC = ${RUBY} -S rspec
MODRUBY_BIN_TESTRB = ${RUBY} -S testrb
.else
RUBY= ${LOCALBASE}/bin/ruby${MODRUBY_BINREV}
RAKE= ${LOCALBASE}/bin/rake${MODRUBY_BINREV}
MODRUBY_BIN_TESTRB = ${LOCALBASE}/bin/testrb${MODRUBY_BINREV}
. if ${MODRUBY_REV} == 1.8
MODRUBY_RAKE_DEPENDS = devel/ruby-rake
RSPEC= ${LOCALBASE}/bin/spec
MODRUBY_BIN_RSPEC = ${LOCALBASE}/bin/rspec
. else
RSPEC= ${LOCALBASE}/bin/spec${MODRUBY_BINREV}
MODRUBY_BIN_RSPEC = ${LOCALBASE}/bin/rspec${MODRUBY_BINREV}
. endif
.endif
.if defined(MODRUBY_REGRESS) && !${MODRUBY_REGRESS:L:Mrspec} && \
!${MODRUBY_REGRESS:L:Mrspec2} && !${MODRUBY_REGRESS:L:Mrake} && \
!${MODRUBY_REGRESS:L:Mruby} && !${MODRUBY_REGRESS:L:Mtestrb}
ERRORS += "Fatal: Unsupported MODRUBY_REGRESS value: ${MODRUBY_REGRESS}"
.else
MODRUBY_REGRESS?=
.endif
.if ${MODRUBY_REV} == jruby
. if ${CONFIGURE_STYLE:L:Mext} || ${CONFIGURE_STYLE:L:Mextconf}
# Only jruby 1.6.0+ can build C extensions
MODRUBY_RUN_DEPENDS= lang/jruby>=1.6.0
. else
MODRUBY_RUN_DEPENDS= lang/jruby
. endif
.elif ${MODRUBY_REV} == rbx
MODRUBY_RUN_DEPENDS= lang/rubinius
.else
MODRUBY_WANTLIB= ruby${MODRUBY_BINREV}
MODRUBY_RUN_DEPENDS= lang/ruby/${MODRUBY_REV}
.endif
MODRUBY_LIB_DEPENDS= ${MODRUBY_RUN_DEPENDS}
MODRUBY_BUILD_DEPENDS= ${MODRUBY_RUN_DEPENDS}
.if ${MODRUBY_REV} == 1.8
MODRUBY_ICONV_DEPENDS= ruby-iconv->=1.8,<1.9:lang/ruby/${MODRUBY_REV},-iconv
.else
MODRUBY_ICONV_DEPENDS= ${MODRUBY_RUN_DEPENDS}
.endif
# location of ruby libraries
.if ${MODRUBY_REV} == jruby
MODRUBY_LIBDIR= ${LOCALBASE}/jruby/lib/ruby
.elif ${MODRUBY_REV} == rbx
MODRUBY_LIBDIR= ${LOCALBASE}/lib/rubinius
.else
MODRUBY_LIBDIR= ${LOCALBASE}/lib/ruby
.endif
# common directories for ruby extensions
# used to create docs and examples install path
MODRUBY_RELDOCDIR= share/doc/${MODRUBY_PKG_PREFIX}
MODRUBY_RELEXAMPLEDIR= share/examples/${MODRUBY_PKG_PREFIX}
MODRUBY_DOCDIR= ${PREFIX}/${MODRUBY_RELDOCDIR}
MODRUBY_EXAMPLEDIR= ${PREFIX}/${MODRUBY_RELEXAMPLEDIR}
SUBST_VARS += ^MODRUBY_RELDOCDIR ^MODRUBY_RELEXAMPLEDIR
.if ${MODRUBY_REV} == jruby
MODRUBY_ARCH= ${MACHINE_ARCH:S/amd64/x86_64/}-java
MODRUBY_SITEDIR = jruby/lib/ruby/site_ruby/${MODRUBY_LIBREV}
MODRUBY_SITEARCHDIR = ${MODRUBY_SITEDIR}/java
.elif ${MODRUBY_REV} == rbx
MODRUBY_ARCH= ${MACHINE_ARCH}-openbsd
MODRUBY_SITEDIR = lib/rubinius/site/
MODRUBY_SITEARCHDIR = ${MODRUBY_SITEDIR}/${MODRUBY_ARCH}
.else
MODRUBY_ARCH= ${MACHINE_ARCH:S/amd64/x86_64/}-openbsd
MODRUBY_SITEDIR = lib/ruby/site_ruby/${MODRUBY_LIBREV}
MODRUBY_SITEARCHDIR = ${MODRUBY_SITEDIR}/${MODRUBY_ARCH}
.endif
# Assume that we want to automatically add ruby to BUILD_DEPENDS
# and RUN_DEPENDS unless the port specifically requests not to.
MODRUBY_BUILDDEP?= Yes
MODRUBY_RUNDEP?= Yes
.if ${NO_BUILD:L} == no && ${MODRUBY_BUILDDEP:L} == yes
BUILD_DEPENDS+= ${MODRUBY_BUILD_DEPENDS}
.endif
.if ${MODRUBY_RUNDEP:L} == yes
RUN_DEPENDS+= ${MODRUBY_RUN_DEPENDS}
.endif
.if ${MODRUBY_REGRESS:L:Mrake}
REGRESS_DEPENDS+= ${MODRUBY_RAKE_DEPENDS}
.endif
.if ${MODRUBY_REGRESS:L:Mrspec}
REGRESS_DEPENDS+= ${MODRUBY_RSPEC_DEPENDS}
.endif
.if ${MODRUBY_REGRESS:L:Mrspec2}
REGRESS_DEPENDS+= ${MODRUBY_RSPEC2_DEPENDS}
.endif
MODRUBY_RUBY_ADJ= perl -pi -e 's,/usr/bin/env ruby,${RUBY},'
MODRUBY_ADJ_FILES?=
.if !empty(MODRUBY_ADJ_FILES)
MODRUBY_ADJ_REPLACE= for pat in ${MODRUBY_ADJ_FILES:QL}; do \
find ${WRKSRC} -type f -name "$$pat" -print0 | \
xargs -0r ${MODRUBY_RUBY_ADJ} ; \
done
. if !target(pre-configure)
pre-configure:
${MODRUBY_ADJ_REPLACE}
. endif
.endif
.if ${CONFIGURE_STYLE:L:Mext} || ${CONFIGURE_STYLE:L:Mextconf}
# Ruby C exensions are specific to an arch and are loaded as
# shared libraries (not compiled into ruby), so set SHARED_ONLY
# and make sure PKG_ARCH=* is not set.
. if defined(PKG_ARCH) && ${PKG_ARCH} == *
ERRORS+= "Fatal: Should not have PKG_ARCH=* when compiling extensions"
. endif
SHARED_ONLY= Yes
# All ruby C extensions are dependent on libc and ruby's library, and almost
# all are also dependment on libm, so include c, m, and ruby's library by
# default, but let the port maintainer opt out of libm by setting
# MODRUBY_WANTLIB_m=No.
WANTLIB+= c ${MODRUBY_WANTLIB}
MODRUBY_WANTLIB_m?= Yes
. if ${MODRUBY_WANTLIB_m:L:Myes}
WANTLIB+= m
. endif
LIB_DEPENDS+= ${MODRUBY_LIB_DEPENDS}
. if ${MODRUBY_REV} == rbx
# Tighten dependency on rubinius when a C extension is used. Rubinius
# does not maintain binary compatibility across minor versions.
MODRUBY_RUN_DEPENDS = lang/rubinius>=1.2,<1.3
. endif
.endif
.if ${CONFIGURE_STYLE:L:Mextconf}
CONFIGURE_STYLE= simple
CONFIGURE_SCRIPT= ${RUBY} extconf.rb
.elif ${CONFIGURE_STYLE:L:Mgem}
# All gems should be in the same directory on rubygems.org.
MASTER_SITES?= ${MASTER_SITE_RUBYGEMS}
EXTRACT_SUFX= .gem
# Require versions that no longer create the .require_paths files.
. if ${MODRUBY_REV} == 1.8
BUILD_DEPENDS+= devel/ruby-gems>=1.8.10
RUN_DEPENDS+= devel/ruby-gems>=1.3.7p0
. elif ${MODRUBY_REV} == 1.9
BUILD_DEPENDS+= lang/ruby/1.9>=1.9.3.0
. elif ${MODRUBY_REV} == jruby
BUILD_DEPENDS+= lang/jruby>=1.6.5
. elif ${MODRUBY_REV} == rbx
BUILD_DEPENDS+= lang/rubinius>=1.2.4p2
. endif
# Just like all ruby C extensions should set SHARED_ONLY,
# pure ruby gem ports without C extensions should definitely not
# set SHARED_ONLY, and they are arch-independent.
. if !${CONFIGURE_STYLE:L:Mext}
. if defined(SHARED_ONLY) && ${SHARED_ONLY:L:Myes}
ERRORS+= "Fatal: Pure ruby gems without ext CONFIGURE_STYLE should not \
have SHARED_ONLY=Yes"
. endif
PKG_ARCH= *
. endif
# PLIST magic. Set variables so that the same PLIST will work for
# both ruby 1.8, ruby 1.9, and jruby.
SUBST_VARS+= ^GEM_LIB ^GEM_BIN DISTNAME
. if ${MODRUBY_REV} == jruby
GEM= ${RUBY} -S gem
GEM_BIN = jruby/bin
GEM_LIB = jruby/lib/ruby/gems/${MODRUBY_LIBREV}
GEM_BASE_LIB= ${GEM_BASE}/jruby/${MODRUBY_LIBREV}
. elif ${MODRUBY_REV} == rbx
GEM= ${RUBY} -S gem
GEM_BASE_LIB= ${GEM_BASE}/rbx/${MODRUBY_LIBREV}
GEM_BIN = lib/rubinius/gems/bin
GEM_LIB = lib/rubinius/gems/${MODRUBY_LIBREV}
. else
GEM= ${LOCALBASE}/bin/gem${MODRUBY_BINREV}
GEM_BIN = bin
GEM_LIB = lib/ruby/gems/${MODRUBY_LIBREV}
GEM_BASE_LIB= ${GEM_BASE}/ruby/${MODRUBY_LIBREV}
. endif
GEM_BASE= ${WRKDIR}/gem-tmp/.gem
GEM_ABS_PATH= ${PREFIX}/${GEM_LIB}
GEM_BASE_BIN= ${GEM_BASE_LIB}/bin
# We purposely do not install documentation for ruby gems, because
# the filenames are generated differently on different ruby versions,
# and most use 1 file per method, which is insane.
GEM_FLAGS= --local --no-rdoc --no-ri --no-force --verbose --backtrace \
--user-install
_GEM_CONTENT= ${WRKDIR}/gem-content
_GEM_DATAFILE= ${_GEM_CONTENT}/data.tar.gz
_GEM_PATCHED= ${DISTNAME}${EXTRACT_SUFX}
. if ${CONFIGURE_STYLE:L:Mformat-executable}
GEM_FLAGS+= --format-executable
. endif
# Unpack the gem into WRKDIST so it can be patched. Include the gem metadata
# under WRKDIST so it can be patched easily to remove or change dependencies.
# Remove any signing of packages, as patching the gem could then break the
# signatures.
MODRUBY_EXTRACT_TARGET = \
mkdir -p ${WRKDIST} ${_GEM_CONTENT}; \
cd ${_GEM_CONTENT} && tar -xf ${FULLDISTDIR}/${DISTNAME}${EXTRACT_SUFX}; \
cd ${WRKDIST} && tar -xzf ${_GEM_DATAFILE} && rm ${_GEM_DATAFILE}; \
gzcat ${_GEM_CONTENT}/metadata.gz > ${WRKDIST}/.metadata; \
rm -f ${_GEM_CONTENT}/*.gz.sig
# Rebuild the gem manually after possible patching, then install it to a
# temporary directory (not the final directory under fake, since that would
# require root access and building C extensions as root).
MODRUBY_BUILD_TARGET = \
if [ -f ${WRKDIST}/.metadata ]; then \
cd ${WRKDIST} && gzip .metadata && \
mv .metadata.gz ${_GEM_CONTENT}/metadata.gz; \
fi; \
cd ${WRKDIST} && find . -type f \! -name '*.orig' -print | \
pax -wz -s '/^\.\///' -f ${_GEM_DATAFILE}; \
cd ${_GEM_CONTENT} && tar -cf ${WRKDIR}/${_GEM_PATCHED} *.gz; \
mkdir -p ${GEM_BASE}; \
env -i ${MAKE_ENV} HOME=${GEM_BASE}/.. GEM_HOME=${GEM_BASE} \
${GEM} install ${GEM_FLAGS} ${WRKDIR}/${_GEM_PATCHED} \
-- ${CONFIGURE_ARGS}
# Take the temporary gem directory, install the binary stub files to
# the appropriate directory, and move and fix ownership the gem library
# files.
MODRUBY_INSTALL_TARGET = \
if [ -d ${GEM_BASE_BIN} ]; then \
${INSTALL_DATA_DIR} ${PREFIX}/${GEM_BIN}; \
for f in ${GEM_BASE_BIN}/*; do \
${INSTALL_SCRIPT} $$f ${PREFIX}/${GEM_BIN}; \
done; \
rm -r ${GEM_BASE_BIN}; \
fi; \
${INSTALL_DATA_DIR} ${GEM_ABS_PATH}; \
cd ${GEM_BASE_LIB} && mv * ${GEM_ABS_PATH}; \
chown -R ${SHAREOWN}:${SHAREGRP} ${GEM_ABS_PATH}
. if !target(do-extract)
do-extract:
${MODRUBY_EXTRACT_TARGET}
. endif
. if !target(do-build)
do-build:
${MODRUBY_BUILD_TARGET}
. endif
. if !target(do-install)
do-install:
${MODRUBY_INSTALL_TARGET}
. endif
.elif ${CONFIGURE_STYLE:L:Msetup}
MODRUBY_configure= \
cd ${WRKSRC}; ${SETENV} ${CONFIGURE_ENV} ${RUBY} setup.rb config \
--prefix=${PREFIX} ${CONFIGURE_ARGS};
MODRUBY_BUILD_TARGET = \
cd ${WRKSRC} && ${SETENV} ${MAKE_ENV} ${RUBY} setup.rb setup
MODRUBY_INSTALL_TARGET = \
cd ${WRKSRC} && ${SETENV} ${MAKE_ENV} ${RUBY} setup.rb install \
--prefix=${DESTDIR}
. if !target(do-build)
do-build:
${MODRUBY_BUILD_TARGET}
. endif
. if !target(do-install)
do-install:
${MODRUBY_INSTALL_TARGET}
. endif
.endif
# These are mostly used by the non-gem ports.
SUBST_VARS+= ^MODRUBY_SITEARCHDIR ^MODRUBY_SITEDIR MODRUBY_LIBREV \
MODRUBY_ARCH
# regression stuff
.if !empty(MODRUBY_REGRESS)
. if !target(do-regress)
. if ${MODRUBY_REGRESS:L:Mrake}
MODRUBY_REGRESS_BIN ?= ${RAKE} --trace
. elif ${MODRUBY_REGRESS:L:Mrspec}
MODRUBY_REGRESS_BIN ?= ${RSPEC}
. elif ${MODRUBY_REGRESS:L:Mrspec2}
MODRUBY_REGRESS_BIN ?= ${MODRUBY_BIN_RSPEC}
. elif ${MODRUBY_REGRESS:L:Mtestrb}
MODRUBY_REGRESS_BIN ?= ${MODRUBY_BIN_TESTRB}
. elif ${MODRUBY_REGRESS:L:Mruby}
MODRUBY_REGRESS_BIN ?= ${RUBY}
. endif
. if ${MODRUBY_REGRESS:L:Mrspec} || ${MODRUBY_REGRESS:L:Mrspec2}
MODRUBY_REGRESS_TARGET ?= spec
. else
MODRUBY_REGRESS_TARGET ?= test
. endif
MODRUBY_REGRESS_ENV ?=
. if ${MODRUBY_REV} == 1.9
MODRUBY_REGRESS_ENV += RUBYLIB=.:"$$RUBYLIB"
. endif
MODRUBY_REGRESS_DIR ?= ${WRKSRC}
do-regress:
cd ${MODRUBY_REGRESS_DIR} && ${SETENV} ${MAKE_ENV} HOME=${WRKBUILD} \
${MODRUBY_REGRESS_ENV} ${MODRUBY_REGRESS_BIN} \
${MODRUBY_REGRESS_TARGET}
. endif
.endif