| # Copyright 1999-2014 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| # $Id$ |
| |
| # @ECLASS: portability.eclass |
| # @MAINTAINER: |
| # base-system@gentoo.org |
| # @AUTHOR: |
| # Diego Pettenò <flameeyes@gentoo.org> |
| # @BLURB: This eclass is created to avoid using non-portable GNUisms inside ebuilds |
| |
| if [[ -z ${_PORTABILITY_ECLASS} ]]; then |
| _PORTABILITY_ECLASS=1 |
| |
| # @FUNCTION: treecopy |
| # @USAGE: <orig1> [orig2 orig3 ....] <dest> |
| # @RETURN: |
| # @DESCRIPTION: |
| # mimic cp --parents copy, but working on BSD userland as well |
| treecopy() { |
| local dest=${!#} |
| local files_count=$# |
| |
| while (( $# > 1 )); do |
| local dirstruct=$(dirname "$1") |
| mkdir -p "${dest}/${dirstruct}" || die |
| cp -pPR "$1" "${dest}/${dirstruct}" || die |
| |
| shift |
| done |
| } |
| |
| # @FUNCTION: seq |
| # @USAGE: [min] <max> [step] |
| # @RETURN: sequence from min to max regardless of seq command being present on system |
| # @DESCRIPTION: |
| # compatibility function that mimes seq command if not available |
| seq() { |
| # First try `seq` |
| local p=$(type -P seq) |
| if [[ -n ${p} ]] ; then |
| "${p}" "$@" || die |
| return $? |
| fi |
| |
| local min max step |
| case $# in |
| 1) min=1 max=$1 step=1 ;; |
| 2) min=$1 max=$2 step=1 ;; |
| 3) min=$1 max=$3 step=$2 ;; |
| *) die "seq called with wrong number of arguments" ;; |
| esac |
| |
| # Then try `jot` |
| p=$(type -P jot) |
| if [[ -n ${p} ]] ; then |
| local reps |
| # BSD userland |
| if [[ ${step} != 0 ]] ; then |
| reps=$(( (max - min) / step + 1 )) |
| else |
| reps=0 |
| fi |
| |
| jot $reps $min $max $step || die |
| return $? |
| fi |
| |
| # Screw it, do the output ourselves |
| while :; do |
| [[ $max < $min && $step > 0 ]] && break |
| [[ $min < $max && $step < 0 ]] && break |
| echo $min |
| : $(( min += step )) |
| done |
| return 0 |
| } |
| |
| # @FUNCTION: dlopen_lib |
| # @USAGE: |
| # @RETURN: linker flag if needed |
| # @DESCRIPTION: |
| # Gets the linker flag to link to dlopen() function |
| dlopen_lib() { |
| # - Solaris needs nothing |
| # - Darwin needs nothing |
| # - *BSD needs nothing |
| # - Linux needs -ldl (glibc and uclibc) |
| # - Interix needs -ldl |
| case "${CHOST}" in |
| *-linux-gnu*|*-linux-uclibc|*-interix*) |
| echo "-ldl" |
| ;; |
| esac |
| } |
| |
| # @FUNCTION: get_bmake |
| # @USAGE: |
| # @RETURN: system version of make |
| # @DESCRIPTION: |
| # Gets the name of the BSD-ish make command (pmake from NetBSD) |
| # |
| # This will return make (provided by system packages) for BSD userlands, |
| # or bsdmake for Darwin userlands and pmake for the rest of userlands, |
| # both of which are provided by sys-devel/pmake package. |
| # |
| # Note: the bsdmake for Darwin userland is with compatibility with MacOSX |
| # default name. |
| get_bmake() { |
| if [[ ${USERLAND} == *BSD ]]; then |
| echo make |
| elif [[ ${USERLAND} == "Darwin" ]]; then |
| echo bsdmake |
| else |
| echo pmake |
| fi |
| } |
| |
| # @FUNCTION: get_mounts |
| # @USAGE: |
| # @RETURN: table of mounts in form "point node fs opts" |
| # @MAINTAINER: |
| # @DESCRIPTION: |
| # Portable method of getting mount names and points. |
| # Returns as "point node fs options" |
| # Remember to convert 040 back to a space. |
| get_mounts() { |
| local point= node= fs= opts= foo= |
| |
| # Linux has /proc/mounts which should always exist |
| if [[ $(uname -s) == "Linux" ]] ; then |
| while read node point fs opts foo ; do |
| echo "${point} ${node} ${fs} ${opts}" |
| done < /proc/mounts |
| return |
| fi |
| |
| # OK, pray we have a -p option that outputs mounts in fstab format |
| # using tabs as the seperator. |
| # Then pray that there are no tabs in the either. |
| # Currently only FreeBSD supports this and the other BSDs will |
| # have to be patched. |
| # Athough the BSD's may support /proc, they do NOT put \040 in place |
| # of the spaces and we should not force a /proc either. |
| local IFS=$'\t' |
| LC_ALL=C mount -p | while read node point fs foo ; do |
| opts=${fs#* } |
| fs=${fs%% *} |
| echo "${point// /\040} ${node// /\040} ${fs%% *} ${opts// /\040}" |
| done |
| } |
| |
| _dead_portability_user_funcs() { die "if you really need this, please file a bug for base-system@gentoo.org"; } |
| is-login-disabled() { _dead_portability_user_funcs; } |
| |
| fi |