Edit

IABSD.fr/ports/lang/ruby/ruby.port.mk

Branch :

  • Show log

    Commit

  • Author : jeremy
    Date : 2023-09-11 19:59:04
    Hash : 527f5b18
    Message : Further simplify ruby.port.mk * Remove variables not used by any ports in the tree: * MODRUBY_LIBDIR * MODRUBY_RELDOCDIR * MODRUBY_DOCDIR * MODRUBY_EXAMPLEDIR * MODRUBY_ADJ_REPLACE * MODRUBY_TEST_DIR * Prefix internal variables with an underscore. Any variable not currently used by any ports in the tree has been made internal. * Consolidate all SUBST_VARS and UPDATE_PLIST_ARGS setting to a single case. Tested by building all ports using lang/ruby module.

  • lang/ruby/ruby.port.mk
  • # 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/}-openbsd
    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.
    MASTER_SITES?=	${MASTER_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