depend.apache.eclass: Let APXS point to the new location of the binary.
[gentoo.git] / eclass / freebsd.eclass
1 # Copyright 1999-2015 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
3 # $Id$
4 #
5 # @MAINTAINER:
6 # maintainer-needed@gentoo.org
7 # @AUTHOR:
8 # Diego Pettenò <flameeyes@gentoo.org>
9
10 inherit versionator eutils flag-o-matic bsdmk
11
12 # Drop patch level from ${PV}
13 MY_PV=${PV/_p*}
14 PLEVEL=${PV##*_p}
15
16 LICENSE="BSD"
17 HOMEPAGE="http://www.freebsd.org/"
18
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}"
36
37 # Release version (5.3, 5.4, 6.0, etc)
38 RV="$(get_version_component_range 1-2 ${MY_PV})"
39
40 # SVN ebuild support.
41 #   9.1.0.9999 -->      release/9.1.0
42 #       9.1.9999   -->  releng/9.1
43 #   9.9999     -->      stable/9
44 #       9999 -->        head
45
46 # svn revision can be specified by patch level:
47 #       freebsd-lib-9.9999_p247000 --> set svn -r 247000
48
49 if [[ ${MY_PV} == *9999* ]]; then
50         inherit subversion
51
52         # Set SVN revision using patch level.
53         [[ ${PV} == *_p* ]] && ESVN_REVISION="${PLEVEL}"
54
55         case ${MY_PV%.9999} in
56                 *.*.*)  BRANCH="release";;
57                 *.*)    BRANCH="releng" ;;
58                 9999)   BRANCH="head"   ;;
59                 *)          BRANCH="stable"     ;;
60         esac
61
62         if [[ ${BRANCH} == head ]]  ; then
63                 SVN_SUB_URI="${BRANCH}"
64         else
65                 SVN_SUB_URI="${BRANCH}/${MY_PV%.9999}"
66         fi
67
68         ESVN_REPO_URI="svn://svn.freebsd.org/base/${SVN_SUB_URI}"
69         ESVN_PROJECT="freebsd-${BRANCH}"
70 fi
71
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"
79         fi
80         SRC_URI="mirror://freebsd/releases/i386/${DL_PV}/src.txz -> freebsd-src-${MY_PV}.tar.xz"
81 fi
82
83 IUSE="profile"
84
85 #unalias -a
86 alias install-info='/usr/bin/bsdinstall-info'
87
88 EXPORT_FUNCTIONS src_compile src_install src_unpack
89
90 # doperiodic <kind> <file> ...
91 doperiodic() {
92         local kind=$1
93         shift
94
95         ( # dont want to pollute calling env
96                 insinto /etc/periodic/${kind}
97                 insopts -m 0755
98                 doins "$@"
99         )
100 }
101
102 freebsd_get_bmake() {
103         local bmake
104         bmake=$(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"
108                 else
109                         bmake="${bmake} -m /usr/share/mk/freebsd/system"
110                 fi
111         else
112                 [[ ${CBUILD} == *-freebsd* ]] || bmake="${bmake} -m /usr/share/mk/freebsd"
113         fi
114
115         echo "${bmake}"
116 }
117
118 # Generates a patch SRC_URI or DISTDIR of upstream.
119 freebsd_upstream_patches() {
120         local opt=$1
121         [[ ${#UPSTREAM_PATCHES[@]} -eq 0 ]] && return 1
122         for x in "${UPSTREAM_PATCHES[@]}"
123         do
124                 local out=${PN}-${x/\//-}
125                 out=${out/:/}
126                 if [[ ${opt} == -s ]] ; then
127                         echo "${DISTDIR}/${out}"
128                 else
129                         echo "https://security.freebsd.org/patches/${x} -> ${out}"
130                 fi
131         done
132 }
133
134 freebsd_do_patches() {
135         if [[ ${#PATCHES[@]} -gt 1 ]] ; then
136                 for x in "${PATCHES[@]}"; do
137                         epatch "${x}"
138                 done
139         else
140                 for x in ${PATCHES} ; do
141                         epatch "${x}"
142                 done
143         fi
144
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)
149                 cd "${S}" || die
150         fi
151         epatch_user
152 }
153
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'
168
169         eend $?
170 }
171
172 freebsd_src_unpack() {
173         if [[ ${MY_PV} == *9999* ]]; then
174                 S="${WORKDIR}" subversion_src_unpack
175
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
180                 fi
181         else
182                 if version_is_at_least 10.0 ${RV} ; then
183                         local tarball="freebsd-src-${MY_PV}.tar.xz"
184                         local topdir="usr/src/"
185                         local extractlist=()
186                         for i in ${EXTRACTONLY} ; do
187                                 extractlist+=( ${topdir}${i} )
188                         done
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"
192                         cd - || die
193                 else
194                         for f in ${A} ; do
195                                 [[ ${f} == *.tar.* ]] && unpack ${f}
196                         done
197                 fi
198         fi
199         cd "${S}"
200
201         dummy_mk ${REMOVE_SUBDIRS}
202
203         freebsd_do_patches
204         if ! version_is_at_least 11.0 ${RV} ; then
205                 freebsd_rename_libraries
206         fi
207
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"
213         fi
214         if version_is_at_least 11.0 ${RV} ; then
215                 export RSYMLINK=" -l s"
216         fi
217
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
221                         export CPP=clang-cpp
222                 else
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"
226                 fi
227         fi
228
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"
231 }
232
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= "
238                 fi
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= "
243                 # Force set SRCTOP.
244                 mymakeopts="${mymakeopts} SRCTOP=${WORKDIR} "
245                 # Set common option.
246                 mymakeopts="${mymakeopts} WITHOUT_MANCOMPRESS= WITHOUT_INFOCOMPRESS= "
247         else
248                 use profile || mymakeopts="${mymakeopts} NO_PROFILE= "
249                 mymakeopts="${mymakeopts} NO_MANCOMPRESS= NO_INFOCOMPRESS= "
250         fi
251
252         mymakeopts="${mymakeopts} NO_FSCHG="
253
254         # Make sure to use FreeBSD definitions while crosscompiling
255         [[ -z "${BMAKE}" ]] && BMAKE="$(freebsd_get_bmake)"
256
257         # Create objdir if MAKEOBJDIRPREFIX is defined, so that we can make out of
258         # tree builds easily.
259         if [[ -n "${MAKEOBJDIRPREFIX}" ]] ; then
260                 mkmake obj || die
261         fi
262
263         bsdmk_src_compile "$@"
264 }
265
266 # Helper function to make a multilib build with FreeBSD Makefiles.
267 # Usage: 
268 # MULTIBUILD_VARIANTS=( $(get_all_abis) )
269 # multibuild_foreach_variant freebsd_multilib_multibuild_wrapper my_function
270 #
271 # Important note: To use this function you _have_ to:
272 # - inherit multilib.eclass and multibuild.eclass
273 # - set MULTIBUILD_VARIANTS
274
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}
279
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}"
283         done
284
285         # Setup the variables specific to this ABI.
286         multilib_toolchain_setup "${ABI}"
287
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="
292         fi
293
294         einfo "Building for ABI=${ABI} and TARGET=${target}"
295
296         export MAKEOBJDIRPREFIX="${BUILD_DIR}"
297         if [ ! -d "${MAKEOBJDIRPREFIX}" ] ; then
298                 mkdir "${MAKEOBJDIRPREFIX}" || die "Could not create ${MAKEOBJDIRPREFIX}."
299         fi
300         
301         CTARGET="${CHOST}" "$@"
302         
303         # Restore the variables now.
304         for i in CFLAGS CXXFLAGS LDFLAGS LDADD mymakeopts ; do
305                 ii="${i}_SAVE"
306                 export ${i}="${!ii}"
307         done
308 }
309
310 freebsd_src_install() {
311         if version_is_at_least 11.0 ${RV} ; then
312                 if ! use profile ; then
313                         mymakeopts="${mymakeopts} WITHOUT_PROFILE= "
314                 fi
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= "
319                 # Force set SRCTOP.
320                 mymakeopts="${mymakeopts} SRCTOP=${WORKDIR} "
321                 # Set common option.
322                 mymakeopts="${mymakeopts} WITHOUT_MANCOMPRESS= WITHOUT_INFOCOMPRESS= "
323         else
324                 use profile || mymakeopts="${mymakeopts} NO_PROFILE= "
325                 mymakeopts="${mymakeopts} NO_MANCOMPRESS= NO_INFOCOMPRESS= "
326         fi
327
328         mymakeopts="${mymakeopts} NO_FSCHG="
329
330         [[ -z "${BMAKE}" ]] && BMAKE="$(freebsd_get_bmake)"
331
332         bsdmk_src_install "$@"
333 }