281 lines
9.4 KiB
Makefile
281 lines
9.4 KiB
Makefile
# ruby module
|
|
|
|
# Variables defined in this file that prefixed with _ are designed for
|
|
# internal use, not currently used in the ports tree outside this file,
|
|
# and are purposely not documented.
|
|
|
|
CATEGORIES+= lang/ruby
|
|
|
|
# Whether the ruby module should automatically add FLAVORs.
|
|
# If left blank, does so only for gem ports.
|
|
.if ${CONFIGURE_STYLE:L:Mgem}
|
|
MODRUBY_HANDLE_FLAVORS ?= Yes
|
|
.else
|
|
MODRUBY_HANDLE_FLAVORS ?= No
|
|
.endif
|
|
|
|
# This allows you to build packages for multiple ruby versions and
|
|
# implementations using the same port directory for gem
|
|
# 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.
|
|
.if !defined(MODRUBY_REV)
|
|
. if ${MODRUBY_HANDLE_FLAVORS:L:Myes}
|
|
|
|
# If ruby.pork.mk should handle FLAVORs, define a separate FLAVOR
|
|
# for each ruby version.
|
|
. if !defined(FLAVORS)
|
|
FLAVORS= ruby30 ruby31 ruby32
|
|
. endif
|
|
|
|
# Instead of adding flavors to the end of the package name, we use
|
|
# different package stems (rubyXY-*) for different ruby versions.
|
|
# 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 installs binary files or man pages and can work on multiple
|
|
# versions of ruby, those files should have the appropriate suffix so that
|
|
# they do not conflict. 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.
|
|
SUBST_VARS+= GEM_BIN_SUFFIX GEM_MAN_SUFFIX
|
|
|
|
FLAVOR?=
|
|
# Without a FLAVOR, assume the use of ruby 3.2.
|
|
. if empty(FLAVOR)
|
|
FLAVOR = ruby32
|
|
. endif
|
|
|
|
# Check for conflicting FLAVORs and set MODRUBY_REV appropriately based
|
|
# on the FLAVOR.
|
|
. for i in ruby30 ruby31 ruby32
|
|
. if ${FLAVOR:M$i}
|
|
MODRUBY_REV = ${i:C/ruby([0-9])/\1./}
|
|
. if ${FLAVOR:N$i:Mruby30} || \
|
|
${FLAVOR:N$i:Mruby31} || \
|
|
${FLAVOR:N$i:Mruby32}
|
|
ERRORS += "Fatal: Conflicting flavors used: ${FLAVOR}"
|
|
. endif
|
|
. endif
|
|
. endfor
|
|
. endif
|
|
.endif
|
|
|
|
# The default ruby version to use for non-gem ports. Defaults to ruby
|
|
# 3.2 for consistency with the default ruby32 FLAVOR for gem ports.
|
|
MODRUBY_REV?= 3.2
|
|
|
|
# Use the FLAVOR as the prefix for the package, to avoid conflicts.
|
|
MODRUBY_PKG_PREFIX = ${MODRUBY_FLAVOR}
|
|
|
|
GEM_BIN_SUFFIX = ${MODRUBY_BINREV}
|
|
GEM_MAN_SUFFIX = ${GEM_BIN_SUFFIX}
|
|
MODRUBY_ARCH= ${MACHINE_ARCH:S/amd64/x86_64/}-secbsd
|
|
MODRUBY_BINREV = ${MODRUBY_LIBREV:S/.//}
|
|
MODRUBY_BIN_RSPEC = ${LOCALBASE}/bin/rspec${MODRUBY_BINREV}
|
|
MODRUBY_FLAVOR = ruby${MODRUBY_BINREV}
|
|
MODRUBY_LIBREV = ${MODRUBY_REV}
|
|
MODRUBY_BUILD_DEPENDS= ${MODRUBY_RUN_DEPENDS}
|
|
MODRUBY_LIB_DEPENDS= ${MODRUBY_RUN_DEPENDS}
|
|
MODRUBY_RUN_DEPENDS= lang/ruby/${MODRUBY_REV}
|
|
MODRUBY_SITEARCHDIR = ${MODRUBY_SITEDIR}/${MODRUBY_ARCH}
|
|
MODRUBY_SITEDIR = lib/ruby/site_ruby/${MODRUBY_LIBREV}
|
|
MODRUBY_RELEXAMPLEDIR= share/examples/${MODRUBY_PKG_PREFIX}
|
|
MODRUBY_WANTLIB= ruby${MODRUBY_BINREV}
|
|
RAKE= ${LOCALBASE}/bin/rake${MODRUBY_BINREV}
|
|
RUBY= ${LOCALBASE}/bin/ruby${MODRUBY_BINREV}
|
|
|
|
_MODRUBY_RSPEC3_DEPENDS = devel/ruby-rspec/3/rspec,${MODRUBY_FLAVOR}>=3.0
|
|
|
|
.if defined(MODRUBY_TEST)
|
|
. if !${MODRUBY_TEST:L:Mrspec3} && !${MODRUBY_TEST:L:Mtestrb} && \
|
|
!${MODRUBY_TEST:L:Mrake} && !${MODRUBY_TEST:L:Mruby}
|
|
ERRORS += "Fatal: Unsupported MODRUBY_TEST value: ${MODRUBY_TEST}"
|
|
. endif
|
|
.else
|
|
. if ${CONFIGURE_STYLE:L:Mgem}
|
|
. if !target(do-test)
|
|
# Disable regress for gem ports, since they won't use make check for test.
|
|
NO_TEST = Yes
|
|
. endif
|
|
. endif
|
|
MODRUBY_TEST?=
|
|
.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_TEST:L:Mrspec3}
|
|
TEST_DEPENDS+= ${_MODRUBY_RSPEC3_DEPENDS}
|
|
.endif
|
|
|
|
MODRUBY_RUBY_ADJ = perl -pi \
|
|
-e '$$. == 1 && s|^.*env ruby.*$$|\#!${RUBY}|;' \
|
|
-e '$$. == 1 && s|^.*bin/ruby.*$$|\#!${RUBY}|;' \
|
|
-e 'close ARGV if eof;'
|
|
MODRUBY_ADJ_FILES?=
|
|
.if !empty(MODRUBY_ADJ_FILES)
|
|
MODRUBY_pre-configure +=for pat in ${MODRUBY_ADJ_FILES:QL}; do \
|
|
find ${WRKSRC} -type f -name "$$pat" \
|
|
-exec ${MODRUBY_RUBY_ADJ} {} + ; \
|
|
done
|
|
.endif
|
|
|
|
MODRUBY_WANTLIB+= c gmp m pthread
|
|
|
|
.if ${CONFIGURE_STYLE:L:Mext}
|
|
# Ruby C exensions are specific to an arch and are loaded as
|
|
# shared libraries (not compiled into ruby), so make sure PKG_ARCH=*
|
|
# is not set.
|
|
. if defined(PKG_ARCH) && ${PKG_ARCH} == *
|
|
ERRORS+= "Fatal: Should not have PKG_ARCH=* when compiling extensions"
|
|
. endif
|
|
|
|
# Add appropriate libraries to WANTLIB depending on ruby version and
|
|
# implementation
|
|
WANTLIB+= ${MODRUBY_WANTLIB}
|
|
LIB_DEPENDS+= ${MODRUBY_LIB_DEPENDS}
|
|
.endif
|
|
|
|
.if ${CONFIGURE_STYLE:L:Mgem}
|
|
# All gems should be in the same directory on rubygems.org.
|
|
SITES?= ${SITE_RUBYGEMS}
|
|
EXTRACT_SUFX= .gem
|
|
|
|
. if ${CONFIGURE_STYLE:L:Mext}
|
|
# Use ports-gcc for ruby32 extensions if base does not use clang
|
|
. if ${FLAVOR:Mruby32}
|
|
COMPILER ?= base-clang ports-gcc
|
|
COMPILER_LANGS ?= c
|
|
. endif
|
|
# Add build complete file to package so rubygems doesn't complain
|
|
# or build extensions at runtime
|
|
GEM_EXTENSIONS_DIR ?= ${GEM_LIB}/extensions/${MODRUBY_ARCH:S/i386/x86/}/${MODRUBY_REV}/${DISTNAME}
|
|
_GEM_EXTENSIONS_FILE ?= ${GEM_EXTENSIONS_DIR}/gem.build_complete
|
|
SUBST_VARS+= GEM_EXTENSIONS_DIR
|
|
PKG_ARGS+= -f ${PORTSDIR}/lang/ruby/rubygems-ext.PLIST
|
|
. else
|
|
# Pure ruby gem ports without C extensions are arch-independent.
|
|
PKG_ARCH= *
|
|
. endif
|
|
|
|
GEM= ${LOCALBASE}/bin/gem${MODRUBY_BINREV}
|
|
GEM_BIN = bin
|
|
GEM_LIB = lib/ruby/gems/${MODRUBY_LIBREV}
|
|
GEM_BASE_LIB= ${_GEM_BASE}/ruby/${MODRUBY_LIBREV}
|
|
_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 -N --no-force --verbose --backtrace --user-install
|
|
_GEM_CONTENT= ${WRKDIR}/gem-content
|
|
_GEM_DATAFILE= ${_GEM_CONTENT}/data.tar.gz
|
|
_GEM_PATCHED= ${DISTNAME}${EXTRACT_SUFX}
|
|
_GEM_MAKE= "make V=1"
|
|
|
|
# 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.
|
|
EXTRACT_CASES += *.gem) \
|
|
mkdir ${WRKDIST} ${_GEM_CONTENT}; \
|
|
cd ${_GEM_CONTENT} && tar -xf ${FULLDISTDIR}/$$archive; \
|
|
cd ${WRKDIST} && tar -xzf ${_GEM_DATAFILE} && rm -f ${_GEM_DATAFILE}; \
|
|
gzcat ${_GEM_CONTENT}/metadata.gz > ${WRKDIST}/.metadata; \
|
|
rm -f ${_GEM_CONTENT}/*.gz.sig ${_GEM_CONTENT}/checksums.yaml.gz;;
|
|
|
|
# Rebuild the gem manually after possible patching, then install it to a
|
|
# temporary directory (not the final directory under fake).
|
|
_MODRUBY_BUILD_TARGET = \
|
|
if [ -f ${WRKDIST}/.metadata ]; then \
|
|
cd ${WRKDIST} && gzip .metadata && \
|
|
mv -f .metadata.gz ${_GEM_CONTENT}/metadata.gz; \
|
|
fi; \
|
|
cd ${WRKDIST} && pax -wz -s '/.*${PATCHORIG:S@.@\.@g}$$//' \
|
|
-x ustar -o write_opt=nodir . >${_GEM_DATAFILE}; \
|
|
cd ${_GEM_CONTENT} && tar -cf ${WRKDIR}/${_GEM_PATCHED} *.gz; \
|
|
mkdir -p ${_GEM_BASE}; \
|
|
env -i ${MAKE_ENV} HOME=`dirname ${_GEM_BASE}` GEM_HOME=${_GEM_BASE} \
|
|
make=${_GEM_MAKE} \
|
|
${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}; \
|
|
if [ 'X' != "X${_GEM_EXTENSIONS_FILE}" ]; then \
|
|
mkdir -p ${PREFIX}/${GEM_EXTENSIONS_DIR}; \
|
|
touch ${PREFIX}/${_GEM_EXTENSIONS_FILE}; \
|
|
fi
|
|
chown -R ${SHAREOWN}:${SHAREGRP} ${_GEM_ABS_PATH}
|
|
|
|
. if !target(do-build)
|
|
do-build:
|
|
${_MODRUBY_BUILD_TARGET}
|
|
. endif
|
|
. if !target(do-install)
|
|
do-install:
|
|
${_MODRUBY_INSTALL_TARGET}
|
|
. endif
|
|
.endif
|
|
|
|
# PLIST magic. Set variables so that the same PLIST will work for
|
|
# all ruby versions and implementations.
|
|
SUBST_VARS += MODRUBY_RELEXAMPLEDIR MODRUBY_SITEARCHDIR MODRUBY_SITEDIR \
|
|
MODRUBY_LIBREV MODRUBY_ARCH GEM_LIB GEM_BIN DISTNAME
|
|
UPDATE_PLIST_ARGS += -s MODRUBY_RELEXAMPLEDIR -s MODRUBY_SITEARCHDIR \
|
|
-s MODRUBY_SITEDIR -s GEM_LIB -s GEM_BIN
|
|
|
|
# test stuff
|
|
|
|
.if !empty(MODRUBY_TEST)
|
|
. if !target(do-test)
|
|
|
|
. if ${MODRUBY_TEST:L:Mrake}
|
|
_MODRUBY_TEST_BIN ?= ${RAKE}
|
|
. elif ${MODRUBY_TEST:L:Mrspec3}
|
|
_MODRUBY_TEST_BIN ?= ${MODRUBY_BIN_RSPEC}
|
|
. elif ${MODRUBY_TEST:L:Mtestrb}
|
|
_MODRUBY_TEST_BIN ?= ${RUBY} ${PORTSDIR}/lang/ruby/files/testrb.rb
|
|
. elif ${MODRUBY_TEST:L:Mruby}
|
|
_MODRUBY_TEST_BIN ?= ${RUBY}
|
|
. endif
|
|
|
|
. if ${MODRUBY_TEST:L:Mrspec3}
|
|
MODRUBY_TEST_TARGET ?= spec
|
|
. else
|
|
MODRUBY_TEST_TARGET ?= test
|
|
. endif
|
|
|
|
MODRUBY_TEST_ENV ?=
|
|
MODRUBY_TEST_ENV += RUBYLIB=.:"$$RUBYLIB"
|
|
do-test:
|
|
cd ${WRKSRC} && ${SETENV} ${MAKE_ENV} HOME=${WRKBUILD} \
|
|
${MODRUBY_TEST_ENV} ${_MODRUBY_TEST_BIN} \
|
|
${MODRUBY_TEST_TARGET}
|
|
. endif
|
|
.endif
|