| # Copyright 1999-2015 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| # $Id$ |
| # |
| # @MAINTAINER: |
| # maintainer-needed@gentoo.org |
| # @AUTHOR: |
| # Diego Pettenò <flameeyes@gentoo.org> |
| |
| inherit versionator eutils flag-o-matic bsdmk |
| |
| # Drop patch level from ${PV} |
| MY_PV=${PV/_p*} |
| PLEVEL=${PV##*_p} |
| |
| LICENSE="BSD" |
| HOMEPAGE="http://www.freebsd.org/" |
| |
| # Define global package names |
| LIB="freebsd-lib-${PV}" |
| BIN="freebsd-bin-${PV}" |
| CONTRIB="freebsd-contrib-${PV}" |
| SHARE="freebsd-share-${PV}" |
| UBIN="freebsd-ubin-${PV}" |
| USBIN="freebsd-usbin-${PV}" |
| CRYPTO="freebsd-crypto-${PV}" |
| LIBEXEC="freebsd-libexec-${PV}" |
| SBIN="freebsd-sbin-${PV}" |
| GNU="freebsd-gnu-${PV}" |
| ETC="freebsd-etc-${PV}" |
| SYS="freebsd-sys-${PV}" |
| INCLUDE="freebsd-include-${PV}" |
| RESCUE="freebsd-rescue-${PV}" |
| CDDL="freebsd-cddl-${PV}" |
| SECURE="freebsd-secure-${PV}" |
| |
| # Release version (5.3, 5.4, 6.0, etc) |
| RV="$(get_version_component_range 1-2 ${MY_PV})" |
| |
| # SVN ebuild support. |
| # 9.1.0.9999 --> release/9.1.0 |
| # 9.1.9999 --> releng/9.1 |
| # 9.9999 --> stable/9 |
| # 9999 --> head |
| # |
| # svn revision can be specified by patch level: |
| # freebsd-lib-9.9999_p247000 --> set svn -r 247000 |
| |
| if [[ ${MY_PV} == *9999* ]]; then |
| inherit subversion |
| |
| # Set SVN revision using patch level. |
| [[ ${PV} == *_p* ]] && ESVN_REVISION="${PLEVEL}" |
| |
| case ${MY_PV%.9999} in |
| *.*.*) BRANCH="release";; |
| *.*) BRANCH="releng" ;; |
| 9999) BRANCH="head" ;; |
| *) BRANCH="stable" ;; |
| esac |
| |
| if [[ ${BRANCH} == head ]] ; then |
| SVN_SUB_URI="${BRANCH}" |
| else |
| SVN_SUB_URI="${BRANCH}/${MY_PV%.9999}" |
| fi |
| |
| ESVN_REPO_URI="svn://svn.freebsd.org/base/${SVN_SUB_URI}" |
| ESVN_PROJECT="freebsd-${BRANCH}" |
| fi |
| |
| # use the original source code. |
| if [[ ${MY_PV} != *9999* ]] && version_is_at_least 10.0 ${RV} ; then |
| DL_PV=${MY_PV/_rc/-RC} |
| DL_PV=${DL_PV/_beta/-BETA} |
| DL_PV=${DL_PV/_alpha/-ALPHA} |
| if [[ ${DL_PV} == ${MY_PV} ]]; then |
| DL_PV="${DL_PV}-RELEASE" |
| fi |
| SRC_URI="mirror://freebsd/releases/i386/${DL_PV}/src.txz -> freebsd-src-${MY_PV}.tar.xz" |
| fi |
| |
| IUSE="profile" |
| |
| #unalias -a |
| alias install-info='/usr/bin/bsdinstall-info' |
| |
| EXPORT_FUNCTIONS src_compile src_install src_unpack |
| |
| # doperiodic <kind> <file> ... |
| doperiodic() { |
| local kind=$1 |
| shift |
| |
| ( # dont want to pollute calling env |
| insinto /etc/periodic/${kind} |
| insopts -m 0755 |
| doins "$@" |
| ) |
| } |
| |
| freebsd_get_bmake() { |
| local bmake |
| bmake=$(get_bmake) |
| [[ ${CBUILD} == *-freebsd* ]] || bmake="${bmake} -m /usr/share/mk/freebsd" |
| |
| echo "${bmake}" |
| } |
| |
| # Generates a patch SRC_URI or DISTDIR of upstream. |
| freebsd_upstream_patches() { |
| local opt=$1 |
| [[ ${#UPSTREAM_PATCHES[@]} -eq 0 ]] && return 1 |
| for x in "${UPSTREAM_PATCHES[@]}" |
| do |
| local out=${PN}-${x/\//-} |
| out=${out/:/} |
| if [[ ${opt} == -s ]] ; then |
| echo "${DISTDIR}/${out}" |
| else |
| echo "https://security.freebsd.org/patches/${x} -> ${out}" |
| fi |
| done |
| } |
| |
| freebsd_do_patches() { |
| if [[ ${#PATCHES[@]} -gt 1 ]] ; then |
| for x in "${PATCHES[@]}"; do |
| epatch "${x}" |
| done |
| else |
| for x in ${PATCHES} ; do |
| epatch "${x}" |
| done |
| fi |
| [[ ${#UPSTREAM_PATCHES[@]} -gt 0 ]] && epatch $(freebsd_upstream_patches -s) |
| epatch_user |
| } |
| |
| freebsd_rename_libraries() { |
| ebegin "Renaming libraries" |
| # We don't use libtermcap, we use libncurses |
| find "${S}" -name Makefile -print0 | xargs -0 \ |
| sed -i -e 's:-ltermcap:-lncurses:g; s:{LIBTERMCAP}:{LIBNCURSES}:g' |
| # flex provides libfl, not libl |
| find "${S}" -name Makefile -print0 | xargs -0 \ |
| sed -i -e 's:-ll$:-lfl:g; s:-ll :-lfl :g; s:{LIBL}:{LIBFL}:g' |
| # ncurses provides libncursesw not libcursesw |
| find "${S}" -name Makefile -print0 | xargs -0 \ |
| sed -i -e 's:-lcursesw:-lncursesw:g' |
| # we use expat instead of bsdxml |
| find "${S}" -name Makefile -print0 | xargs -0 \ |
| sed -i -e 's:-lbsdxml:-lexpat:g' |
| |
| eend $? |
| } |
| |
| freebsd_src_unpack() { |
| if [[ ${MY_PV} == *9999* ]]; then |
| S="${WORKDIR}" subversion_src_unpack |
| |
| # When share/mk exists in ${WORKDIR}, it is used on FreeBSD 10.0 |
| # Removed "${WORKDIR}"/share/mk/*.mk, use to force /usr/share/mk. |
| if [[ ${PN} != freebsd-mk-defs ]] ; then |
| [[ -e "${WORKDIR}"/share/mk ]] && rm -rf "${WORKDIR}"/share/mk/*.mk |
| fi |
| else |
| if version_is_at_least 10.0 ${RV} ; then |
| local tarball="freebsd-src-${MY_PV}.tar.xz" |
| local topdir="usr/src/" |
| local extractlist=() |
| for i in ${EXTRACTONLY} ; do |
| extractlist+=( ${topdir}${i} ) |
| done |
| ebegin "Unpacking parts of ${tarball} to ${WORKDIR}" |
| cd "${WORKDIR}" || die |
| tar -xJpf "${DISTDIR}/${tarball}" --strip-components=2 "${extractlist[@]}" 2> /dev/null || die "tar extract command failed" |
| cd - || die |
| else |
| for f in ${A} ; do |
| [[ ${f} == *.tar.* ]] && unpack ${f} |
| done |
| fi |
| fi |
| cd "${S}" |
| |
| dummy_mk ${REMOVE_SUBDIRS} |
| |
| freebsd_do_patches |
| freebsd_rename_libraries |
| |
| # Starting from FreeBSD 9.2, its install command supports the -l option and |
| # they now use it. Emulate it if we are on a system that does not have it. |
| if version_is_at_least 9.2 ${RV} && ! has_version '>=sys-freebsd/freebsd-ubin-9.2_beta1' ; then |
| export INSTALL_LINK="ln -f" |
| export INSTALL_SYMLINK="ln -fs" |
| fi |
| |
| # When CC=clang, force use clang-cpp #478810, #595878 |
| if [[ $(tc-getCC) == *clang* ]] ; then |
| if type -P clang-cpp > /dev/null ; then |
| export CPP=clang-cpp |
| else |
| mkdir "${WORKDIR}"/workaround_clang-cpp || die "Could not create ${WORKDIR}/workaround_clang-cpp" |
| ln -s "$(type -P clang)" "${WORKDIR}"/workaround_clang-cpp/clang-cpp || die "Could not create clang-cpp symlink." |
| export CPP="${WORKDIR}/workaround_clang-cpp/clang-cpp" |
| fi |
| fi |
| |
| # Add a special CFLAGS required for multilib support. |
| use amd64-fbsd && export CFLAGS_x86_fbsd="${CFLAGS_x86_fbsd} -DCOMPAT_32BIT -B/usr/lib32 -L/usr/lib32" |
| } |
| |
| freebsd_src_compile() { |
| use profile && filter-flags "-fomit-frame-pointer" |
| use profile || mymakeopts="${mymakeopts} NO_PROFILE= " |
| |
| mymakeopts="${mymakeopts} NO_MANCOMPRESS= NO_INFOCOMPRESS= NO_FSCHG=" |
| |
| # Make sure to use FreeBSD definitions while crosscompiling |
| [[ -z "${BMAKE}" ]] && BMAKE="$(freebsd_get_bmake)" |
| |
| # Create objdir if MAKEOBJDIRPREFIX is defined, so that we can make out of |
| # tree builds easily. |
| if [[ -n "${MAKEOBJDIRPREFIX}" ]] ; then |
| mkmake obj || die |
| fi |
| |
| bsdmk_src_compile "$@" |
| } |
| |
| # Helper function to make a multilib build with FreeBSD Makefiles. |
| # Usage: |
| # MULTIBUILD_VARIANTS=( $(get_all_abis) ) |
| # multibuild_foreach_variant freebsd_multilib_multibuild_wrapper my_function |
| # |
| # Important note: To use this function you _have_ to: |
| # - inherit multilib.eclass and multibuild.eclass |
| # - set MULTIBUILD_VARIANTS |
| |
| freebsd_multilib_multibuild_wrapper() { |
| # Get the ABI from multibuild.eclass |
| # This assumes MULTIBUILD_VARIANTS contains only valid ABIs. |
| local ABI=${MULTIBUILD_VARIANT} |
| |
| # First, save the variables: CFLAGS, CXXFLAGS, LDFLAGS, LDADD and mymakeopts. |
| for i in CFLAGS CXXFLAGS LDFLAGS LDADD mymakeopts ; do |
| export ${i}_SAVE="${!i}" |
| done |
| |
| # Setup the variables specific to this ABI. |
| multilib_toolchain_setup "${ABI}" |
| |
| local target="$(tc-arch-kernel ${CHOST})" |
| mymakeopts="${mymakeopts} TARGET=${target} MACHINE=${target} MACHINE_ARCH=${target} SHLIBDIR=/usr/$(get_libdir) LIBDIR=/usr/$(get_libdir)" |
| if [ "${ABI}" != "${DEFAULT_ABI}" ] ; then |
| mymakeopts="${mymakeopts} COMPAT_32BIT=" |
| fi |
| |
| einfo "Building for ABI=${ABI} and TARGET=${target}" |
| |
| export MAKEOBJDIRPREFIX="${BUILD_DIR}" |
| if [ ! -d "${MAKEOBJDIRPREFIX}" ] ; then |
| mkdir "${MAKEOBJDIRPREFIX}" || die "Could not create ${MAKEOBJDIRPREFIX}." |
| fi |
| |
| CTARGET="${CHOST}" "$@" |
| |
| # Restore the variables now. |
| for i in CFLAGS CXXFLAGS LDFLAGS LDADD mymakeopts ; do |
| ii="${i}_SAVE" |
| export ${i}="${!ii}" |
| done |
| } |
| |
| freebsd_src_install() { |
| use profile || mymakeopts="${mymakeopts} NO_PROFILE= " |
| |
| mymakeopts="${mymakeopts} NO_MANCOMPRESS= NO_INFOCOMPRESS= NO_FSCHG=" |
| |
| [[ -z "${BMAKE}" ]] && BMAKE="$(freebsd_get_bmake)" |
| |
| bsdmk_src_install |
| } |