1 # Copyright 1999-2015 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
6 # maintainer-needed@gentoo.org
8 # Diego Pettenò <flameeyes@gentoo.org>
10 inherit versionator eutils flag-o-matic bsdmk
12 # Drop patch level from ${PV}
17 HOMEPAGE="http://www.freebsd.org/"
19 # Define global package names
20 LIB="freebsd-lib-${PV}"
21 BIN="freebsd-bin-${PV}"
22 CONTRIB="freebsd-contrib-${PV}"
23 SHARE="freebsd-share-${PV}"
24 UBIN="freebsd-ubin-${PV}"
25 USBIN="freebsd-usbin-${PV}"
26 CRYPTO="freebsd-crypto-${PV}"
27 LIBEXEC="freebsd-libexec-${PV}"
28 SBIN="freebsd-sbin-${PV}"
29 GNU="freebsd-gnu-${PV}"
30 ETC="freebsd-etc-${PV}"
31 SYS="freebsd-sys-${PV}"
32 INCLUDE="freebsd-include-${PV}"
33 RESCUE="freebsd-rescue-${PV}"
34 CDDL="freebsd-cddl-${PV}"
35 SECURE="freebsd-secure-${PV}"
37 # Release version (5.3, 5.4, 6.0, etc)
38 RV="$(get_version_component_range 1-2 ${MY_PV})"
41 # 9.1.0.9999 --> release/9.1.0
42 # 9.1.9999 --> releng/9.1
46 # svn revision can be specified by patch level:
47 # freebsd-lib-9.9999_p247000 --> set svn -r 247000
49 if [[ ${MY_PV} == *9999* ]]; then
52 # Set SVN revision using patch level.
53 [[ ${PV} == *_p* ]] && ESVN_REVISION="${PLEVEL}"
55 case ${MY_PV%.9999} in
56 *.*.*) BRANCH="release";;
57 *.*) BRANCH="releng" ;;
58 9999) BRANCH="head" ;;
62 if [[ ${BRANCH} == head ]] ; then
63 SVN_SUB_URI="${BRANCH}"
65 SVN_SUB_URI="${BRANCH}/${MY_PV%.9999}"
68 ESVN_REPO_URI="svn://svn.freebsd.org/base/${SVN_SUB_URI}"
69 ESVN_PROJECT="freebsd-${BRANCH}"
72 # use the original source code.
73 if [[ ${MY_PV} != *9999* ]] && version_is_at_least 10.0 ${RV} ; then
74 DL_PV=${MY_PV/_rc/-RC}
75 DL_PV=${DL_PV/_beta/-BETA}
76 DL_PV=${DL_PV/_alpha/-ALPHA}
77 if [[ ${DL_PV} == ${MY_PV} ]]; then
78 DL_PV="${DL_PV}-RELEASE"
80 SRC_URI="mirror://freebsd/releases/i386/${DL_PV}/src.txz -> freebsd-src-${MY_PV}.tar.xz"
86 alias install-info='/usr/bin/bsdinstall-info'
88 EXPORT_FUNCTIONS src_compile src_install src_unpack
90 # doperiodic <kind> <file> ...
95 ( # dont want to pollute calling env
96 insinto /etc/periodic/${kind}
102 freebsd_get_bmake() {
105 if version_is_at_least 11.0 ${RV} ; then
106 if [[ ${CBUILD} == *-freebsd* ]] ; then
107 bmake="${bmake} -m /usr/share/mk/system"
109 bmake="${bmake} -m /usr/share/mk/freebsd/system"
112 [[ ${CBUILD} == *-freebsd* ]] || bmake="${bmake} -m /usr/share/mk/freebsd"
118 # Generates a patch SRC_URI or DISTDIR of upstream.
119 freebsd_upstream_patches() {
121 [[ ${#UPSTREAM_PATCHES[@]} -eq 0 ]] && return 1
122 for x in "${UPSTREAM_PATCHES[@]}"
124 local out=${PN}-${x/\//-}
126 if [[ ${opt} == -s ]] ; then
127 echo "${DISTDIR}/${out}"
129 echo "https://security.freebsd.org/patches/${x} -> ${out}"
134 freebsd_do_patches() {
135 if [[ ${#PATCHES[@]} -gt 1 ]] ; then
136 for x in "${PATCHES[@]}"; do
140 for x in ${PATCHES} ; do
145 # Upstream patches need to be applied on WORKDIR.
146 if [[ ${#UPSTREAM_PATCHES[@]} -gt 0 ]] ; then
147 cd "${WORKDIR}" || die
148 epatch $(freebsd_upstream_patches -s)
154 freebsd_rename_libraries() {
155 ebegin "Renaming libraries"
156 # We don't use libtermcap, we use libncurses
157 find "${S}" -name Makefile -print0 | xargs -0 \
158 sed -i -e 's:-ltermcap:-lncurses:g; s:{LIBTERMCAP}:{LIBNCURSES}:g'
159 # flex provides libfl, not libl
160 find "${S}" -name Makefile -print0 | xargs -0 \
161 sed -i -e 's:-ll$:-lfl:g; s:-ll :-lfl :g; s:{LIBL}:{LIBFL}:g'
162 # ncurses provides libncursesw not libcursesw
163 find "${S}" -name Makefile -print0 | xargs -0 \
164 sed -i -e 's:-lcursesw:-lncursesw:g'
165 # we use expat instead of bsdxml
166 find "${S}" -name Makefile -print0 | xargs -0 \
167 sed -i -e 's:-lbsdxml:-lexpat:g'
172 freebsd_src_unpack() {
173 if [[ ${MY_PV} == *9999* ]]; then
174 S="${WORKDIR}" subversion_src_unpack
176 # When share/mk exists in ${WORKDIR}, it is used on FreeBSD 10.0
177 # Removed "${WORKDIR}"/share/mk/*.mk, use to force /usr/share/mk.
178 if [[ ${PN} != freebsd-mk-defs ]] ; then
179 [[ -e "${WORKDIR}"/share/mk ]] && rm -rf "${WORKDIR}"/share/mk/*.mk
182 if version_is_at_least 10.0 ${RV} ; then
183 local tarball="freebsd-src-${MY_PV}.tar.xz"
184 local topdir="usr/src/"
186 for i in ${EXTRACTONLY} ; do
187 extractlist+=( ${topdir}${i} )
189 ebegin "Unpacking parts of ${tarball} to ${WORKDIR}"
190 cd "${WORKDIR}" || die
191 tar -xJpf "${DISTDIR}/${tarball}" --strip-components=2 "${extractlist[@]}" 2> /dev/null || die "tar extract command failed"
195 [[ ${f} == *.tar.* ]] && unpack ${f}
201 dummy_mk ${REMOVE_SUBDIRS}
204 if ! version_is_at_least 11.0 ${RV} ; then
205 freebsd_rename_libraries
208 # Starting from FreeBSD 9.2, its install command supports the -l option and
209 # they now use it. Emulate it if we are on a system that does not have it.
210 if version_is_at_least 9.2 ${RV} && ! has_version '>=sys-freebsd/freebsd-ubin-9.2_beta1' ; then
211 export INSTALL_LINK="ln -f"
212 export INSTALL_SYMLINK="ln -fs"
214 if version_is_at_least 11.0 ${RV} ; then
215 export RSYMLINK=" -l s"
218 # When CC=clang, force use clang-cpp #478810, #595878
219 if [[ $(tc-getCC) == *clang* ]] ; then
220 if type -P clang-cpp > /dev/null ; then
223 mkdir "${WORKDIR}"/workaround_clang-cpp || die "Could not create ${WORKDIR}/workaround_clang-cpp"
224 ln -s "$(type -P clang)" "${WORKDIR}"/workaround_clang-cpp/clang-cpp || die "Could not create clang-cpp symlink."
225 export CPP="${WORKDIR}/workaround_clang-cpp/clang-cpp"
229 # Add a special CFLAGS required for multilib support.
230 use amd64-fbsd && export CFLAGS_x86_fbsd="${CFLAGS_x86_fbsd} -DCOMPAT_32BIT -B/usr/lib32 -L/usr/lib32"
233 freebsd_src_compile() {
234 use profile && filter-flags "-fomit-frame-pointer"
235 if version_is_at_least 11.0 ${RV} ; then
236 if ! use profile ; then
237 mymakeopts="${mymakeopts} WITHOUT_PROFILE= "
239 # Disable debugging info, use FEATURES=splitdebug instead.
240 mymakeopts="${mymakeopts} WITHOUT_DEBUG_FILES= "
241 # Test does not support yet.
242 mymakeopts="${mymakeopts} WITHOUT_TESTS= "
244 mymakeopts="${mymakeopts} SRCTOP=${WORKDIR} "
246 mymakeopts="${mymakeopts} WITHOUT_MANCOMPRESS= WITHOUT_INFOCOMPRESS= "
248 use profile || mymakeopts="${mymakeopts} NO_PROFILE= "
249 mymakeopts="${mymakeopts} NO_MANCOMPRESS= NO_INFOCOMPRESS= "
252 mymakeopts="${mymakeopts} NO_FSCHG="
254 # Make sure to use FreeBSD definitions while crosscompiling
255 [[ -z "${BMAKE}" ]] && BMAKE="$(freebsd_get_bmake)"
257 # Create objdir if MAKEOBJDIRPREFIX is defined, so that we can make out of
258 # tree builds easily.
259 if [[ -n "${MAKEOBJDIRPREFIX}" ]] ; then
263 bsdmk_src_compile "$@"
266 # Helper function to make a multilib build with FreeBSD Makefiles.
268 # MULTIBUILD_VARIANTS=( $(get_all_abis) )
269 # multibuild_foreach_variant freebsd_multilib_multibuild_wrapper my_function
271 # Important note: To use this function you _have_ to:
272 # - inherit multilib.eclass and multibuild.eclass
273 # - set MULTIBUILD_VARIANTS
275 freebsd_multilib_multibuild_wrapper() {
276 # Get the ABI from multibuild.eclass
277 # This assumes MULTIBUILD_VARIANTS contains only valid ABIs.
278 local ABI=${MULTIBUILD_VARIANT}
280 # First, save the variables: CFLAGS, CXXFLAGS, LDFLAGS, LDADD and mymakeopts.
281 for i in CFLAGS CXXFLAGS LDFLAGS LDADD mymakeopts ; do
282 export ${i}_SAVE="${!i}"
285 # Setup the variables specific to this ABI.
286 multilib_toolchain_setup "${ABI}"
288 local target="$(tc-arch-kernel ${CHOST})"
289 mymakeopts="${mymakeopts} TARGET=${target} MACHINE=${target} MACHINE_ARCH=${target} SHLIBDIR=/usr/$(get_libdir) LIBDIR=/usr/$(get_libdir)"
290 if [ "${ABI}" != "${DEFAULT_ABI}" ] ; then
291 mymakeopts="${mymakeopts} COMPAT_32BIT="
294 einfo "Building for ABI=${ABI} and TARGET=${target}"
296 export MAKEOBJDIRPREFIX="${BUILD_DIR}"
297 if [ ! -d "${MAKEOBJDIRPREFIX}" ] ; then
298 mkdir "${MAKEOBJDIRPREFIX}" || die "Could not create ${MAKEOBJDIRPREFIX}."
301 CTARGET="${CHOST}" "$@"
303 # Restore the variables now.
304 for i in CFLAGS CXXFLAGS LDFLAGS LDADD mymakeopts ; do
310 freebsd_src_install() {
311 if version_is_at_least 11.0 ${RV} ; then
312 if ! use profile ; then
313 mymakeopts="${mymakeopts} WITHOUT_PROFILE= "
315 # Disable debugging info, use FEATURES=splitdebug instead.
316 mymakeopts="${mymakeopts} WITHOUT_DEBUG_FILES= "
317 # Test does not support yet.
318 mymakeopts="${mymakeopts} WITHOUT_TESTS= "
320 mymakeopts="${mymakeopts} SRCTOP=${WORKDIR} "
322 mymakeopts="${mymakeopts} WITHOUT_MANCOMPRESS= WITHOUT_INFOCOMPRESS= "
324 use profile || mymakeopts="${mymakeopts} NO_PROFILE= "
325 mymakeopts="${mymakeopts} NO_MANCOMPRESS= NO_INFOCOMPRESS= "
328 mymakeopts="${mymakeopts} NO_FSCHG="
330 [[ -z "${BMAKE}" ]] && BMAKE="$(freebsd_get_bmake)"
332 bsdmk_src_install "$@"