summaryrefslogtreecommitdiff
path: root/eclass/kde4-functions.eclass
blob: 5eda981592ffc11d99ce8d3dd6c9ea108fd32111 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
# Copyright 1999-2008 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

# @ECLASS: kde4-functions.eclass
# @MAINTAINER:
# kde@gentoo.org
# @BLURB: Common ebuild functions for monolithic and split KDE 4 packages
# @DESCRIPTION:
# This eclass contains all functions shared by the different eclasses,
# for KDE 4 monolithic and split ebuilds.
#
# NOTE: This eclass uses the SLOT dependencies from EAPI="1" or compatible,
# hence you must define EAPI="1" in the ebuild, before inheriting any eclasses.

# BLOCK FOR EAPI OLDER THAN 2.
case ${EAPI} in
	2) : ;;
	*) die "No way! EAPI older than 2 is not supported." ;;
esac

# @ECLASS-VARIABLE: KDEBASE
# @DESCRIPTION:
# This gets set to a non-zero value when a package is considered a kde or
# koffice ebuild.

if [[ "${CATEGORY}" == "kde-base" ]]; then
	debug-print "${ECLASS}: KDEBASE ebuild recognized"
	KDEBASE="kde-base"
fi

# is this a koffice ebuild?
if [[ "${KMNAME}" == "koffice" || "${PN}" == "koffice" ]]; then
	debug-print "${ECLASS}: KOFFICE ebuild recognized"
	KDEBASE="koffice"
fi

# @ECLASS-VARIABLE: KDE_SLOTS
# @DESCRIPTION:
# The slots used by all KDE versions later than 4.0. The live-ebuilds use
# KDE_LIVE_SLOTS instead.
KDE_SLOTS=( "kde-4" "4.1" "4.2" )

# @ECLASS-VARIABLE: KDE_LIVE_SLOTS
# @DESCRIPTION:
# The slots used by all KDE live versions.
KDE_LIVE_SLOTS=( "live" )

# @FUNCTION: buildsycoca
# @DESCRIPTION:
# Function to rebuild the KDE System Configuration Cache.
# All KDE ebuilds should run this in pkg_postinst and pkg_postrm.
#
# Note that kde4-base.eclass already does this.
buildsycoca() {
	debug-print-function ${FUNCNAME} "$@"

	if [[ -x ${KDEDIR}/bin/kbuildsycoca4 && -z "${ROOT%%/}" ]]; then
		# Make sure tha cache file exists, or kbuildsycoca4 will fail
		touch "${KDEDIR}/share/kde4/services/ksycoca4"

		# We have to unset DISPLAY and DBUS_SESSION_BUS_ADDRESS, the ones
		# in the user's environment (through su [without '-']) may cause
		# kbuildsycoca4 to hang.

		ebegin "Running kbuildsycoca4 to build global database"
		# This is needed because we support multiple kde versions installed together.
		XDG_DATA_DIRS="/usr/share:${KDEDIRS//:/\/share:}/share:/usr/local/share" \
			DISPLAY="" DBUS_SESSION_BUS_ADDRESS="" \
			${KDEDIR}/bin/kbuildsycoca4 --global --noincremental &> /dev/null
		eend $?
	fi
}

# @FUNCTION: comment_all_add_subdirectory
# @USAGE: [list of directory names]
# @DESCRIPTION:
# Recursively comment all add_subdirectory instructions in listed directories,
# except those in cmake/.
comment_all_add_subdirectory() {
	find "$@" -name CMakeLists.txt -print0 | grep -vFzZ "./cmake" | \
		xargs -0 sed -i -e '/add_subdirectory/s/^/#DONOTCOMPILE /' -e '/ADD_SUBDIRECTORY/s/^/#DONOTCOMPILE /' || \
		die "${LINENO}: Initial sed died"
}

# @ECLASS-VARIABLE: KDE_LINGUAS
# @DESCRIPTION:
# This is a whitespace-separated list of translations this ebuild supports.
# These translations are automatically added to IUSE. Therefore ebuilds must set
# this variable before inheriting any eclasses. To enable only selected
# translations, ebuilds must call enable_selected_linguas(). kde4-base.eclass does
# this for you.
#
# Example: KDE_LINGUAS="en_GB de nl"
for _lingua in ${KDE_LINGUAS}; do
	IUSE="${IUSE} linguas_${_lingua}"
done

# @FUNCTION: enable_selected_linguas
# @DESCRIPTION:
# Enable translations based on LINGUAS settings and translations supported by
# the package (see KDE_LINGUAS). By default, translations are found in "${S}"/po
# but this default can be overridden by defining KDE_LINGUAS_DIR.
enable_selected_linguas() {
	local lingua

	for lingua in ${KDE_LINGUAS}; do
		if [ -e "${S}"/po/"${lingua}".po ]; then
			mv "${S}"/po/"${lingua}".po "${S}"/po/"${lingua}".po.old
		fi
	done
	comment_all_add_subdirectory "${KDE_LINGUAS_DIR:-${S}/po}"
	for lingua in ${LINGUAS}; do
		if [ -d "${S}"/po/"${lingua}" ]; then
			sed -e "/add_subdirectory([[:space:]]*${lingua}[[:space:]]*)[[:space:]]*$/ s/^#DONOTCOMPILE //" \
				-e "/ADD_SUBDIRECTORY([[:space:]]*${lingua}[[:space:]]*)[[:space:]]*$/ s/^#DONOTCOMPILE //" \
				-i "${KDE_LINGUAS_DIR:-${S}/po}"/CMakeLists.txt || die "Sed to uncomment linguas_${lingua} failed."
		fi
		if [ -e "${S}"/po/"${lingua}".po.old ]; then
			mv "${S}"/po/"${lingua}".po.old "${S}"/po/"${lingua}".po
		fi
	done
}

# FIXME: descripton too brief?
# @FUNCTION: kdebase_toplevel_cmakelists
# @DESCRIPTION:
# replace includes for live ebuilds with optional requests
kdebase_toplevel_cmakelist() {
	insert=$(sed -e '/macro_optional_find_package/!d' < "${ESVN_WC_PATH}"/CMakeLists.txt)
	at=$(sed -n '/^include[[:space:]]*(/=' < "${S}"/CMakeLists.txt | sed -n '$p')
	for line in ${insert}; do
		sed "${at}a${line}" -i  "${S}"/CMakeLists.txt
	done
}

# @FUNCTION: koffice_fix_libraries
# @DESCRIPTION:
# replace the weird koffice lib search with hardcoded one, so it
# actually builds and works.
koffice_fix_libraries() {
	local LIB_ARRAY R_QT_kostore R_BAS_kostore R_BAS_koodf R_KROSS_kokross R_QT_komain
	local R_CMS_pigmentcms R_BAS_pigmentcms R_BAS_koresources R_BAS_flake R_BAS_koguiutils
	local R_BAS_kopageapp R_BAS_kotext R_BAS_kowmf libname R
	case ${PN} in
		koffice-data|koffice-libs)
			;;
		*)
			### basic array
			LIB_ARRAY="kostore koodf kokross komain pigmentcms koresources flake koguiutils kopageapp kotext kowmf"
			### dep array
			R_QT_kostore="\"/usr/$(get_libdir)/qt4/libQtCore.so\"
				\"/usr/$(get_libdir)/qt4/libQtXml.so\"
				\"${KDEDIR}/$(get_libdir)/libkdecore.so\""
			R_BAS_kostore="libkostore ${R_QT_kostore}"
			R_BAS_koodf="libkoodf ${R_BAS_kostore}"
			R_KROSS_kokross="
				\"${KDEDIR}/$(get_libdir)/libkrossui.so\"
				\"${KDEDIR}/$(get_libdir)/libkrosscore.so\""
			R_BAS_kokross="libkokross ${R_BAS_koodf} ${R_KROSS_kokross}"
			R_QT_komain="\"/usr/$(get_libdir)/qt4/libQtGui.so\""
			R_BAS_komain="libkomain ${R_BAS_koodf} ${R_QT_komain}"
			R_CMS_pigmentcms="\"/usr/$(get_libdir)/liblcms.so\""
			R_BAS_pigmentcms="libpigmentcms ${R_BAS_komain} ${R_CMS_pigmentcms}"
			R_BAS_koresources="libkoresources ${R_BAS_pigmentcms}"
			R_BAS_flake="libflake ${R_BAS_pigmentcms}"
			R_BAS_koguiutils="libkoguiutils libkoresources libflake ${R_BAS_pigmentcms}"
			R_BAS_kopageapp="libkopageapp ${R_BAS_koguitls}"
			R_BAS_kotext="libkotext libkoresources libflake ${R_BAS_pigmentcms}"
			### additional unmentioned stuff
			R_BAS_kowmf="libkowmf"
			for libname in ${LIB_ARRAY}; do
				echo "Fixing library ${libname} with hardcoded path"
				for libpath in $(eval "echo \$R_BAS_${libname}"); do
					if [[ "${libpath}" != "\"/usr/"* ]]; then
						R="${R} \"${KDEDIR}/$(get_libdir)/${libpath}.so\""
					else
						R="${R} ${libpath}"
					fi
				done
				find ${S} -name CMakeLists.txt -print| xargs -i \
					sed -i \
						-e "s: ${libname} : ${R} :g" \
						-e "s: ${libname}): ${R}):g" \
						-e "s:(${libname} :(${R} :g" \
						-e "s:(${libname}):(${R}):g" \
						-e "s: ${libname}$: ${R}:g" \
					{} || die "Fixing library names failed."
			done
			;;
	esac
}
# @FUNCTION: get_build_type
# @DESCRIPTION:
# Determine whether we are using live ebuild or normal tbzs.
get_build_type() {
	if [[ "${SLOT}" == "live" || "${PV}" == 9999* ]]; then
		BUILD_TYPE="live"
	else
		BUILD_TYPE="normal"
	fi
	export BUILD_TYPE
}

# @FUNCTION: get_latest_kdedir
# @DESCRIPTION:
# We set up KDEDIR according to the latest KDE version installed; installing our
# package for all available installs is just insane.
# We can check for kdelibs because it is the most basic package; no KDE package
# working without it. This might be changed in future.
get_latest_kdedir() {
	if [[ "${NEED_KDE}" == "latest" && "${KDEBASE}" != "kde-base"  ]]; then
		case ${KDE_WANTED} in
			# note this will need to be updated as stable moves and so on
			live)
				_versions="9999 4.1.69 4.1.0"
				;;
			snapshot)
				_versions="4.1.69 4.1.0 9999"
				;;
			testing)
				_versions="4.1.0 4.1.69 9999"
				;;
			stable)
				_versions="4.1.0 4.1.69 9999"
				;;
			*) die "KDE_WANTED=${KDE_WANTED} not supported here." ;;
		esac
		# check if exists and fallback as we go
		for X in ${_versions}; do
			if has_version ">=kde-base/kdelibs-${X}"; then
				# figure out which X we are in and set it into _kdedir
				case ${X} in
					# also keep track here same for kde_wanted
					9999)
						_kdedir="live"
						break
					;;
					4.1.69)
						_kdedir="4.2"
						break
					;;
					4.1.0)
						_kdedir="4.1"
						break
					;;
				esac
			fi
		done
	fi
}

# Functions handling KMLOADLIBS and KMSAVELIBS

# @FUNCTION: save_library_dependencies
# @DESCRIPTION:
# Add exporting CMake dependencies for current package
save_library_dependencies() {
	local depsfile="${T}/${PN}:${SLOT}"

	echo "Saving library dependendencies in ${depsfile##*/}"
	echo "EXPORT_LIBRARY_DEPENDENCIES(\"${depsfile}\")" >> "${S}/CMakeLists.txt" || \
		die "Failed to save the library dependencies."
}

# @FUNCTION: install_library_dependencies
# @DESCRIPTION:
# Install generated CMake library dependencies to /var/lib/kde
install_library_dependencies() {
	local depsfile="${T}/${PN}:${SLOT}"
	echo "Installing library dependendencies as ${depsfile##*/}"
	insinto /var/lib/kde
	doins "${depsfile}" || die "Failed to install library dependencies."
}

# @FUNCTION: load_library_dependencies
# @DESCRIPTION:
# Inject specified library dependencies in current package
load_library_dependencies() {
	local pn i depsfile
	echo "Injecting library dependendencies from '${KMLOADLIBS}'"

	i=0
	for pn in ${KMLOADLIBS} ; do
		((i++))
		depsfile="/var/lib/kde/${pn}:${SLOT}"
		[[ -r "${depsfile}" ]] || die "Depsfile '${depsfile}' not accessible. You probably need to reinstall ${pn}."
		sed -i -e "${i}iINCLUDE(\"${depsfile}\")" "${S}/CMakeLists.txt" || \
			die "Failed to include library dependencies for ${pn}"
	done
}