From 4f2d7949f03e1c198bc888f2d05f421d35c57e21 Mon Sep 17 00:00:00 2001 From: V3n3RiX Date: Mon, 9 Oct 2017 18:53:29 +0100 Subject: reinit the tree, so we can have metadata --- eclass/freebsd.eclass | 333 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 333 insertions(+) create mode 100644 eclass/freebsd.eclass (limited to 'eclass/freebsd.eclass') diff --git a/eclass/freebsd.eclass b/eclass/freebsd.eclass new file mode 100644 index 000000000000..7c89d953c4ba --- /dev/null +++ b/eclass/freebsd.eclass @@ -0,0 +1,333 @@ +# Copyright 1999-2017 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# +# @MAINTAINER: +# maintainer-needed@gentoo.org +# @AUTHOR: +# Diego Pettenò + +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 ... +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) + if version_is_at_least 11.0 ${RV} ; then + if [[ ${CBUILD} == *-freebsd* ]] ; then + bmake="${bmake} -m /usr/share/mk/system" + else + bmake="${bmake} -m /usr/share/mk/freebsd/system" + fi + else + [[ ${CBUILD} == *-freebsd* ]] || bmake="${bmake} -m /usr/share/mk/freebsd" + fi + + echo "${bmake}" +} + +# Generates SRC_URI or DISTDIR for the upstream patch. +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 need to be applied on WORKDIR. + if [[ ${#UPSTREAM_PATCHES[@]} -gt 0 ]] ; then + cd "${WORKDIR}" || die + epatch $(freebsd_upstream_patches -s) + cd "${S}" || die + fi + 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}, BSD's make will try to use it on FreeBSD 10.0 or later. + # We should remove "${WORKDIR}"/share/mk/*.mk to use /usr/share/mk{,/system}. + 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} tools/ ; 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 + if ! version_is_at_least 11.0 ${RV} ; then + freebsd_rename_libraries + fi + + # 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 + # An older version of install command doesn't support the -T option. + if version_is_at_least 11.0 ${RV} && ! has_version ">=sys-freebsd/freebsd-ubin-${RV}" ; then + export INSTALL="sh ${WORKDIR}/tools/install.sh" + fi + + # If CC=clang, we should use clang-cpp instead of 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 the 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" + if version_is_at_least 11.0 ${RV} ; then + if ! use profile ; then + mymakeopts="${mymakeopts} WITHOUT_PROFILE= " + fi + # Disable the debugging information, use FEATURES=splitdebug instead. + mymakeopts="${mymakeopts} WITHOUT_DEBUG_FILES= " + # We don't support test yet. + mymakeopts="${mymakeopts} WITHOUT_TESTS= " + # Set the SRCTOP to detect the source directory. + mymakeopts="${mymakeopts} SRCTOP=${WORKDIR} " + # Set the common settings. + mymakeopts="${mymakeopts} WITHOUT_MANCOMPRESS= WITHOUT_INFOCOMPRESS= " + else + use profile || mymakeopts="${mymakeopts} NO_PROFILE= " + mymakeopts="${mymakeopts} NO_MANCOMPRESS= NO_INFOCOMPRESS= " + fi + + mymakeopts="${mymakeopts} 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() { + if version_is_at_least 11.0 ${RV} ; then + if ! use profile ; then + mymakeopts="${mymakeopts} WITHOUT_PROFILE= " + fi + # Disable the debugging information, use FEATURES=splitdebug instead. + mymakeopts="${mymakeopts} WITHOUT_DEBUG_FILES= " + # We don't support test yet. + mymakeopts="${mymakeopts} WITHOUT_TESTS= " + # Set the SRCTOP to detect the source directory. + mymakeopts="${mymakeopts} SRCTOP=${WORKDIR} " + # Set the common settings. + mymakeopts="${mymakeopts} WITHOUT_MANCOMPRESS= WITHOUT_INFOCOMPRESS= " + else + use profile || mymakeopts="${mymakeopts} NO_PROFILE= " + mymakeopts="${mymakeopts} NO_MANCOMPRESS= NO_INFOCOMPRESS= " + fi + + mymakeopts="${mymakeopts} NO_FSCHG=" + + [[ -z "${BMAKE}" ]] && BMAKE="$(freebsd_get_bmake)" + + bsdmk_src_install "$@" +} -- cgit v1.2.3