#! /bin/sh # # Quick hack to output the necessary QA_* ignores in the ebuild for a specific nvidia-drivers release # ## ## What release to check? (we only support >=2xx.xx) NV_VER_LINUX="256.35" NV_VER_FBSD="${NV_VER_LINUX}" ## Package names x86_NV_DIR="NVIDIA-Linux-x86-${NV_VER_LINUX}" amd64_NV_DIR="NVIDIA-Linux-x86_64-${NV_VER_LINUX}" x86_fbsd_NV_DIR="NVIDIA-FreeBSD-x86-${NV_VER_FBSD}" NV_LINUX_PKG_EXT="run" NV_FBSD_PKG_EXT="tar.gz" x86_NV_PACKAGE="${x86_NV_DIR}.${NV_LINUX_PKG_EXT}" amd64_NV_PACKAGE="${amd64_NV_DIR}.${NV_LINUX_PKG_EXT}" x86_fbsd_NV_PACKAGE="${x86_fbsd_NV_DIR}.${NV_FBSD_PKG_EXT}" ## Portage distfiles PORTAGE_DISTDIR="/usr/portage/distfiles" ## Where to store the output NV_QA_OUTFILE="./nvidia-driver-${NV_VER_LINUX}-gentoo-qa" ## Unpack mkdir -p "./${NV_VER_LINUX}" cd "./${NV_VER_LINUX}" [[ -f "./${x86_NV_PACKAGE}" ]] || cp "${PORTAGE_DISTDIR}/${x86_NV_PACKAGE}" "./${x86_NV_PACKAGE}" [[ -f "./${amd64_NV_PACKAGE}" ]] || cp "${PORTAGE_DISTDIR}/${amd64_NV_PACKAGE}" "./${amd64_NV_PACKAGE}" [[ -f "./${x86_fbsd_NV_PACKAGE}" ]] || cp "${PORTAGE_DISTDIR}/${x86_fbsd_NV_PACKAGE}" "./${x86_fbsd_NV_PACKAGE}" chmod -cR a+x "./${x86_NV_PACKAGE}" "./${amd64_NV_PACKAGE}" [[ -d "./${x86_NV_DIR}" ]] || ./${x86_NV_PACKAGE} -x [[ -d "./${amd64_NV_DIR}" ]] || ./${amd64_NV_PACKAGE} -x [[ -d "./${x86_fbsd_NV_DIR}" ]] || tar -xzf ./${x86_fbsd_NV_PACKAGE} ## Clean stale output file rm -f "${NV_QA_OUTFILE}" ## Store QA_ infos [x86 & amd64 (everything) / fbsd (textrel only)] for arch in x86 amd64 x86_fbsd ; do # arch_NV_DIR expanded var name arch_NV_DIR="${arch}_NV_DIR" cd "./${!arch_NV_DIR}" # We only care about TEXTRELS on x86_fbsd if [[ "${arch}" == "x86_fbsd" ]] ; then arch_TEXTRELS="$( scanelf -qyRF '%t %p' ./obj/ | gawk '{print $2}' )" # And we don't use .so.${NV_VER_FBSD} in our libs, just so.1 NV_VER="1" else # TEXTRELS arch_TEXTRELS="$( scanelf -qyRF '%t %p' ./ | gawk '{print $2}' )" # EXECSTACK arch_EXECSTACK="$( scanelf -qyRAF '%e %p' ./ | grep -P '(^[RWX]{3} )([RWX!\-]{3} )([RWX!\-]{3} )(.*?$)' | gawk '{print $4}' )" # WX_LOAD arch_WX_LOAD="$( scanelf -qyRAF '%e %p' ./ | grep -P '(^[RWX!\-]{3} )([RWX!\-]{3} )([RWX]{3} )(.*?$)' | gawk '{print $4}' )" # DT_HASH arch_DT_HASH="$( scanelf -qyRF '%k %p' -k .hash ./ | sed -e "s:\.hash ::" )" # SONAME arch_SONAME="$( scanelf -ByF '%S %p' *.so* | gawk '$2 == "" { print }' | sed -e "s:^[[:space:]]::" )" # Version NV_VER="${NV_VER_LINUX}" fi cd .. ## Parse QA_ infos for qa_type in TEXTRELS EXECSTACK WX_LOAD DT_HASH SONAME ; do # We only care about TEXTRELS on x86_fbsd [[ "${arch}" == "x86_fbsd" ]] && [[ "${qa_type}" != "TEXTRELS" ]] && continue # multilib support [[ "${arch}" == "amd64" ]] && libdir="lib64" || libdir="lib" # Clear our array unset QA_type_arch # arch_qa_type expanded var name arch_qa_type="arch_${qa_type}" for file in ${!arch_qa_type} ; do case "${file}" in # Skip binaries we don't install "nvidia-settings" | "nvidia-installer" | "mkprecompiled" | "tls_test" | "tls_test_dso.so" | "libnvidia-wfb.so.${NV_VER}" | "libvdpau_trace.so.${NV_VER}" | "libvdpau.so.${NV_VER}" ) continue ;; # Skip one of the -tls lib "libnvidia-tls.so.${NV_VER}" ) # Unless we're on x86_fbsd, because there's only one there if [[ "${arch}" == "x86_fbsd" ]] ; then QA_type_arch=( "${QA_type_arch[@]}" "usr/${libdir}/opengl/nvidia/lib/${file}" ) else continue fi ;; # FreeBSD: Since the 256.35 RC, nVidia seems to provide linux-compat libs with the driver. Skip those for now, since we don't install them. linux/*) continue ;; ## Then we have some special cases # nvidia-tls "tls/libnvidia-tls.so.${NV_VER}" ) QA_type_arch=( "${QA_type_arch[@]}" "usr/${libdir}/opengl/nvidia/lib/libnvidia-tls.so.${NV_VER}" ) ;; # GL, nvidia-glcore "libnvidia-glcore.so.${NV_VER}" | "libGL.so.${NV_VER}" ) QA_type_arch=( "${QA_type_arch[@]}" "usr/${libdir}/opengl/nvidia/lib/${file}" ) ;; # glx "libglx.so.${NV_VER}" ) QA_type_arch=( "${QA_type_arch[@]}" "usr/${libdir}/opengl/nvidia/extensions/${file}" ) ;; # nvidia_drv.so "nvidia_drv.so" ) QA_type_arch=( "${QA_type_arch[@]}" "usr/${libdir}/xorg/modules/drivers/${file}" ) ;; ## 32bits libs # Skip binaries we don't install "32/libvdpau_trace.so.${NV_VER}" | "32/libvdpau.so.${NV_VER}" ) continue ;; # Skip one of the -tls lib "32/libnvidia-tls.so.${NV_VER}" ) continue ;; ## Then we have some special cases # nvidia-tls "32/tls/libnvidia-tls.so.${NV_VER}" ) QA_type_arch=( "${QA_type_arch[@]}" "usr/lib32/opengl/nvidia/lib/libnvidia-tls.so.${NV_VER}" ) ;; # GL, nvidia-glcore "32/libnvidia-glcore.so.${NV_VER}" | "32/libGL.so.${NV_VER}" ) QA_type_arch=( "${QA_type_arch[@]}" "usr/lib32/opengl/nvidia/lib/${file#32/}" ) ;; # Handle the rest (32b) 32/* ) QA_type_arch=( "${QA_type_arch[@]}" "usr/lib32/${file#32/}" ) ;; # Handle the rest * ) if [[ "${file}" != *.so* ]] ; then # Binaries QA_type_arch=( "${QA_type_arch[@]}" "usr/bin/${file}" ) else # Libraries QA_type_arch=( "${QA_type_arch[@]}" "usr/${libdir}/${file}" ) fi ;; esac done ## Format the array for output count=$(( ${#QA_type_arch[@]} - 1 )) ## Bash arrays are 0 indexed, so 19 elements = 0..18, not 0..19 ;) for index in $( seq 0 ${count} ) ; do case "${index}" in 0 ) # First item, setup the var & open the quotes if [[ "${arch}" == "x86_fbsd" ]] ; then # We hardcode the kernel module here on x86_fbsd QA_type_arch_out="QA_${qa_type}_${arch}=\"boot/modules/nvidia.ko\n\t${QA_type_arch[index]}" else QA_type_arch_out="QA_${qa_type}_${arch}=\"${QA_type_arch[index]}" fi ;; ${count} ) # Last item, close the quotes QA_type_arch_out="${QA_type_arch_out}\n\t${QA_type_arch[index]}\"" ;; * ) # Everything else, grow the list QA_type_arch_out="${QA_type_arch_out}\n\t${QA_type_arch[index]}" ;; esac done ## Store our formatted output echo -e "${QA_type_arch_out}\n" >> "${NV_QA_OUTFILE}" ## Don't use hard-coded version tag on Linux sed -e "s/${NV_VER_LINUX}/\${PV}/g" -i "${NV_QA_OUTFILE}" done done ## Print the final output cat "${NV_QA_OUTFILE}"