1 |
# Copyright 1999-2005 Gentoo Foundation |
2 |
# Distributed under the terms of the GNU General Public License v2 |
3 |
# $Header: /var/cvsroot/gentoo-x86/eclass/x-modular.eclass,v 1.52 2006/04/03 23:49:32 spyderous Exp $ |
4 |
# |
5 |
# Author: Donnie Berkholz <spyderous@gentoo.org> |
6 |
# |
7 |
# This eclass is designed to reduce code duplication in the modularized X11 |
8 |
# ebuilds. |
9 |
# |
10 |
# Using this eclass: |
11 |
# |
12 |
# Inherit it. If you need to run autoreconf for any reason (e.g., your patches |
13 |
# apply to the autotools files rather than configure), set SNAPSHOT="yes". Set |
14 |
# CONFIGURE_OPTIONS to everything you want to pass to the configure script. |
15 |
# |
16 |
# If you have any patches to apply, set PATCHES to their locations and epatch |
17 |
# will apply them. It also handles epatch-style bulk patches, if you know how to |
18 |
# use them and set the correct variables. If you don't, read eutils.eclass. |
19 |
# |
20 |
# If you're creating a font package and the suffix of PN is not equal to the |
21 |
# subdirectory of /usr/share/fonts/ it should install into, set FONT_DIR to that |
22 |
# directory or directories. |
23 |
# |
24 |
# IMPORTANT: Both SNAPSHOT and FONT_DIR must be set _before_ the inherit. |
25 |
# |
26 |
# Pretty much everything else should be automatic. |
27 |
|
28 |
EXPORT_FUNCTIONS src_unpack src_compile src_install pkg_preinst pkg_postinst pkg_postrm |
29 |
|
30 |
inherit eutils libtool toolchain-funcs flag-o-matic autotools |
31 |
|
32 |
# Directory prefix to use for everything |
33 |
XDIR="/usr" |
34 |
|
35 |
# Set up default patchset version(s) if necessary |
36 |
# x11-driver-patches |
37 |
if [[ -z "${XDPVER}" ]]; then |
38 |
XDPVER="1" |
39 |
fi |
40 |
|
41 |
IUSE="" |
42 |
HOMEPAGE="http://xorg.freedesktop.org/" |
43 |
|
44 |
# Set up SRC_URI for individual modular releases |
45 |
BASE_INDIVIDUAL_URI="http://xorg.freedesktop.org/releases/individual" |
46 |
if [[ ${CATEGORY} = x11-apps ]]; then |
47 |
SRC_URI="${SRC_URI} |
48 |
${BASE_INDIVIDUAL_URI}/app/${P}.tar.bz2" |
49 |
elif [[ ${CATEGORY} = app-doc ]]; then |
50 |
SRC_URI="${SRC_URI} |
51 |
${BASE_INDIVIDUAL_URI}/doc/${P}.tar.bz2" |
52 |
# x11-misc contains data and util, x11-themes contains data |
53 |
elif [[ ${CATEGORY} = x11-misc ]] || [[ ${CATEGORY} = x11-themes ]]; then |
54 |
SRC_URI="${SRC_URI} |
55 |
${BASE_INDIVIDUAL_URI}/data/${P}.tar.bz2 |
56 |
${BASE_INDIVIDUAL_URI}/util/${P}.tar.bz2" |
57 |
elif [[ ${CATEGORY} = x11-drivers ]]; then |
58 |
SRC_URI="${SRC_URI} |
59 |
${BASE_INDIVIDUAL_URI}/driver/${P}.tar.bz2" |
60 |
elif [[ ${CATEGORY} = media-fonts ]]; then |
61 |
SRC_URI="${SRC_URI} |
62 |
${BASE_INDIVIDUAL_URI}/font/${P}.tar.bz2" |
63 |
elif [[ ${CATEGORY} = x11-libs ]]; then |
64 |
SRC_URI="${SRC_URI} |
65 |
${BASE_INDIVIDUAL_URI}/lib/${P}.tar.bz2" |
66 |
elif [[ ${CATEGORY} = x11-proto ]]; then |
67 |
SRC_URI="${SRC_URI} |
68 |
${BASE_INDIVIDUAL_URI}/proto/${P}.tar.bz2" |
69 |
elif [[ ${CATEGORY} = x11-base ]]; then |
70 |
SRC_URI="${SRC_URI} |
71 |
${BASE_INDIVIDUAL_URI}/xserver/${P}.tar.bz2" |
72 |
fi |
73 |
|
74 |
# SRC_URI for full releases |
75 |
SRC_URI="${SRC_URI} |
76 |
http://xorg.freedesktop.org/releases/X11R7.0/src/everything/${P}.tar.bz2" |
77 |
|
78 |
SLOT="0" |
79 |
|
80 |
# Set the license for the package. This can be overridden by setting |
81 |
# LICENSE after the inherit. |
82 |
LICENSE=${PN} |
83 |
|
84 |
# Set up shared dependencies |
85 |
if [[ -n "${SNAPSHOT}" ]]; then |
86 |
# FIXME: What's the minimal libtool version supporting arbitrary versioning? |
87 |
DEPEND="${DEPEND} |
88 |
>=sys-devel/autoconf-2.57 |
89 |
>=sys-devel/automake-1.7 |
90 |
>=sys-devel/libtool-1.5 |
91 |
>=sys-devel/m4-1.4" |
92 |
fi |
93 |
|
94 |
# If we're a font package, but not the font.alias one |
95 |
if [[ "${PN/#font-}" != "${PN}" ]] \ |
96 |
&& [[ "${CATEGORY}" = "media-fonts" ]] \ |
97 |
&& [[ "${PN}" != "font-alias" ]] \ |
98 |
&& [[ "${PN}" != "font-util" ]]; then |
99 |
# Activate font code in the rest of the eclass |
100 |
FONT="yes" |
101 |
|
102 |
RDEPEND="${RDEPEND} |
103 |
media-fonts/encodings |
104 |
x11-apps/mkfontscale |
105 |
x11-apps/mkfontdir" |
106 |
PDEPEND="${PDEPEND} |
107 |
media-fonts/font-alias" |
108 |
|
109 |
# Starting with 7.0RC3, we can specify the font directory |
110 |
# But oddly, we can't do the same for encodings or font-alias |
111 |
|
112 |
# Wrap in `if` so ebuilds can set it too |
113 |
if [[ -z ${FONT_DIR} ]]; then |
114 |
FONT_DIR=${PN##*-} |
115 |
|
116 |
fi |
117 |
|
118 |
# Fix case of font directories |
119 |
FONT_DIR=${FONT_DIR/ttf/TTF} |
120 |
FONT_DIR=${FONT_DIR/otf/OTF} |
121 |
FONT_DIR=${FONT_DIR/type1/Type1} |
122 |
FONT_DIR=${FONT_DIR/speedo/Speedo} |
123 |
|
124 |
# Set up configure option |
125 |
FONT_OPTIONS="--with-fontdir=\"/usr/share/fonts/${FONT_DIR}\"" |
126 |
|
127 |
if [[ -n "${FONT}" ]]; then |
128 |
if [[ ${PN##*-} = misc ]] || [[ ${PN##*-} = 75dpi ]] || [[ ${PN##*-} = 100dpi ]]; then |
129 |
IUSE="${IUSE} nls" |
130 |
fi |
131 |
fi |
132 |
fi |
133 |
|
134 |
# If we're a driver package |
135 |
if [[ "${PN/#xf86-video}" != "${PN}" ]] || [[ "${PN/#xf86-input}" != "${PN}" ]]; then |
136 |
# Enable driver code in the rest of the eclass |
137 |
DRIVER="yes" |
138 |
|
139 |
# Add driver patchset to SRC_URI |
140 |
SRC_URI="${SRC_URI} |
141 |
http://dev.gentoo.org/~joshuabaergen/distfiles/x11-driver-patches-${XDPVER}.tar.bz2" |
142 |
fi |
143 |
|
144 |
# Debugging -- ignore packages that can't be built with debugging |
145 |
if [[ -z "${FONT}" ]] \ |
146 |
|| [[ "${PN/app-doc}" != "${PN}" ]] \ |
147 |
|| [[ "${PN/x11-proto}" != "${PN}" ]] \ |
148 |
|| [[ "${PN/util-macros}" != "${PN}" ]] \ |
149 |
|| [[ "${PN/xbitmaps}" != "${PN}" ]] \ |
150 |
|| [[ "${PN/xkbdata}" != "${PN}" ]] \ |
151 |
|| [[ "${PN/xorg-cf-files}" != "${PN}" ]] \ |
152 |
|| [[ "${PN/xcursor}" != "${PN}" ]] \ |
153 |
; then |
154 |
DEBUGGABLE="yes" |
155 |
IUSE="${IUSE} debug" |
156 |
if use debug; then |
157 |
if ! has splitdebug ${FEATURES}; then |
158 |
RESTRICT="${RESTRICT} nostrip" |
159 |
fi |
160 |
fi |
161 |
fi |
162 |
|
163 |
DEPEND="${DEPEND} |
164 |
>=dev-util/pkgconfig-0.18" |
165 |
|
166 |
if [[ "${PN/util-macros}" = "${PN}" ]]; then |
167 |
DEPEND="${DEPEND} |
168 |
>=x11-misc/util-macros-0.99.2" |
169 |
fi |
170 |
|
171 |
# >=sys-apps/man-1.6b-r2 required to look in [0-8]x/ directories |
172 |
RDEPEND="${RDEPEND} |
173 |
!<=x11-base/xorg-x11-6.9 |
174 |
>=sys-apps/man-1.6b-r2" |
175 |
# Provides virtual/x11 for temporary use until packages are ported |
176 |
# x11-base/x11-env" |
177 |
|
178 |
x-modular_unpack_source() { |
179 |
# (#120057) Enabling DRI in drivers requires that the server was built with |
180 |
# support for it |
181 |
if [[ -n "${DRIVER}" ]]; then |
182 |
if has dri ${IUSE} && use dri; then |
183 |
einfo "Checking for direct rendering capabilities ..." |
184 |
if ! built_with_use x11-base/xorg-server dri; then |
185 |
die "You must build x11-base/xorg-server with USE=dri." |
186 |
fi |
187 |
fi |
188 |
fi |
189 |
|
190 |
unpack ${A} |
191 |
cd ${S} |
192 |
|
193 |
if [[ -n ${FONT_OPTIONS} ]]; then |
194 |
einfo "Detected font directory: ${FONT_DIR}" |
195 |
fi |
196 |
} |
197 |
|
198 |
x-modular_patch_source() { |
199 |
# Use standardized names and locations with bulk patching |
200 |
# Patch directory is ${WORKDIR}/patch |
201 |
# See epatch() in eutils.eclass for more documentation |
202 |
if [[ -z "${EPATCH_SUFFIX}" ]] ; then |
203 |
EPATCH_SUFFIX="patch" |
204 |
fi |
205 |
|
206 |
# If this is a driver package we need to fix man page install location. |
207 |
# Running autoreconf will use the patched util-macros to make the |
208 |
# change for us, so we only need to patch if it is not going to run. |
209 |
if [[ -n "${DRIVER}" ]] && [[ "${SNAPSHOT}" != "yes" ]]; then |
210 |
PATCHES="${PATCHES} ${DISTDIR}/x11-driver-patches-${XDPVER}.tar.bz2" |
211 |
fi |
212 |
|
213 |
# For specific list of patches |
214 |
if [[ -n "${PATCHES}" ]] ; then |
215 |
for PATCH in ${PATCHES} |
216 |
do |
217 |
epatch ${PATCH} |
218 |
done |
219 |
# For non-default directory bulk patching |
220 |
elif [[ -n "${PATCH_LOC}" ]] ; then |
221 |
epatch ${PATCH_LOC} |
222 |
# For standard bulk patching |
223 |
elif [[ -d "${EPATCH_SOURCE}" ]] ; then |
224 |
epatch |
225 |
fi |
226 |
} |
227 |
|
228 |
x-modular_reconf_source() { |
229 |
# Run autoreconf for CVS snapshots only |
230 |
if [[ "${SNAPSHOT}" = "yes" ]] |
231 |
then |
232 |
# If possible, generate configure if it doesn't exist |
233 |
if [ -f "${S}/configure.ac" ] |
234 |
then |
235 |
eautoreconf |
236 |
fi |
237 |
fi |
238 |
|
239 |
} |
240 |
|
241 |
x-modular_src_unpack() { |
242 |
if [[ ${PN:0:11} = "xorg-server" ]] || [[ -n "${DRIVER}" ]]; then |
243 |
if gcc-specs-now; then |
244 |
msg="${PN} does not work with hardened gcc specs. Switch to vanilla gcc specs to emerge ${PN}." |
245 |
eerror "$msg" |
246 |
die "$msg" |
247 |
fi |
248 |
fi |
249 |
|
250 |
x-modular_unpack_source |
251 |
x-modular_patch_source |
252 |
x-modular_reconf_source |
253 |
|
254 |
# Joshua Baergen - October 23, 2005 |
255 |
# Fix shared lib issues on MIPS, FBSD, etc etc |
256 |
elibtoolize |
257 |
} |
258 |
|
259 |
x-modular_font_configure() { |
260 |
if [[ -n "${FONT}" ]]; then |
261 |
# Might be worth adding an option to configure your desired font |
262 |
# and exclude all others. Also, should this USE be nls or minimal? |
263 |
if ! use nls; then |
264 |
FONT_OPTIONS="${FONT_OPTIONS} |
265 |
--disable-iso8859-2 |
266 |
--disable-iso8859-3 |
267 |
--disable-iso8859-4 |
268 |
--disable-iso8859-5 |
269 |
--disable-iso8859-6 |
270 |
--disable-iso8859-7 |
271 |
--disable-iso8859-8 |
272 |
--disable-iso8859-9 |
273 |
--disable-iso8859-10 |
274 |
--disable-iso8859-11 |
275 |
--disable-iso8859-12 |
276 |
--disable-iso8859-13 |
277 |
--disable-iso8859-14 |
278 |
--disable-iso8859-15 |
279 |
--disable-iso8859-16 |
280 |
--disable-jisx0201 |
281 |
--disable-koi8-r" |
282 |
fi |
283 |
fi |
284 |
} |
285 |
|
286 |
x-modular_debug_setup() { |
287 |
if [[ -n "${DEBUGGABLE}" ]]; then |
288 |
if use debug; then |
289 |
strip-flags |
290 |
append-flags -g |
291 |
fi |
292 |
fi |
293 |
} |
294 |
|
295 |
x-modular_src_configure() { |
296 |
x-modular_font_configure |
297 |
x-modular_debug_setup |
298 |
|
299 |
# If prefix isn't set here, .pc files cause problems |
300 |
if [[ -x ./configure ]]; then |
301 |
econf --prefix=${XDIR} \ |
302 |
--datadir=${XDIR}/share \ |
303 |
${FONT_OPTIONS} \ |
304 |
${DRIVER_OPTIONS} \ |
305 |
${CONFIGURE_OPTIONS} |
306 |
fi |
307 |
} |
308 |
|
309 |
x-modular_src_make() { |
310 |
emake || die "emake failed" |
311 |
} |
312 |
|
313 |
x-modular_src_compile() { |
314 |
x-modular_src_configure |
315 |
x-modular_src_make |
316 |
} |
317 |
|
318 |
x-modular_src_install() { |
319 |
# Install everything to ${XDIR} |
320 |
make \ |
321 |
DESTDIR="${D}" \ |
322 |
install |
323 |
# Shouldn't be necessary in XDIR=/usr |
324 |
# einstall forces datadir, so we need to re-force it |
325 |
# datadir=${XDIR}/share \ |
326 |
# mandir=${XDIR}/share/man \ |
327 |
|
328 |
# Make sure docs get compressed |
329 |
prepalldocs |
330 |
|
331 |
# Don't install libtool archives for server modules |
332 |
if [[ -e ${D}/usr/lib/xorg/modules ]]; then |
333 |
find ${D}/usr/lib/xorg/modules -name '*.la' \ |
334 |
| xargs rm -f |
335 |
fi |
336 |
|
337 |
# Don't install overlapping fonts.* files |
338 |
# Generate them instead when possible |
339 |
if [[ -n "${FONT}" ]]; then |
340 |
remove_font_metadata |
341 |
fi |
342 |
} |
343 |
|
344 |
x-modular_pkg_preinst() { |
345 |
if [[ -n "${FONT}" ]]; then |
346 |
discover_font_dirs |
347 |
fi |
348 |
} |
349 |
|
350 |
x-modular_pkg_postinst() { |
351 |
if [[ -n "${FONT}" ]]; then |
352 |
setup_fonts |
353 |
fi |
354 |
} |
355 |
|
356 |
x-modular_pkg_postrm() { |
357 |
if [[ -n "${FONT}" ]]; then |
358 |
cleanup_fonts |
359 |
fi |
360 |
} |
361 |
|
362 |
cleanup_fonts() { |
363 |
local ALLOWED_FILES="encodings.dir fonts.cache-1 fonts.dir fonts.scale" |
364 |
for DIR in ${FONT_DIR}; do |
365 |
unset KEEP_FONTDIR |
366 |
REAL_DIR=${ROOT}usr/share/fonts/${DIR} |
367 |
|
368 |
ebegin "Checking ${REAL_DIR} for useless files" |
369 |
pushd ${REAL_DIR} &> /dev/null |
370 |
for FILE in *; do |
371 |
unset MATCH |
372 |
for ALLOWED_FILE in ${ALLOWED_FILES}; do |
373 |
if [[ ${FILE} = ${ALLOWED_FILE} ]]; then |
374 |
# If it's allowed, then move on to the next file |
375 |
MATCH="yes" |
376 |
break |
377 |
fi |
378 |
done |
379 |
# If we found a match in allowed files, move on to the next file |
380 |
if [[ -n ${MATCH} ]]; then |
381 |
continue |
382 |
fi |
383 |
# If we get this far, there wasn't a match in the allowed files |
384 |
KEEP_FONTDIR="yes" |
385 |
# We don't need to check more files if we're already keeping it |
386 |
break |
387 |
done |
388 |
popd &> /dev/null |
389 |
# If there are no files worth keeping, then get rid of the dir |
390 |
if [[ -z "${KEEP_FONTDIR}" ]]; then |
391 |
rm -rf ${REAL_DIR} |
392 |
fi |
393 |
eend 0 |
394 |
done |
395 |
} |
396 |
|
397 |
setup_fonts() { |
398 |
if [[ ! -n "${FONT_DIRS}" ]]; then |
399 |
msg="FONT_DIRS is empty. The ebuild should set it to at least one subdir of /usr/share/fonts." |
400 |
eerror "${msg}" |
401 |
die "${msg}" |
402 |
fi |
403 |
|
404 |
create_fonts_scale |
405 |
create_fonts_dir |
406 |
fix_font_permissions |
407 |
create_font_cache |
408 |
} |
409 |
|
410 |
remove_font_metadata() { |
411 |
local DIR |
412 |
for DIR in ${FONT_DIR}; do |
413 |
if [[ "${DIR}" != "Speedo" ]] && \ |
414 |
[[ "${DIR}" != "CID" ]] ; then |
415 |
# Delete font metadata files |
416 |
# fonts.scale, fonts.dir, fonts.cache-1 |
417 |
rm -f ${D}/usr/share/fonts/${DIR}/fonts.{scale,dir,cache-1} |
418 |
fi |
419 |
done |
420 |
} |
421 |
|
422 |
discover_font_dirs() { |
423 |
pushd ${IMAGE}/usr/share/fonts |
424 |
FONT_DIRS="$(find . -maxdepth 1 -mindepth 1 -type d)" |
425 |
FONT_DIRS="$(echo ${FONT_DIRS} | sed -e 's:./::g')" |
426 |
popd |
427 |
} |
428 |
|
429 |
create_fonts_scale() { |
430 |
ebegin "Creating fonts.scale files" |
431 |
local x |
432 |
for FONT_DIR in ${FONT_DIRS}; do |
433 |
x=${ROOT}/usr/share/fonts/${FONT_DIR} |
434 |
[[ -z "$(ls ${x}/)" ]] && continue |
435 |
[[ "$(ls ${x}/)" = "fonts.cache-1" ]] && continue |
436 |
|
437 |
# Only generate .scale files if truetype, opentype or type1 |
438 |
# fonts are present ... |
439 |
|
440 |
# First truetype (ttf,ttc) |
441 |
# NOTE: ttmkfdir does NOT work on type1 fonts (#53753) |
442 |
# Also, there is no way to regenerate Speedo/CID fonts.scale |
443 |
# <spyderous@gentoo.org> 2 August 2004 |
444 |
if [[ "${x/encodings}" = "${x}" ]] \ |
445 |
&& [[ -n "$(find ${x} -iname '*.tt[cf]' -print)" ]]; then |
446 |
if [[ -x ${ROOT}/usr/bin/ttmkfdir ]]; then |
447 |
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${ROOT}/usr/$(get_libdir)" \ |
448 |
${ROOT}/usr/bin/ttmkfdir -x 2 \ |
449 |
-e ${ROOT}/usr/share/fonts/encodings/encodings.dir \ |
450 |
-o ${x}/fonts.scale -d ${x} |
451 |
# ttmkfdir fails on some stuff, so try mkfontscale if it does |
452 |
local ttmkfdir_return=$? |
453 |
else |
454 |
# We didn't use ttmkfdir at all |
455 |
local ttmkfdir_return=2 |
456 |
fi |
457 |
if [[ ${ttmkfdir_return} -ne 0 ]]; then |
458 |
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${ROOT}/usr/$(get_libdir)" \ |
459 |
${ROOT}/usr/bin/mkfontscale \ |
460 |
-a /usr/share/fonts/encodings/encodings.dir \ |
461 |
-- ${x} |
462 |
fi |
463 |
# Next type1 and opentype (pfa,pfb,otf,otc) |
464 |
elif [[ "${x/encodings}" = "${x}" ]] \ |
465 |
&& [[ -n "$(find ${x} -iname '*.[po][ft][abcf]' -print)" ]]; then |
466 |
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${ROOT}/usr/$(get_libdir)" \ |
467 |
${ROOT}/usr/bin/mkfontscale \ |
468 |
-a ${ROOT}/usr/share/fonts/encodings/encodings.dir \ |
469 |
-- ${x} |
470 |
fi |
471 |
done |
472 |
eend 0 |
473 |
} |
474 |
|
475 |
create_fonts_dir() { |
476 |
ebegin "Generating fonts.dir files" |
477 |
for FONT_DIR in ${FONT_DIRS}; do |
478 |
x=${ROOT}/usr/share/fonts/${FONT_DIR} |
479 |
[[ -z "$(ls ${x}/)" ]] && continue |
480 |
[[ "$(ls ${x}/)" = "fonts.cache-1" ]] && continue |
481 |
|
482 |
if [[ "${x/encodings}" = "${x}" ]]; then |
483 |
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${ROOT}/usr/$(get_libdir)" \ |
484 |
${ROOT}/usr/bin/mkfontdir \ |
485 |
-e ${ROOT}/usr/share/fonts/encodings \ |
486 |
-e ${ROOT}/usr/share/fonts/encodings/large \ |
487 |
-- ${x} |
488 |
fi |
489 |
done |
490 |
eend 0 |
491 |
} |
492 |
|
493 |
fix_font_permissions() { |
494 |
ebegin "Fixing permissions" |
495 |
for FONT_DIR in ${FONT_DIRS}; do |
496 |
find ${ROOT}/usr/share/fonts/${FONT_DIR} -type f -name 'font.*' \ |
497 |
-exec chmod 0644 {} \; |
498 |
done |
499 |
eend 0 |
500 |
} |
501 |
|
502 |
create_font_cache() { |
503 |
# danarmak found out that fc-cache should be run AFTER all the above |
504 |
# stuff, as otherwise the cache is invalid, and has to be run again |
505 |
# as root anyway |
506 |
if [[ -x ${ROOT}/usr/bin/fc-cache ]]; then |
507 |
ebegin "Creating FC font cache" |
508 |
HOME="/root" ${ROOT}/usr/bin/fc-cache |
509 |
eend 0 |
510 |
fi |
511 |
} |