/[gentoo-x86]/eclass/java-vm-2.eclass
Gentoo

Contents of /eclass/java-vm-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.45 - (hide annotations) (download)
Wed Jul 18 16:54:55 2012 UTC (2 years, 5 months ago) by sera
Branch: MAIN
Changes since 1.44: +6 -6 lines
Add ROOT support, patch by vapier. #416341

1 sera 1.43 # Copyright 1999-2012 Gentoo Foundation
2 nichoj 1.1 # Distributed under the terms of the GNU General Public License v2
3 sera 1.45 # $Header: /var/cvsroot/gentoo-x86/eclass/java-vm-2.eclass,v 1.44 2012/06/12 09:17:33 sera Exp $
4 nichoj 1.9
5 sera 1.44 # @ECLASS: java-vm-2.eclass
6     # @MAINTAINER:
7     # java@gentoo.org
8     # @BLURB: Java Virtual Machine eclass
9     # @DESCRIPTION:
10 nichoj 1.9 # This eclass provides functionality which assists with installing
11     # virtual machines, and ensures that they are recognized by java-config.
12 nichoj 1.1
13 sera 1.39 inherit eutils fdo-mime multilib pax-utils prefix
14 nichoj 1.1
15 sera 1.44 EXPORT_FUNCTIONS pkg_setup pkg_postinst pkg_prerm pkg_postrm
16    
17 sera 1.43 RDEPEND="
18     =dev-java/java-config-2*
19     || ( app-admin/eselect-java <dev-java/java-config-2.2 )"
20     DEPEND="${RDEPEND}"
21 ssuominen 1.32 has "${EAPI}" 0 1 && DEPEND="${DEPEND} >=sys-apps/portage-2.1"
22 betelgeuse 1.26
23 nichoj 1.1 export WANT_JAVA_CONFIG=2
24    
25 sera 1.44
26     # @ECLASS-VARIABLE: JAVA_VM_CONFIG_DIR
27     # @INTERNAL
28     # @DESCRIPTION:
29     # Where to place the vm env file.
30 nichoj 1.1 JAVA_VM_CONFIG_DIR="/usr/share/java-config-2/vm"
31 sera 1.44
32     # @ECLASS-VARIABLE: JAVA_VM_DIR
33     # @INTERNAL
34     # @DESCRIPTION:
35     # Base directory for vm links.
36 nichoj 1.1 JAVA_VM_DIR="/usr/lib/jvm"
37 sera 1.44
38     # @ECLASS-VARIABLE: JAVA_VM_SYSTEM
39     # @INTERNAL
40     # @DESCRIPTION:
41     # Link for system-vm
42 caster 1.35 JAVA_VM_SYSTEM="/etc/java-config-2/current-system-vm"
43 sera 1.44
44     # @ECLASS-VARIABLE: JAVA_VM_BUILD_ONLY
45     # @DESCRIPTION:
46     # Set to YES to mark a vm as build-only.
47 ali_bush 1.28 JAVA_VM_BUILD_ONLY="${JAVA_VM_BUILD_ONLY:-FALSE}"
48 nichoj 1.1
49 sera 1.44
50     # @FUNCTION: java-vm-2_pkg_setup
51     # @DESCRIPTION:
52     # default pkg_setup
53     #
54     # Initialize vm handle.
55 betelgeuse 1.17
56     java-vm-2_pkg_setup() {
57     if [[ "${SLOT}" != "0" ]]; then
58     VMHANDLE=${PN}-${SLOT}
59     else
60     VMHANDLE=${PN}
61     fi
62     }
63 nichoj 1.1
64 sera 1.44
65     # @FUNCTION: java-vm-2_pkg_postinst
66     # @DESCRIPTION:
67     # default pkg_postinst
68     #
69     # Set the generation-2 system VM and Java plugin, if it isn't set or the
70     # setting is invalid. Also update mime database.
71    
72 nichoj 1.1 java-vm-2_pkg_postinst() {
73 caster 1.35 # Note that we cannot rely on java-config here, as it will silently recognize
74     # e.g. icedtea6-bin as valid system VM if icedtea6 is set but invalid (e.g. due
75     # to the migration to icedtea-6)
76 sera 1.45 if [[ ! -L "${ROOT}${JAVA_VM_SYSTEM}" ]]; then
77 nichoj 1.1 java_set_default_vm_
78 caster 1.35 else
79 sera 1.45 local current_vm_path=$(readlink "${ROOT}${JAVA_VM_SYSTEM}")
80     local current_vm=$(basename "${ROOT}${current_vm_path}")
81     if [[ ! -L "${ROOT}${JAVA_VM_DIR}/${current_vm}" ]]; then
82 caster 1.35 java_set_default_vm_
83     fi
84 nichoj 1.1 fi
85    
86 nichoj 1.15 java-vm_check-nsplugin
87     java_mozilla_clean_
88 betelgeuse 1.16 fdo-mime_desktop_database_update
89 nichoj 1.15 }
90    
91 sera 1.44
92     # @FUNCTION: java-vm_check-nsplugin
93     # @INTERNAL
94     # @DESCRIPTION:
95     # Check if the nsplugin needs updating
96    
97 nichoj 1.15 java-vm_check-nsplugin() {
98     local libdir
99     if [[ ${VMHANDLE} =~ emul-linux-x86 ]]; then
100     libdir=lib32
101     else
102     libdir=lib
103     fi
104 caster 1.33
105     has ${EAPI:-0} 0 1 2 && ! use prefix && EPREFIX=
106    
107 nichoj 1.9 # Install a default nsplugin if we don't already have one
108 sera 1.40 if in_iuse nsplugin && use nsplugin; then
109 sera 1.45 if [[ ! -f "${ROOT}${EPREFIX}"/usr/${libdir}/nsbrowser/plugins/javaplugin.so ]]; then
110 nichoj 1.15 einfo "No system nsplugin currently set."
111     java-vm_set-nsplugin
112 caster 1.12 else
113     einfo "System nsplugin is already set, not changing it."
114 nichoj 1.3 fi
115 caster 1.12 einfo "You can change nsplugin with eselect java-nsplugin."
116 nichoj 1.3 fi
117 nichoj 1.15 }
118 nichoj 1.3
119 sera 1.44
120     # @FUNCTION: java-vm_set-nsplugin
121     # @INTERNAL
122     # @DESCRIPTION:
123     # Set the nsplugin implemetation.
124    
125 nichoj 1.15 java-vm_set-nsplugin() {
126     local extra_args
127     if use amd64; then
128     if [[ ${VMHANDLE} =~ emul-linux-x86 ]]; then
129     extra_args="32bit"
130     else
131     extra_args="64bit"
132     fi
133     einfo "Setting ${extra_args} nsplugin to ${VMHANDLE}"
134     else
135     einfo "Setting nsplugin to ${VMHANDLE}..."
136     fi
137     eselect java-nsplugin set ${extra_args} ${VMHANDLE}
138 nichoj 1.1 }
139    
140 sera 1.44
141     # @FUNCTION: java-vm-2_pkg_prerm
142     # @DESCRIPTION:
143     # default pkg_prerm
144     #
145     # Warn user if removing system-vm.
146    
147 nichoj 1.1 java-vm-2_pkg_prerm() {
148 caster 1.35 # Although REPLACED_BY_VERSION is EAPI=4, we shouldn't need to check EAPI for this use case
149 caster 1.36 if [[ "$(GENTOO_VM="" java-config -f 2>/dev/null)" == "${VMHANDLE}" && -z "${REPLACED_BY_VERSION}" ]]; then
150 betelgeuse 1.22 ewarn "It appears you are removing your system-vm!"
151     ewarn "Please run java-config -L to list available VMs,"
152     ewarn "then use java-config -S to set a new system-vm!"
153     fi
154 nichoj 1.1 }
155    
156 sera 1.44
157     # @FUNCTION: java-vm-2_pkg_postrm
158     # @DESCRIPTION:
159     # default pkg_postrm
160     #
161     # Update mime database.
162    
163 betelgeuse 1.16 java-vm-2_pkg_postrm() {
164     fdo-mime_desktop_database_update
165     }
166    
167 sera 1.44
168     # @FUNCTION: java_set_default_vm_
169     # @INTERNAL
170     # @DESCRIPTION:
171     # Set system-vm.
172    
173 nichoj 1.1 java_set_default_vm_() {
174     java-config-2 --set-system-vm="${VMHANDLE}"
175    
176 nichoj 1.9 einfo " ${P} set as the default system-vm."
177 nichoj 1.1 }
178    
179 sera 1.44
180     # @FUNCTION: get_system_arch
181     # @DESCRIPTION:
182     # Get Java specific arch name.
183    
184 nichoj 1.1 get_system_arch() {
185     local sarch
186     sarch=$(echo ${ARCH} | sed -e s/[i]*.86/i386/ -e s/x86_64/amd64/ -e s/sun4u/sparc/ -e s/sparc64/sparc/ -e s/arm.*/arm/ -e s/sa110/arm/)
187     if [ -z "${sarch}" ]; then
188     sarch=$(uname -m | sed -e s/[i]*.86/i386/ -e s/x86_64/amd64/ -e s/sun4u/sparc/ -e s/sparc64/sparc/ -e s/arm.*/arm/ -e s/sa110/arm/)
189     fi
190     echo ${sarch}
191     }
192    
193 sera 1.44
194     # @FUNCTION: set_java_env
195     # @DESCRIPTION:
196     # Installs a vm env file.
197    
198 nichoj 1.1 # TODO rename to something more evident, like install_env_file
199     set_java_env() {
200 betelgeuse 1.20 debug-print-function ${FUNCNAME} $*
201 caster 1.33
202 grobian 1.34 if has ${EAPI:-0} 0 1 2 && ! use prefix ; then
203     ED="${D}"
204     EPREFIX=""
205     fi
206 caster 1.33
207 nichoj 1.1 local platform="$(get_system_arch)"
208 caster 1.33 local env_file="${ED}${JAVA_VM_CONFIG_DIR}/${VMHANDLE}"
209     local old_env_file="${ED}/etc/env.d/java/20${P}"
210 betelgeuse 1.20 if [[ ${1} ]]; then
211     local source_env_file="${1}"
212     else
213     local source_env_file="${FILESDIR}/${VMHANDLE}.env"
214     fi
215 nichoj 1.1
216     if [[ ! -f ${source_env_file} ]]; then
217     die "Unable to find the env file: ${source_env_file}"
218     fi
219    
220     dodir ${JAVA_VM_CONFIG_DIR}
221     sed \
222     -e "s/@P@/${P}/g" \
223     -e "s/@PN@/${PN}/g" \
224     -e "s/@PV@/${PV}/g" \
225     -e "s/@PF@/${PF}/g" \
226 sera 1.40 -e "s/@SLOT@/${SLOT}/g" \
227 nichoj 1.1 -e "s/@PLATFORM@/${platform}/g" \
228 caster 1.30 -e "s/@LIBDIR@/$(get_libdir)/g" \
229 nichoj 1.1 -e "/^LDPATH=.*lib\\/\\\"/s|\"\\(.*\\)\"|\"\\1${platform}/:\\1${platform}/server/\"|" \
230 betelgeuse 1.31 < "${source_env_file}" \
231     > "${env_file}" || die "sed failed"
232 nichoj 1.1
233 ali_bush 1.28 (
234     echo "VMHANDLE=\"${VMHANDLE}\""
235 maekke 1.29 echo "BUILD_ONLY=\"${JAVA_VM_BUILD_ONLY}\""
236 betelgeuse 1.31 ) >> "${env_file}"
237 swegener 1.13
238 caster 1.33 eprefixify ${env_file}
239    
240 nichoj 1.1 [[ -n ${JAVA_PROVIDE} ]] && echo "PROVIDES=\"${JAVA_PROVIDE}\"" >> ${env_file}
241    
242 betelgeuse 1.31 local java_home=$(source "${env_file}"; echo ${JAVA_HOME})
243 nichoj 1.1 [[ -z ${java_home} ]] && die "No JAVA_HOME defined in ${env_file}"
244    
245     # Make the symlink
246 caster 1.33 dodir "${JAVA_VM_DIR}"
247 grobian 1.34 dosym ${java_home#${EPREFIX}} ${JAVA_VM_DIR}/${VMHANDLE} \
248 nichoj 1.10 || die "Failed to make VM symlink at ${JAVA_VM_DIR}/${VMHANDLE}"
249 nichoj 1.1 }
250    
251 sera 1.44
252     # @FUNCTION: java-vm_set-pax-markings
253     # @DESCRIPTION:
254 sera 1.39 # Set PaX markings on all JDK/JRE executables to allow code-generation on
255     # the heap by the JIT compiler.
256     #
257     # The markings need to be set prior to the first invocation of the the freshly
258     # built / installed VM. Be it before creating the Class Data Sharing archive or
259     # generating cacerts. Otherwise a PaX enabled kernel will kill the VM.
260     # Bug #215225 #389751
261     #
262 sera 1.44 # @CODE
263     # Parameters:
264     # $1 - JDK/JRE base directory.
265 sera 1.39 #
266 sera 1.44 # Examples:
267     # java-vm_set-pax-markings "${S}"
268     # java-vm_set-pax-markings "${ED}"/opt/${P}
269     # @CODE
270    
271 sera 1.39 java-vm_set-pax-markings() {
272     debug-print-function ${FUNCNAME} "$*"
273     [[ $# -ne 1 ]] && die "${FUNCNAME}: takes exactly one argument"
274     [[ ! -f "${1}"/bin/java ]] \
275     && die "${FUNCNAME}: argument needs to be JDK/JRE base directory"
276    
277     local executables=( "${1}"/bin/* )
278     [[ -d "${1}"/jre ]] && executables+=( "${1}"/jre/bin/* )
279    
280     # Usally disabeling MPROTECT is sufficent
281     local pax_markings="m"
282     # On x86 for heap sizes over 700MB disable SEGMEXEC and PAGEEXEC as well.
283     use x86 && pax_markings="msp"
284    
285     pax-mark ${pax_markings} $(list-paxables "${executables[@]}")
286     }
287    
288 sera 1.44
289     # @FUNCTION: java-vm_revdep-mask
290     # @DESCRIPTION:
291 caster 1.19 # Installs a revdep-rebuild control file which SEARCH_DIR_MASK set to the path
292     # where the VM is installed. Prevents pointless rebuilds - see bug #177925.
293     # Also gives a notice to the user.
294     #
295 sera 1.44 # @CODE
296     # Parameters:
297     # $1 - Path of the VM (defaults to /opt/${P} if not set)
298     #
299     # Examples:
300     # java-vm_revdep-mask
301     # java-vm_revdep-mask /path/to/jdk/
302 caster 1.19 #
303 sera 1.44 # @CODE
304    
305 caster 1.19 java-vm_revdep-mask() {
306 caster 1.33 if has ${EAPI:-0} 0 1 2 && ! use prefix; then
307     ED="${D}"
308     EPREFIX=
309     fi
310    
311     local VMROOT="${1-"${EPREFIX}"/opt/${P}}"
312 caster 1.19
313     dodir /etc/revdep-rebuild/
314 caster 1.33 echo "SEARCH_DIRS_MASK=\"${VMROOT}\""> "${ED}/etc/revdep-rebuild/61-${VMHANDLE}"
315 caster 1.19 }
316 nichoj 1.1
317 sera 1.44
318     # @FUNCTION: java-vm_sandbox-predict
319     # @DESCRIPTION:
320 sera 1.37 # Install a sandbox control file. Specified paths won't cause a sandbox
321     # violation if opened read write but no write takes place. See bug 388937#c1
322     #
323 sera 1.44 # @CODE
324     # Examples:
325     # java-vm_sandbox-predict /dev/random /proc/self/coredump_filter
326     # @CODE
327    
328 sera 1.37 java-vm_sandbox-predict() {
329     debug-print-function ${FUNCNAME} "$*"
330     [[ -z "${1}" ]] && die "${FUNCNAME} takes at least one argument"
331    
332     has ${EAPI:-0} 0 1 2 && ! use prefix && ED="${D}"
333    
334     local path path_arr=("$@")
335 ferringb 1.41 # subshell this to prevent IFS bleeding out dependant on bash version.
336     # could use local, which *should* work, but that requires a lot of testing.
337 floppym 1.42 path=$(IFS=":"; echo "${path_arr[*]}")
338 sera 1.37 dodir /etc/sandbox.d
339     echo "SANDBOX_PREDICT=\"${path}\"" > "${ED}/etc/sandbox.d/20${VMHANDLE}" \
340     || die "Failed to write sandbox control file"
341     }
342    
343 sera 1.44
344     # @FUNCTION: java_get_plugin_dir_
345     # @INTERNAL
346     # @DESCRIPTION:
347     # Get the java plugin dir.
348    
349 nichoj 1.1 java_get_plugin_dir_() {
350 caster 1.33 has ${EAPI:-0} 0 1 2 && ! use prefix && EPREFIX=
351     echo "${EPREFIX}"/usr/$(get_libdir)/nsbrowser/plugins
352 nichoj 1.1 }
353    
354 sera 1.44
355     # @FUNCTION: install_mozilla_plugin
356     # @DESCRIPTION:
357     # Register a netscape java-plugin.
358    
359 nichoj 1.1 install_mozilla_plugin() {
360 caster 1.23 local plugin="${1}"
361     local variant="${2}"
362 nichoj 1.1
363 caster 1.33 has ${EAPI:-0} 0 1 2 && ! use prefix && ED="${D}"
364     if [[ ! -f "${ED}/${plugin}" ]]; then
365     die "Cannot find mozilla plugin at ${ED}/${plugin}"
366 nichoj 1.1 fi
367    
368 caster 1.23 if [[ -n "${variant}" ]]; then
369     variant="-${variant}"
370     fi
371    
372     local plugin_dir="/usr/share/java-config-2/nsplugin"
373     dodir "${plugin_dir}"
374     dosym "${plugin}" "${plugin_dir}/${VMHANDLE}${variant}-javaplugin.so"
375 nichoj 1.1 }
376    
377 sera 1.44
378     # @FUNCTION: java_mozilla_clean_
379     # @INTERNAL
380     # @DESCRIPTION:
381     # Because previously some ebuilds installed symlinks outside of pkg_install
382     # and are left behind, which forces you to manualy remove them to select the
383     # jdk/jre you want to use for java
384    
385 nichoj 1.1 java_mozilla_clean_() {
386     local plugin_dir=$(java_get_plugin_dir_)
387     for file in ${plugin_dir}/javaplugin_*; do
388     rm -f ${file}
389     done
390     for file in ${plugin_dir}/libjavaplugin*; do
391     rm -f ${file}
392     done
393     }

  ViewVC Help
Powered by ViewVC 1.1.20