commit: 2ffcd1ddd6ff4a65a01133b2ed46597a6d4863e8 Author: Michał Górny <mgorny <AT> gentoo <DOT> org> AuthorDate: Sun Dec 7 23:48:58 2014 +0000 Commit: Michał Górny <mgorny <AT> gentoo <DOT> org> CommitDate: Mon Dec 8 22:57:28 2014 +0000 URL: http://sources.gentoo.org/gitweb/?p=proj/eselect.git;a=commit;h=2ffcd1dd
opengl: rewrite not to play with symlinks Rewrite eselect-opengl to manipulate configuration files only. Properly configuring the dynamic linker and xorg server, we can avoid doing anything with libGL.so and related files, and guarantee that everything is built against xorg-x11 implementation. --- modules/opengl.eselect | 201 +++++++++---------------------------------------- 1 file changed, 37 insertions(+), 164 deletions(-) diff --git a/modules/opengl.eselect b/modules/opengl.eselect index 3f59a19..40b448e 100644 --- a/modules/opengl.eselect +++ b/modules/opengl.eselect @@ -17,10 +17,11 @@ DESCRIPTION="Manage the OpenGL implementation used by your system" MAINTAINER="x...@gentoo.org" SVN_DATE='$Date$' VERSION=$(svn_date_to_version "${SVN_DATE}" ) -EBUILD_VERSION="1.2.1" +EBUILD_VERSION="1.3.0" # Our data -ENV_FILE="${EROOT}/etc/env.d/03opengl" +ENV_FILE="${EROOT}/etc/env.d/000opengl" +XORGD_FILE="${EROOT}/etc/X11/xorg.conf.d/20opengl.conf" PREFIX="${EROOT}/usr" DST_PREFIX="${EROOT}/usr" unset IGNORE_MISSING @@ -42,7 +43,7 @@ get_current_implementation() { } get_implementations() { - local ret + local -a ret local libdir local dir local dir_name @@ -52,124 +53,32 @@ get_implementations() { for dir in "${PREFIX}/${libdir}"/opengl/* ; do dir_name=$(basename "${dir}") [[ -d ${dir} && ${dir_name} != "global" ]] || continue - has ${dir_name} ${ret} && continue - ret=${ret:+${ret} }${dir_name} + has ${dir_name} "${ret[@]}" && continue + ret+=( "${dir_name}" ) done done - echo ${ret} -} - -# 1: file -# 2: workdir -upgrade_file() { - local file=$1 - local filename - local workdir=$2 - local linkfile=$(relative_name ${file} "${workdir}") - - [[ -f ${file} ]] || return - filename=$(basename "${file}") - - if [[ -f ${filename} || ( -L ${filename} && ! -e ${filename} ) ]] ; then - rm -f "${filename}"* || die -q "Failed to delete ${workdir}/${filename}" - fi - - #echo "DEBUG: ln -s \"${linkfile}\" \"${filename}\"" - if [[ "x${REMOVE_ONLY}" == "xfalse" ]]; then - ln -s "${linkfile}" "${filename}" || die -q "Failed to create symlink ${workdir}/${filename}" - fi -} - -setup_soname_symlinks() { - local file=$1 - local target=$2 - local soname - local scanner - - # if we have .so or dylib we need to make its soname symlinked - # in order to be easy to find and faster to grab - if [[ ${file} == *.so || ${file} == *.dylib ]] ; then - [[ ${file} == *.so ]] && scanner=scanelf || scanner="scanmacho" - soname=$(${scanner} -qBF '%S#p' "${file}" | head -n1) - [[ ${file} == *.so ]] && soname="${file%/*}"/${soname} - upgrade_file "${soname}" "${target}" - fi -} - -setup_lib_symlinks() { - local profile_libdir=$1 - local target=$2 - local file - - mkdir -p "${target}" || die "Failed to create ${target}" - - pushd "${target}" &> /dev/null - # Note that lafiles are removed here and never enabled again - for file in libGL{,core}.la ; do - rm -f "${file}"* || die -q "Failed to delete ${file}" - done - - for file in "${profile_libdir}"/lib{EGL,GL*,OpenVG}{,core}.{so,dylib,a}; do - upgrade_file "${file}" "${target}" - setup_soname_symlinks "${file}" "${target}" - done - popd &> /dev/null -} - -setup_extensions_symlinks() { - local src=$1 - local target=$2 - - if [[ -e ${src} ]] ; then - mkdir -p "${target}" || die "Failed to create ${target}" - pushd "${target}" &> /dev/null - # First remove old cruft symlinks - for file in lib{wfb,glx,dri,dri2}.{so,dylib,a}; do - rm -f "${file}" || die -q "Failed to delete ${targetdir}/${file}" - done - - # regenerate symlinks - for file in "${src}"/*.{so,dylib,a}; do - upgrade_file "${file}" "${target}" - setup_soname_symlinks "${file}" "${target}" - done - popd &> /dev/null - fi + has xorg-x11 "${ret[@]}" || ret+=( xorg-x11 ) + echo "${ret[*]}" } -setup_includes_symlinks() { - local target=$1 - local files=$2 - local file - local mdir=$3 - local sdir - - shift 2 - mkdir -p "${target}" || die "Failed to create ${target}" - pushd "${target}" &> /dev/null - for file in ${files}; do - for sdir in "$@"; do - if [[ -e ${sdir}/${file} ]]; then - upgrade_file "${sdir}/${file}" "${target}" - break - fi - done - done - test -d ${mdir} && for file in ${mdir}/*.h; do - upgrade_file "${file}" "${target}" - done - popd &> /dev/null +# takes list of paths +# outputs the file contents to stderr +write_xorg_confd() { + local dir + echo 'Section "Files"' + for dir; do + echo " ModulePath \"${dir}\"" + done + echo 'EndSection' } set_new_implementation() { local gl_implem=$1 local avail_implems=$(get_implementations) local libdir - local moduledir - local gl_dir - local gl_local - local -A gl_header + local ldpath + local -a xorgmodpath # Set a sane umask... bug #83115 umask 022 @@ -178,7 +87,7 @@ set_new_implementation() { die -q "Invalid opengl implementation selected." fi - if [[ -z ${IGNORE_MISSING+1} ]]; then + if [[ -z ${IGNORE_MISSING+1} && ${gl_implem} != xorg-x11 ]]; then local found_libgl for libdir in $(list_libdirs); do [[ ${ROOT} != / ]] && libdir=${libdir#${EROOT}} @@ -199,6 +108,9 @@ set_new_implementation() { if [[ -f ${ENV_FILE} ]] ; then rm -f "${ENV_FILE}" || die -q "Failed to remove ${ENV_FILE}" fi + if [[ -f ${XORGD_FILE} ]] ; then + rm -f "${XORGD_FILE}" || die -q "Failed to remove ${ENV_FILE}" + fi for libdir in $(list_libdirs); do # Set libdir correctly to EROOT @@ -208,70 +120,31 @@ set_new_implementation() { # is a real lib dir, not a symlink [[ -d ${PREFIX}/${libdir}/opengl && ! -h ${PREFIX}/${libdir} ]] || continue - # Set moduledir - # only xorg module is used now can change to case when we add other - # implementations. - moduledir="xorg/modules" - # Check if opengl implementation directory exists # and use xorg-x11 as fallback (mesa) # If even mesa is not around then simply die - if [[ -d "${PREFIX}/${libdir}/opengl/${gl_implem}" ]] ; then - gl_local="${gl_implem}" - REMOVE_ONLY="false" # global variable - else - # we are moving to implementation that does not have any support - # for specified libdir (ie 32bit libs for mesa) so we should - # remove the current symlinks and continue like nothing happened. - REMOVE_ONLY="true" # global variable - gl_local=$(get_current_implementation) - if ! has ${gl_local} ${avail_implems}; then - # skipping the libdir cause there was no profile actually - # selected before - continue 2 + if [[ -d ${PREFIX}/${libdir}/opengl/${gl_implem} ]] ; then + # we need this relative to ROOT + ldpath=${ldpath:+${ldpath}:}${PREFIX#${ROOT}}/${libdir}/opengl/${gl_implem}/lib + if [[ -d ${PREFIX}/${libdir}/opengl/${gl_implem}/extensions ]]; then + xorgmodpath+=( + "${PREFIX#${ROOT}}/${libdir}/opengl/${gl_implem}" + ) fi fi - - setup_lib_symlinks \ - "${PREFIX}/${libdir}/opengl/${gl_local}/lib" \ - "${DST_PREFIX}/${libdir}" - - # check if the implementation has TLS libs around - # and install those if around - [[ -e ${PREFIX}/${libdir}/opengl/${gl_local}/lib/tls ]] && \ - setup_lib_symlinks \ - "${PREFIX}/${libdir}/opengl/${gl_local}/lib/tls" \ - "${DST_PREFIX}/${libdir}/tls" - - setup_extensions_symlinks \ - "${PREFIX}/${libdir}/opengl/${gl_local}/extensions" \ - "${DST_PREFIX}/${libdir}/${moduledir}/extensions" - - gl_header[GL]="gl.h glx.h glxtokens.h glext.h glxext.h glxmd.h glxproto.h" - gl_header[GLES]="egl.h gl_extensions.h glext.h gl.h glplatform.h" - gl_header[GLES2]="gl2ext.h gl2.h gl2platform.h" - gl_header[GLES3]="gl3ext.h gl3.h gl3platform.h" - gl_header[EGL]="eglext.h egl.h eglplatform.h" - gl_header[KHR]="khrplatform.h" - gl_header[VG]="openvg.h vgext.h vgplatform.h vgu.h" - for gl_dir in {EGL,GL,GLES,GLES2,GLES3,KHR,VG}; do - setup_includes_symlinks \ - "${DST_PREFIX}/include/${gl_dir}" \ - "${gl_header[${gl_dir}]}" \ - "${PREFIX}/${libdir}/opengl/${gl_implem}/include/${gl_dir}/" \ - "${PREFIX}/${libdir}/opengl/global/include/${gl_dir}" \ - "${PREFIX}/${libdir}/opengl/xorg-x11/include/${gl_dir}/" - done - # Setup the $LDPATH - if [[ "x${REMOVE_ONLY}" == "xfalse" ]]; then - # we need this relative to ROOT - ldpath="${ldpath:+${ldpath}:}${PREFIX#${ROOT}}/${libdir}/opengl/${gl_local}/lib" + # We need the global module path too + if [[ -d ${PREFIX}/${libdir}/xorg/modules ]]; then + xorgmodpath+=( + "${PREFIX#${ROOT}}/${libdir}/xorg/modules" + ) fi done store_config ${ENV_FILE} LDPATH "${ldpath}" store_config ${ENV_FILE} OPENGL_PROFILE "${gl_implem}" + write_xorg_confd "${xorgmodpath[@]}" >${XORGD_FILE} + do_action env update &> /dev/null echo " done"