declare -x ALSA_CARDS="" declare -x ALSA_PCM_PLUGINS="adpcm alaw asym copy dmix dshare dsnoop empty extplug file hooks iec958 ioplug ladspa lfloat linear meter mmap_emul mulaw multi null plug rate route share shm softvol" declare -x APACHE2_MODULES=" alias auth_basic authz_host cgi deflate dir expires filter info log_config logio mime mime_magic rewrite status unique_id userdir vhost_alias " declare -x APACHE2_MPMS="event" declare -x ARCH="arm" declare -- BASE_EXPF="src_unpack src_compile src_install src_prepare src_configure" declare -x BOOTSTRAP_USE="cxx unicode" declare -x CALLIGRA_FEATURES="kexi words flow plan sheets stage tables krita karbon braindump" declare -x CAMERAS="canon" declare -x CBUILD="armv7a-hardfloat-linux-gnueabi" declare -x CFLAGS="-O2 -pipe -mcpu=cortex-a9 -mfpu=vfpv3-d16 -mhard-float -mtune=cortex-a9 -std=c++0x" declare -x CFLAGS_default declare -x CHOST="armv7a-hardfloat-linux-gnueabi" declare -x CHOST_default="armv7a-hardfloat-linux-gnueabi" declare -x COLLECTD_PLUGINS="df interface irq load memory rrdtool swap syslog" declare -x CROSSCOMPILE_OPTS="" declare -x CTARGET_default="armv7a-hardfloat-linux-gnueabi" declare -x CXXFLAGS="-O2 -pipe -mcpu=cortex-a9 -mfpu=vfpv3-d16 -mhard-float -mtune=cortex-a9 -std=c++0x" declare -x DEFAULT_ABI="default" declare -x DEFINED_PHASES=" compile configure install postinst postrm prepare setup test unpack" declare DEPEND=" app-admin/eselect-qtgraphicssystem media-libs/fontconfig media-libs/freetype:2 media-libs/libpng:0 sys-libs/zlib virtual/jpeg ~x11-libs/qt-core-4.8.1[aqua=,c++0x=,qpa=,debug=,glib=,qt3support=] ~x11-libs/qt-script-4.8.1[aqua=,c++0x=,qpa=,debug=] !aqua? ( x11-libs/libICE x11-libs/libSM x11-libs/libX11 x11-libs/libXcursor x11-libs/libXext x11-libs/libXi x11-libs/libXrandr x11-libs/libXrender xinerama? ( x11-libs/libXinerama ) xv? ( x11-libs/libXv ) ) cups? ( net-print/cups ) dbus? ( ~x11-libs/qt-dbus-4.8.1[aqua=,c++0x=,qpa=,debug=] ) egl? ( media-libs/mesa[egl] ) gtkstyle? ( x11-libs/gtk+:2[aqua=] ) mng? ( >=media-libs/libmng-1.0.9 ) nas? ( >=media-libs/nas-1.5 ) tiff? ( media-libs/tiff:0 ) !aqua? ( x11-proto/inputproto x11-proto/xextproto xinerama? ( x11-proto/xineramaproto ) xv? ( x11-proto/videoproto ) ) dev-util/pkgconfig" declare DESCRIPTION="The GUI module for the Qt toolkit" declare -x DESTTREE="/usr" declare -x DIROPTIONS="-m0755" declare -x EAPI="4" declare -x ELIBC="glibc" declare -- EPATCH_EXCLUDE="" declare -- EPATCH_FORCE="no" declare -- EPATCH_MULTI_MSG="Applying various patches (bugfixes/updates) ..." declare -- EPATCH_OPTS="-g0 -E --no-backup-if-mismatch" declare -- EPATCH_SINGLE_MSG="" declare -- EPATCH_SOURCE="/var/tmp/portage/x11-libs/qt-gui-4.8.1/work/patch" declare -- EPATCH_SUFFIX="patch.bz2" declare -x EXEOPTIONS="-m0755" declare -x FCFLAGS="" declare -x FETCHCOMMAND_SSH="bash -c \"x=\\\${2#ssh://} ; host=\\\${x%%/*} ; port=\\\${host##*:} ; host=\\\${host%:*} ; [[ \\\${host} = \\\${port} ]] && port=22 ; exec rsync --rsh=\\\"ssh -p\\\${port}\\\" -avP \\\"\\\${host}:/\\\${x#*/}\\\" \\\"\\\$1\\\"\" rsync \"\${DISTDIR}/\${FILE}\" \"\${URI}\"" declare -x FFLAGS="" declare -x GCC_SPECS="" declare -x GDK_USE_XFT="1" declare -x GPSD_PROTOCOLS="ashtech aivdm earthmate evermore fv18 garmin garmintxt gpsclock itrax mtk3301 nmea ntrip navcom oceanserver oldstyle oncore rtcm104v2 rtcm104v3 sirf superstar2 timing tsip tripmate tnt ubx" declare -x GRUB_PLATFORMS="" declare -x GSETTINGS_BACKEND="gconf" declare HOMEPAGE="http://qt.nokia.com/ http://qt-project.org/" declare -x HUSHLOGIN="FALSE" declare -x INHERITED=" multilib toolchain-funcs user eutils base flag-o-matic versionator qt4-build" declare -x INPUT_DEVICES="" declare -x INSDESTTREE="" declare -x INSOPTIONS="-m0644" declare IUSE="+accessibility cups dbus egl gif +glib gtkstyle mng nas nis qt3support tiff trace xinerama +xv aqua debug pch +exceptions c++0x qpa" declare -x KERNEL="linux" declare -x KERNEL_ABI="default" declare -x KEYWORDS="~amd64 ~arm ~hppa ~ia64 ~mips ~ppc ~ppc64 ~x86 ~x86-fbsd ~x86-freebsd ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos ~x64-solaris ~x86-solaris" declare -x LANG="en_US.utf8" declare -x LCD_DEVICES="" declare -x LDFLAGS="-Wl,-O1 -Wl,--as-needed" declare -x LDFLAGS_default declare -x LD_LIBRARY_PATH="/var/tmp/portage/x11-libs/qt-gui-4.8.1/work/qt-everywhere-opensource-src-4.8.1/lib:/var/tmp/portage/x11-libs/qt-gui-4.8.1/work/qt-everywhere-opensource-src-4.8.1/lib" declare -x LIBDIR_default="lib" declare -x LIBOPTIONS="-m0644" declare -x LICENSE="|| ( LGPL-2.1 GPL-3 )" declare -x LINGUAS="en ru" declare -x MAIL="/var/mail/root" declare -x MAKEOPTS="-j3" declare -x MULTILIB_ABIS="default" declare -- MY_P="qt-everywhere-opensource-src-4.8.1" declare -- MY_PV="4.8.1" declare -x NETBEANS="apisupport cnd groovy gsf harness ide identity j2ee java mobility nb php profiler soa visualweb webcommon websvccommon xml" declare -x OPENGL_PROFILE="xorg-x11" declare -a PATCHES='([0]="/usr/portage/x11-libs/qt-gui/files/qt-gui-4.7.3-cups.patch")' declare -x PATH="/var/tmp/portage/x11-libs/qt-gui-4.8.1/work/qt-everywhere-opensource-src-4.8.1/bin:/var/tmp/portage/x11-libs/qt-gui-4.8.1/work/qt-everywhere-opensource-src-4.8.1/bin:/usr/lib/portage/bin/ebuild-helpers/4:/usr/lib/portage/bin/ebuild-helpers:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/armv7a-hardfloat-linux-gnueabi/gcc-bin/4.6.3" declare PDEPEND="qt3support? ( ~x11-libs/qt-qt3support-4.8.1[aqua=,c++0x=,debug=,qpa=] ) " declare -x PHP_INI_VERSION="development" declare -x PHP_TARGETS="" declare -- PLATFORM="linux-g++" declare -a PORTAGE_DOCOMPRESS='([0]="/usr/share/doc" [1]="/usr/share/info" [2]="/usr/share/man")' declare -a PORTAGE_DOCOMPRESS_SKIP='([0]="/usr/share/doc/qt-gui-4.8.1/html")' declare -x PRELINK_PATH_MASK="/usr/lib/libfreebl3.so:/usr/lib/libnssdbm3.so:/usr/lib/libsoftokn3.so" declare -x PROFILE_ONLY_VARIABLES="ARCH ELIBC KERNEL USERLAND" declare -x PROPERTIES="" declare -x PROVIDE="" declare -x PYTHONDONTWRITEBYTECODE="1" declare -- QCONFIG_ADD="" declare -- QCONFIG_DEFINE="" declare -- QCONFIG_REMOVE="" declare -- QMAKE_LIBDIR_QT="/usr/lib/qt4" declare -- QT4_EXTRACT_DIRECTORIES=" src/gui src/scripttools tools/designer tools/linguist/linguist src/plugins/imageformats/gif src/plugins/imageformats/ico src/plugins/imageformats/jpeg src/plugins/inputmethods src/plugins/accessible/widgets tools/qdbus/qdbusviewer src/plugins/imageformats/mng src/plugins/imageformats/tiff tools/qtconfig include src tools" declare -- QT4_TARGET_DIRECTORIES=" src/gui src/scripttools tools/designer tools/linguist/linguist src/plugins/imageformats/gif src/plugins/imageformats/ico src/plugins/imageformats/jpeg src/plugins/inputmethods src/plugins/accessible/widgets tools/qdbus/qdbusviewer src/plugins/imageformats/mng src/plugins/imageformats/tiff tools/qtconfig" declare -- QTBINDIR="/usr/bin" declare -- QTDATADIR="/usr/share/qt4" declare -- QTDEMOSDIR="/usr/share/qt4/demos" declare -- QTDOCDIR="/usr/share/doc/qt-4.8.1" declare -- QTEXAMPLESDIR="/usr/share/qt4/examples" declare -- QTHEADERDIR="/usr/include/qt4" declare -- QTIMPORTDIR="/usr/lib/qt4/imports" declare -- QTLIBDIR="/usr/lib/qt4" declare -- QTPCDIR="/usr/lib/pkgconfig" declare -- QTPLUGINDIR="/usr/lib/qt4/plugins" declare -- QTPREFIXDIR="/usr" declare -- QTSYSCONFDIR="/etc/qt4" declare -- QTTRANSDIR="/usr/share/qt4/translations" declare -x QT_GRAPHICSSYSTEM="raster" declare -- QT_INSTALL_PREFIX="/usr/lib/qt4" declare RDEPEND=" app-admin/eselect-qtgraphicssystem media-libs/fontconfig media-libs/freetype:2 media-libs/libpng:0 sys-libs/zlib virtual/jpeg ~x11-libs/qt-core-4.8.1[aqua=,c++0x=,qpa=,debug=,glib=,qt3support=] ~x11-libs/qt-script-4.8.1[aqua=,c++0x=,qpa=,debug=] !aqua? ( x11-libs/libICE x11-libs/libSM x11-libs/libX11 x11-libs/libXcursor x11-libs/libXext x11-libs/libXi x11-libs/libXrandr x11-libs/libXrender xinerama? ( x11-libs/libXinerama ) xv? ( x11-libs/libXv ) ) cups? ( net-print/cups ) dbus? ( ~x11-libs/qt-dbus-4.8.1[aqua=,c++0x=,qpa=,debug=] ) egl? ( media-libs/mesa[egl] ) gtkstyle? ( x11-libs/gtk+:2[aqua=] ) mng? ( >=media-libs/libmng-1.0.9 ) nas? ( >=media-libs/nas-1.5 ) tiff? ( media-libs/tiff:0 ) !x11-libs/qt-assistant-4.8.1-r9999 !x11-libs/qt-core-4.8.1-r9999 !x11-libs/qt-dbus-4.8.1-r9999 !x11-libs/qt-declarative-4.8.1-r9999 !x11-libs/qt-demo-4.8.1-r9999 !x11-libs/qt-gui-4.8.1-r9999 !x11-libs/qt-multimedia-4.8.1-r9999 !x11-libs/qt-opengl-4.8.1-r9999 !x11-libs/qt-openvg-4.8.1-r9999 !x11-libs/qt-phonon-4.8.1-r9999 !x11-libs/qt-qt3support-4.8.1-r9999 !x11-libs/qt-script-4.8.1-r9999 !x11-libs/qt-sql-4.8.1-r9999 !x11-libs/qt-svg-4.8.1-r9999 !x11-libs/qt-test-4.8.1-r9999 !x11-libs/qt-webkit-4.8.1-r9999 !x11-libs/qt-xmlpatterns-4.8.1-r9999 " declare REPOSITORY declare REQUIRED_USE=" gtkstyle? ( glib ) " declare -x RESTRICT="" declare -x RESUMECOMMAND_SSH="bash -c \"x=\\\${2#ssh://} ; host=\\\${x%%/*} ; port=\\\${host##*:} ; host=\\\${host%:*} ; [[ \\\${host} = \\\${port} ]] && port=22 ; exec rsync --rsh=\\\"ssh -p\\\${port}\\\" -avP \\\"\\\${host}:/\\\${x#*/}\\\" \\\"\\\$1\\\"\" rsync \"\${DISTDIR}/\${FILE}\" \"\${URI}\"" declare -x RUBY_TARGETS="" declare -x S="/var/tmp/portage/x11-libs/qt-gui-4.8.1/work/qt-everywhere-opensource-src-4.8.1" declare -x SANDBOX_DEBUG="0" declare -x SANDBOX_DENY="" declare -x SANDBOX_PID="13737" declare -x SANDBOX_PREDICT="/var/tmp/portage/x11-libs/qt-gui-4.8.1/homedir:/dev/crypto:/var/cache/fontconfig" declare -x SANDBOX_READ="/:/var/tmp" declare -x SANDBOX_VERBOSE="1" declare -x SANDBOX_WRITE=":/dev/console:/dev/fd:/dev/full:/dev/null:/dev/pts/:/dev/pty:/dev/shm:/dev/tts:/dev/tty:/dev/vc/:/dev/zero:/proc/self/fd:/tmp/:/usr/lib32/cf:/usr/lib32/conftest:/usr/lib64/cf:/usr/lib64/conftest:/usr/lib/cf:/usr/lib/conftest:/usr/tmp/cf:/usr/tmp/conftest:/var/tmp:/var/tmp/:/var/tmp/portage/x11-libs/qt-gui-4.8.1/homedir/.bash_history" declare -x SANE_BACKENDS="" declare -x SLOT="4" declare SRC_URI="http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.8.1.tar.gz" declare -x USE="accessibility arm c++0x dbus egl elibc_glibc exceptions gif glib gtkstyle kernel_linux mng tiff userland_GNU xinerama xv" declare -x USERLAND="GNU" declare -x VIDEO_CARDS="" declare -x XDG_CONFIG_DIRS="/etc/xdg" declare -x XDG_DATA_DIRS="/usr/local/share:/usr/share" declare -x XDG_SESSION_COOKIE="256218e57dc8bdfb5205ed4100001cd2-1333191079.108193-1615740081" declare -x XTABLES_ADDONS="quota2 psd pknock lscan length2 ipv4options ipset ipp2p iface geoip fuzzy condition tee tarpit sysrq steal rawnat logmark ipmark dhcpmac delude chaos account" declare -x _E_DOCDESTTREE_="" declare -x _E_EXEDESTTREE_="" declare -a __ESTACK_eshopts__='()' declare -- ___ECLASS_ONCE_BASE="recur -_+^+_- spank" declare -- ___ECLASS_ONCE_EUTILS="recur -_+^+_- spank" declare -- ___ECLASS_ONCE_FLAG_O_MATIC="recur -_+^+_- spank" declare -- ___ECLASS_ONCE_MULTILIB="recur -_+^+_- spank" declare -- ___ECLASS_ONCE_TOOLCHAIN_FUNCS="recur -_+^+_- spank" declare -- ___ECLASS_ONCE_USER="recur -_+^+_- spank" declare -- ___ECLASS_ONCE_VERSIONATOR="recur -_+^+_- spank" declare -- bin="rcc" declare -- myconf="" declare -- phase_func _assert_pkg_ebuild_phase () { case ${EBUILD_PHASE} in setup | preinst | postinst) ;; *) eerror "'$1()' called from '${EBUILD_PHASE}' phase which is not OK:"; eerror "You may only call from pkg_{setup,preinst,postinst} functions."; eerror "Package fails at QA and at life. Please file a bug."; die "Bad package! $1 is only for use in some pkg_* functions!" ;; esac } _epatch_draw_line () { [[ -z $1 ]] && set "$(printf "%65s" '')"; echo "${1//?/=}" } _filter-hardened () { local f; for f in "$@"; do case "${f}" in -fPIC | -fpic | -fPIE | -fpie | -Wl,pie | -pie) gcc-specs-pie || continue; is-flagq -nopie || append-flags -nopie ;; -fstack-protector) gcc-specs-ssp || continue; is-flagq -fno-stack-protector || append-flags $(test-flags -fno-stack-protector) ;; -fstack-protector-all) gcc-specs-ssp-to-all || continue; is-flagq -fno-stack-protector-all || append-flags $(test-flags -fno-stack-protector-all) ;; -fno-strict-overflow) gcc-specs-nostrict || continue; is-flagq -fstrict-overflow || append-flags $(test-flags -fstrict-overflow) ;; esac; done } _filter-var () { local f x var=$1 new=(); shift; for f in ${!var}; do for x in "$@"; do [[ ${f} == ${x} ]] && continue 2; done; new+=("${f}"); done; eval export ${var}=\""${new[*]}"\" } _gcc-install-dir () { echo "$(LC_ALL=C $(tc-getCC) -print-search-dirs 2> /dev/null | awk '$1=="install:" {print $2}')" } _gcc-specs-directive_raw () { local cc=$(tc-getCC); local specfiles=$(LC_ALL=C ${cc} -v 2>&1 | awk '$1=="Reading" {print $NF}'); ${cc} -dumpspecs 2> /dev/null | cat - ${specfiles} | awk -v directive=$1 'BEGIN { pspec=""; spec=""; outside=1 } $1=="*"directive":" { pspec=spec; spec=""; outside=0; next } outside || NF==0 || ( substr($1,1,1)=="*" && substr($1,length($1),1)==":" ) { outside=1; next } spec=="" && substr($0,1,1)=="+" { spec=pspec " " substr($0,2); next } { spec=spec $0 } END { print spec }'; return 0 } _gcc-specs-exists () { [[ -f $(_gcc-install-dir)/$1 ]] } _gcc_fullversion () { local ver="$1"; shift; set -- `$(tc-getCPP "$@") -E -P - <<<"__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__"`; eval echo "$ver" } _is_flagq () { local x; for x in ${!1}; do [[ ${x} == $2 ]] && return 0; done; return 1 } _tc-getPROG () { local tuple=$1; local v var vars=$2; local prog=$3; var=${vars%% *}; for v in ${vars}; do if [[ -n ${!v} ]]; then export ${var}="${!v}"; echo "${!v}"; return 0; fi; done; local search=; [[ -n $4 ]] && search=$(type -p "$4-${prog}"); [[ -z ${search} && -n ${!tuple} ]] && search=$(type -p "${!tuple}-${prog}"); [[ -n ${search} ]] && prog=${search##*/}; export ${var}=${prog}; echo "${!var}" } all-flag-vars () { echo {C,CPP,CXX,CCAS,F,FC,LD}FLAGS } append-cflags () { [[ $# -eq 0 ]] && return 0; export CFLAGS=$(test-flags-CC ${CFLAGS} "$@"); return 0 } append-cppflags () { [[ $# -eq 0 ]] && return 0; export CPPFLAGS="${CPPFLAGS} $*"; return 0 } append-cxxflags () { [[ $# -eq 0 ]] && return 0; export CXXFLAGS=$(test-flags-CXX ${CXXFLAGS} "$@"); return 0 } append-fflags () { [[ $# -eq 0 ]] && return 0; export FFLAGS=$(test-flags-F77 ${FFLAGS} "$@"); export FCFLAGS=$(test-flags-FC ${FCFLAGS} "$@"); return 0 } append-flags () { [[ $# -eq 0 ]] && return 0; append-cflags "$@"; append-cxxflags "$@"; append-fflags "$@"; return 0 } append-ldflags () { [[ $# -eq 0 ]] && return 0; local flag; for flag in "$@"; do [[ ${flag} == -l* ]] && ewarn "Appending a library link instruction (${flag}); libraries to link to should not be passed through LDFLAGS"; done; export LDFLAGS="${LDFLAGS} $*"; return 0 } append-lfs-flags () { [[ $# -ne 0 ]] && die "append-lfs-flags takes no arguments"; append-cppflags -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE } append-libs () { [[ $# -eq 0 ]] && return 0; local flag; for flag in "$@"; do [[ ${flag} == -l* ]] && flag=${flag#-l}; export LIBS="${LIBS} -l${flag}"; done; return 0 } base_src_compile () { debug-print-function $FUNCNAME "$@"; has src_configure ${BASE_EXPF} || base_src_configure; base_src_make "$@" } base_src_configure () { debug-print-function $FUNCNAME "$@"; [[ -x ${ECONF_SOURCE:-.}/configure ]] && econf "$@" } base_src_install () { debug-print-function $FUNCNAME "$@"; emake DESTDIR="${D}" "$@" install || die "died running make install, $FUNCNAME"; base_src_install_docs } base_src_install_docs () { debug-print-function $FUNCNAME "$@"; local x; pushd "${S}" > /dev/null; if [[ "$(declare -p DOCS 2>/dev/null 2>&1)" == "declare -a"* ]]; then for x in "${DOCS[@]}"; do debug-print "$FUNCNAME: docs: creating document from ${x}"; dodoc "${x}" || die "dodoc failed"; done; fi; if [[ "$(declare -p HTML_DOCS 2>/dev/null 2>&1)" == "declare -a"* ]]; then for x in "${HTML_DOCS[@]}"; do debug-print "$FUNCNAME: docs: creating html document from ${x}"; dohtml -r "${x}" || die "dohtml failed"; done; fi; popd > /dev/null } base_src_make () { debug-print-function $FUNCNAME "$@"; if [[ -f Makefile || -f GNUmakefile || -f makefile ]]; then emake "$@" || die "died running emake, $FUNCNAME"; fi } base_src_prepare () { debug-print-function $FUNCNAME "$@"; debug-print "$FUNCNAME: PATCHES=$PATCHES"; local patches_failed=0; pushd "${S}" > /dev/null; if [[ "$(declare -p PATCHES 2>/dev/null 2>&1)" == "declare -a"* ]]; then for x in "${PATCHES[@]}"; do debug-print "$FUNCNAME: applying patch from ${x}"; if [[ -d "${x}" ]]; then EPATCH_SUFFIX=${EPATCH_SUFFIX:=patch}; oldval=${EPATCH_SOURCE}; EPATCH_SOURCE=${x}; EPATCH_FORCE=yes; epatch; EPATCH_SOURCE=${oldval}; else if [[ -f "${x}" ]]; then epatch "${x}"; else ewarn "QA: File or directory \"${x}\" does not exist."; ewarn "QA: Check your PATCHES array or add missing file/directory."; patches_failed=1; fi; fi; done; [[ ${patches_failed} -eq 1 ]] && die "Some patches failed. See above messages."; else for x in ${PATCHES}; do debug-print "$FUNCNAME: patching from ${x}"; epatch "${x}"; done; fi; debug-print "$FUNCNAME: applying user patches"; epatch_user; popd > /dev/null } base_src_unpack () { debug-print-function $FUNCNAME "$@"; pushd "${WORKDIR}" > /dev/null; if [[ $(type -t unpacker_src_unpack) == "function" ]]; then unpacker_src_unpack; else if [[ -n ${A} ]]; then unpack ${A}; fi; fi; has src_prepare ${BASE_EXPF} || base_src_prepare; popd > /dev/null } build_directories () { for x in "$@"; do pushd "${S}"/${x} > /dev/null || die; emake CC="$(tc-getCC)" CXX="$(tc-getCXX)" LINK="$(tc-getCXX)" || die "emake failed"; popd > /dev/null || die; done } built_with_use () { local hidden="no"; if [[ $1 == "--hidden" ]]; then hidden="yes"; shift; fi; local missing_action="die"; if [[ $1 == "--missing" ]]; then missing_action=$2; shift; shift; case ${missing_action} in true | false | die) ;; *) die "unknown action '${missing_action}'" ;; esac; fi; local opt=$1; [[ ${opt:0:1} = "-" ]] && shift || opt="-a"; local PKG=$(best_version $1); [[ -z ${PKG} ]] && die "Unable to resolve $1 to an installed package"; shift; local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE; local IUSEFILE=${ROOT}/var/db/pkg/${PKG}/IUSE; if [[ ! -e ${USEFILE} ]] || [[ ! -e ${IUSEFILE} && ${hidden} == "no" ]]; then case ${missing_action} in true) return 0 ;; false) return 1 ;; die) die "Unable to determine what USE flags $PKG was built with" ;; esac; fi; if [[ ${hidden} == "no" ]]; then local IUSE_BUILT=($(<"${IUSEFILE}")); local expand; for expand in $(echo ${USE_EXPAND} | tr '[:upper:]' '[:lower:]'); do if [[ $1 == ${expand}_* ]]; then expand=""; break; fi; done; if [[ -n ${expand} ]]; then if ! has $1 ${IUSE_BUILT[@]#[-+]}; then case ${missing_action} in true) return 0 ;; false) return 1 ;; die) die "$PKG does not actually support the $1 USE flag!" ;; esac; fi; fi; fi; local USE_BUILT=$(<${USEFILE}); while [[ $# -gt 0 ]]; do if [[ ${opt} = "-o" ]]; then has $1 ${USE_BUILT} && return 0; else has $1 ${USE_BUILT} || return 1; fi; shift; done; [[ ${opt} = "-a" ]] } check_license () { die "you no longer need this as portage supports ACCEPT_LICENSE itself" } delete_all_version_separators () { replace_all_version_separators "" "${1}" } delete_version_separator () { replace_version_separator "${1}" "" "${2}" } doicon () { ( local i j ret; insinto /usr/share/pixmaps; for i in "$@"; do if [[ -f ${i} ]]; then doins "${i}"; ((ret+=$?)); else if [[ -d ${i} ]]; then for j in "${i}"/*.png; do doins "${j}"; ((ret+=$?)); done; else ((++ret)); fi; fi; done; exit ${ret} ) } domenu () { ( local i j ret=0; insinto /usr/share/applications; for i in "$@"; do if [[ -f ${i} ]]; then doins "${i}"; ((ret+=$?)); else if [[ -d ${i} ]]; then for j in "${i}"/*.desktop; do doins "${j}"; ((ret+=$?)); done; else ((++ret)); fi; fi; done; exit ${ret} ) } ebeep () { ewarn "QA Notice: ebeep is not defined in EAPI=${EAPI}, please file a bug at http://bugs.gentoo.org" } econf_build () { tc-env_build econf --build=${CBUILD:-${CHOST}} "$@" } ecvs_clean () { [[ -z $* ]] && set -- .; find "$@" -type d -name 'CVS' -prune -print0 | xargs -0 rm -rf; find "$@" -type f -name '.cvs*' -print0 | xargs -0 rm -rf } edos2unix () { [[ $# -eq 0 ]] && return 0; sed -i 's/\r$//' -- "$@" || die } egetent () { local db=$1 key=$2; [[ $# -ge 3 ]] && die "usage: egetent "; case ${db} in passwd | group) ;; *) die "sorry, database '${db}' not yet supported; file a bug" ;; esac; case ${CHOST} in *-darwin[678]) case ${key} in *[!0-9]*) nidump ${db} . | awk -F: "(\$1 ~ /^${key}\$/) {print;exit;}" ;; *) nidump ${db} . | awk -F: "(\$3 == ${key}) {print;exit;}" ;; esac ;; *-darwin*) local mykey; case ${db} in passwd) db="Users" mykey="UniqueID" ;; group) db="Groups" mykey="PrimaryGroupID" ;; esac; case ${key} in *[!0-9]*) dscl . -read /${db}/${key} 2> /dev/null | grep RecordName ;; *) dscl . -search /${db} ${mykey} ${key} 2> /dev/null ;; esac ;; *-freebsd* | *-dragonfly*) case ${db} in passwd) db="user" ;; *) ;; esac; local opts; if [[ ${key} == [[:digit:]]* ]]; then [[ ${db} == "user" ]] && opts="-u" || opts="-g"; fi; pw show ${db} ${opts} "${key}" -q ;; *-netbsd* | *-openbsd*) grep "${key}:\*:" /etc/${db} ;; *) nscd -i "${db}" 2> /dev/null; getent "${db}" "${key}" ;; esac } egethome () { local pos; [[ $# -eq 1 ]] || die "usage: egethome "; case ${CHOST} in *-darwin* | *-freebsd* | *-dragonfly*) pos=9 ;; *) pos=6 ;; esac; egetent passwd "$1" | cut -d: -f${pos} } egetshell () { local pos; [[ $# -eq 1 ]] || die "usage: egetshell "; case ${CHOST} in *-darwin* | *-freebsd* | *-dragonfly*) pos=10 ;; *) pos=7 ;; esac; egetent passwd "$1" | cut -d: -f${pos} } emktemp () { local exe="touch"; [[ $1 == -d ]] && exe="mkdir" && shift; local topdir=$1; if [[ -z ${topdir} ]]; then [[ -z ${T} ]] && topdir="/tmp" || topdir=${T}; fi; if ! type -P mktemp > /dev/null; then local tmp=/; while [[ -e ${tmp} ]]; do tmp=${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}; done; ${exe} "${tmp}" || ${exe} -p "${tmp}"; echo "${tmp}"; else if [[ ${exe} == "touch" ]]; then TMPDIR="${topdir}" mktemp -t tmp.XXXXXXXXXX; else TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX; fi; fi } enewgroup () { _assert_pkg_ebuild_phase ${FUNCNAME}; local egroup=$1; shift; if [[ -z ${egroup} ]]; then eerror "No group specified !"; die "Cannot call enewgroup without a group"; fi; if [[ -n $(egetent group "${egroup}") ]]; then return 0; fi; einfo "Adding group '${egroup}' to your system ..."; local egid=$1; shift; if [[ ! -z ${egid} ]]; then if [[ ${egid} -gt 0 ]]; then if [[ -n $(egetent group ${egid}) ]]; then egid="next available; requested gid taken"; fi; else eerror "Groupid given but is not greater than 0 !"; die "${egid} is not a valid GID"; fi; else egid="next available"; fi; einfo " - Groupid: ${egid}"; if [[ $# -gt 0 ]]; then die "extra arguments no longer supported; please file a bug"; fi; function _enewgroup_next_gid () { if [[ ${egid} == *[!0-9]* ]]; then for ((egid = 101; egid <= 999; egid++)) do [[ -z $(egetent group ${egid}) ]] && break; done; fi }; case ${CHOST} in *-darwin*) _enewgroup_next_gid; dscl . create "/groups/${egroup}" gid ${egid}; dscl . create "/groups/${egroup}" passwd '*' ;; *-freebsd* | *-dragonfly*) _enewgroup_next_gid; pw groupadd "${egroup}" -g ${egid} || die ;; *-netbsd*) _enewgroup_next_gid; groupadd -g ${egid} "${egroup}" || die ;; *) local opts; if [[ ${egid} == *[!0-9]* ]]; then opts=""; else opts="-g ${egid}"; fi; groupadd -r ${opts} "${egroup}" || die ;; esac } enewuser () { _assert_pkg_ebuild_phase ${FUNCNAME}; local euser=$1; shift; if [[ -z ${euser} ]]; then eerror "No username specified !"; die "Cannot call enewuser without a username"; fi; if [[ -n $(egetent passwd "${euser}") ]]; then return 0; fi; einfo "Adding user '${euser}' to your system ..."; local opts=(); local euid=$1; shift; if [[ -n ${euid} && ${euid} != -1 ]]; then if [[ ${euid} -gt 0 ]]; then if [[ -n $(egetent passwd ${euid}) ]]; then euid="next"; fi; else eerror "Userid given but is not greater than 0 !"; die "${euid} is not a valid UID"; fi; else euid="next"; fi; if [[ ${euid} == "next" ]]; then for ((euid = 101; euid <= 999; euid++)) do [[ -z $(egetent passwd ${euid}) ]] && break; done; fi; opts+=(-u ${euid}); einfo " - Userid: ${euid}"; local eshell=$1; shift; if [[ ! -z ${eshell} ]] && [[ ${eshell} != "-1" ]]; then if [[ ! -e ${ROOT}${eshell} ]]; then eerror "A shell was specified but it does not exist !"; die "${eshell} does not exist in ${ROOT}"; fi; if [[ ${eshell} == */false || ${eshell} == */nologin ]]; then eerror "Do not specify ${eshell} yourself, use -1"; die "Pass '-1' as the shell parameter"; fi; else for eshell in /sbin/nologin /usr/sbin/nologin /bin/false /usr/bin/false /dev/null; do [[ -x ${ROOT}${eshell} ]] && break; done; if [[ ${eshell} == "/dev/null" ]]; then eerror "Unable to identify the shell to use, proceeding with userland default."; case ${USERLAND} in GNU) eshell="/bin/false" ;; BSD) eshell="/sbin/nologin" ;; Darwin) eshell="/usr/sbin/nologin" ;; *) die "Unable to identify the default shell for userland ${USERLAND}" ;; esac; fi; fi; einfo " - Shell: ${eshell}"; opts+=(-s "${eshell}"); local ehome=$1; shift; if [[ -z ${ehome} ]] || [[ ${ehome} == "-1" ]]; then ehome="/dev/null"; fi; einfo " - Home: ${ehome}"; opts+=(-d "${ehome}"); local egroups=$1; shift; local g egroups_arr; IFS="," read -r -a egroups_arr <<< "${egroups}"; shift; if [[ ${#egroups_arr[@]} -gt 0 ]]; then local defgroup exgroups; for g in "${egroups_arr[@]}"; do if [[ -z $(egetent group "${g}") ]]; then eerror "You must add group ${g} to the system first"; die "${g} is not a valid GID"; fi; if [[ -z ${defgroup} ]]; then defgroup=${g}; else exgroups+=",${g}"; fi; done; opts+=(-g "${defgroup}"); if [[ ! -z ${exgroups} ]]; then opts+=(-G "${exgroups:1}"); fi; fi; einfo " - Groups: ${egroups:-(none)}"; if [[ $# -gt 0 ]]; then die "extra arguments no longer supported; please file a bug"; else local comment="added by portage for ${PN}"; opts+=(-c "${comment}"); einfo " - GECOS: ${comment}"; fi; case ${CHOST} in *-darwin*) dscl . create "/users/${euser}" uid ${euid}; dscl . create "/users/${euser}" shell "${eshell}"; dscl . create "/users/${euser}" home "${ehome}"; dscl . create "/users/${euser}" realname "added by portage for ${PN}"; for g in "${egroups_arr[@]}"; do dscl . merge "/groups/${g}" users "${euser}"; done ;; *-freebsd* | *-dragonfly*) pw useradd "${euser}" "${opts[@]}" || die ;; *-netbsd*) useradd "${opts[@]}" "${euser}" || die ;; *-openbsd*) useradd -u ${euid} -s "${eshell}" -d "${ehome}" -g "${egroups}" "${euser}" || die ;; *) useradd -r "${opts[@]}" "${euser}" || die ;; esac; if [[ ! -e ${ROOT}/${ehome} ]]; then einfo " - Creating ${ehome} in ${ROOT}"; mkdir -p "${ROOT}/${ehome}"; chown "${euser}" "${ROOT}/${ehome}"; chmod 755 "${ROOT}/${ehome}"; fi } epatch () { function _epatch_draw_line () { [[ -z $1 ]] && set "$(printf "%65s" '')"; echo "${1//?/=}" }; unset P4CONFIG P4PORT P4USER; if [[ $# -gt 1 ]]; then local m; for m in "$@"; do epatch "${m}"; done; return 0; fi; local SINGLE_PATCH="no"; [[ $# -eq 0 ]] && set -- "${EPATCH_SOURCE}"; if [[ -f $1 ]]; then SINGLE_PATCH="yes"; set -- "$1"; local EPATCH_SUFFIX=$1; else if [[ -d $1 ]]; then set -- "$1"/*${EPATCH_SUFFIX:+."${EPATCH_SUFFIX}"}; else if [[ -f ${EPATCH_SOURCE}/$1 ]]; then epatch "${EPATCH_SOURCE}/$1"; return $?; else [[ $# -ne 0 ]] && EPATCH_SOURCE=$1; echo; eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"; eerror; eerror " ${EPATCH_SOURCE}"; eerror " ( ${EPATCH_SOURCE##*/} )"; echo; die "Cannot find \$EPATCH_SOURCE!"; fi; fi; fi; local PIPE_CMD; case ${EPATCH_SUFFIX##*\.} in xz) PIPE_CMD="xz -dc" ;; lzma) PIPE_CMD="lzma -dc" ;; bz2) PIPE_CMD="bzip2 -dc" ;; gz | Z | z) PIPE_CMD="gzip -dc" ;; ZIP | zip) PIPE_CMD="unzip -p" ;; *) ;; esac; [[ ${SINGLE_PATCH} == "no" ]] && einfo "${EPATCH_MULTI_MSG}"; local x; for x in "$@"; do [[ ! -f ${x} ]] && continue; local patchname=${x##*/}; local a=${patchname#*_}; a=${a%%_*}; if ! [[ ${SINGLE_PATCH} == "yes" || ${EPATCH_FORCE} == "yes" || ${a} == all || ${a} == ${ARCH} ]]; then continue; fi; if [[ -n ${EPATCH_EXCLUDE} ]]; then eshopts_push -o noglob; local ex; for ex in ${EPATCH_EXCLUDE}; do if [[ ${patchname} == ${ex} ]]; then eshopts_pop; continue 2; fi; done; eshopts_pop; fi; if [[ ${SINGLE_PATCH} == "yes" ]]; then if [[ -n ${EPATCH_SINGLE_MSG} ]]; then einfo "${EPATCH_SINGLE_MSG}"; else einfo "Applying ${patchname} ..."; fi; else einfo " ${patchname} ..."; fi; local STDERR_TARGET="${T}/${patchname}.out"; if [[ -e ${STDERR_TARGET} ]]; then STDERR_TARGET="${T}/${patchname}-$$.out"; fi; printf "***** %s *****\nPWD: %s\n\n" "${patchname}" "${PWD}" > "${STDERR_TARGET}"; local count=0; local PATCH_TARGET; if [[ -n ${PIPE_CMD} ]]; then PATCH_TARGET="${T}/$$.patch"; echo "PIPE_COMMAND: ${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> "${STDERR_TARGET}"; if ! ( ${PIPE_CMD} "${x}" > "${PATCH_TARGET}" ) >> "${STDERR_TARGET}" 2>&1; then echo; eerror "Could not extract patch!"; count=5; break; fi; else PATCH_TARGET=${x}; fi; local abs_paths=$(egrep -n '^[-+]{3} /' "${PATCH_TARGET}" | awk '$2 != "/dev/null" { print }'); if [[ -n ${abs_paths} ]]; then count=1; printf "NOTE: skipping -p0 due to absolute paths in patch:\n%s\n" "${abs_paths}" >> "${STDERR_TARGET}"; fi; local rel_paths=$(egrep -n '^[-+]{3} [^ ]*[.][.]/' "${PATCH_TARGET}"); if [[ -n ${rel_paths} ]]; then eqawarn "QA Notice: Your patch uses relative paths '../'."; eqawarn " In the future this will cause a failure."; eqawarn "${rel_paths}"; fi; local patch_cmd; while [[ ${count} -lt 5 ]]; do patch_cmd="${BASH_ALIASES[patch]:-patch} -p${count} ${EPATCH_OPTS}"; ( _epatch_draw_line "***** ${patchname} *****"; echo; echo "PATCH COMMAND: ${patch_cmd} < '${PATCH_TARGET}'"; echo; _epatch_draw_line "***** ${patchname} *****"; ${patch_cmd} --dry-run -f < "${PATCH_TARGET}" 2>&1; ret=$?; echo; echo "patch program exited with status ${ret}"; exit ${ret} ) >> "${STDERR_TARGET}"; if [ $? -eq 0 ]; then ( _epatch_draw_line "***** ${patchname} *****"; echo; echo "ACTUALLY APPLYING ${patchname} ..."; echo; _epatch_draw_line "***** ${patchname} *****"; ${patch_cmd} < "${PATCH_TARGET}" 2>&1; ret=$?; echo; echo "patch program exited with status ${ret}"; exit ${ret} ) >> "${STDERR_TARGET}"; if [ $? -ne 0 ]; then echo; eerror "A dry-run of patch command succeeded, but actually"; eerror "applying the patch failed!"; count=5; fi; break; fi; : $(( count++ )); done; if [[ -n ${PIPE_CMD} ]]; then rm -f "${PATCH_TARGET}"; fi; if [[ ${count} -ge 5 ]]; then echo; eerror "Failed Patch: ${patchname} !"; eerror " ( ${PATCH_TARGET} )"; eerror; eerror "Include in your bugreport the contents of:"; eerror; eerror " ${STDERR_TARGET}"; echo; die "Failed Patch: ${patchname}!"; fi; rm -f "${STDERR_TARGET}"; cat >> "${T}/epatch.log" <<-EOF PATCH: ${x} CMD: ${patch_cmd} PWD: ${PWD} EOF eend 0; done; [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching"; : } epatch_user () { [[ $# -ne 0 ]] && die "epatch_user takes no options"; local applied="${T}/epatch_user.log"; [[ -e ${applied} ]] && return 2; local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches; for check in ${CATEGORY}/{${P}-${PR},${P},${PN}}; do EPATCH_SOURCE=${base}/${CTARGET}/${check}; [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${CHOST}/${check}; [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${check}; if [[ -d ${EPATCH_SOURCE} ]]; then EPATCH_SOURCE=${EPATCH_SOURCE} EPATCH_SUFFIX="patch" EPATCH_FORCE="yes" EPATCH_MULTI_MSG="Applying user patches from ${EPATCH_SOURCE} ..." epatch; echo "${EPATCH_SOURCE}" > "${applied}"; return 0; fi; done; echo "none" > "${applied}"; return 1 } epause () { ewarn "QA Notice: epause is not defined in EAPI=${EAPI}, please file a bug at http://bugs.gentoo.org" } epunt_cxx () { local dir=$1; [[ -z ${dir} ]] && dir=${S}; ebegin "Removing useless C++ checks"; local f; find "${dir}" -name configure | while read f; do patch --no-backup-if-mismatch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null; done; eend 0 } eshopts_pop () { local s; estack_pop eshopts s || die "${FUNCNAME}: unbalanced push"; if [[ ${s} == "shopt -"* ]]; then eval "${s}" || die "${FUNCNAME}: sanity: invalid shopt options: ${s}"; else set +$- || die "${FUNCNAME}: sanity: invalid shell settings: $-"; set -${s} || die "${FUNCNAME}: sanity: unable to restore saved shell settings: ${s}"; fi } eshopts_push () { if [[ $1 == -[su] ]]; then estack_push eshopts "$(shopt -p)"; [[ $# -eq 0 ]] && return 0; shopt "$@" || die "${FUNCNAME}: bad options to shopt: $*"; else estack_push eshopts $-; [[ $# -eq 0 ]] && return 0; set "$@" || die "${FUNCNAME}: bad options to set: $*"; fi } estack_pop () { [[ $# -eq 0 || $# -gt 2 ]] && die "estack_pop: incorrect # of arguments"; local __estack_name="__ESTACK_$1__"; shift; local __estack_retvar=$1; shift; eval local __estack_i=\${#${__estack_name}\[@\]}; [[ $(( --__estack_i )) -eq -1 ]] && return 1; if [[ -n ${__estack_retvar} ]]; then eval ${__estack_retvar}=\"\${${__estack_name}\[${__estack_i}\]}\"; fi; eval unset ${__estack_name}\[${__estack_i}\] } estack_push () { [[ $# -eq 0 ]] && die "estack_push: incorrect # of arguments"; local stack_name="__ESTACK_$1__"; shift; eval ${stack_name}+=\( \"\$@\" \) } esvn_clean () { [[ -z $* ]] && set -- .; find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf } eumask_pop () { [[ $# -eq 0 ]] || die "${FUNCNAME}: we take no options"; local s; estack_pop eumask s || die "${FUNCNAME}: unbalanced push"; umask ${s} || die "${FUNCNAME}: sanity: could not restore umask: ${s}" } eumask_push () { estack_push eumask "$(umask)"; umask "$@" || die "${FUNCNAME}: bad options to umask: $*" } filter-flags () { _filter-hardened "$@"; local v; for v in $(all-flag-vars); do _filter-var ${v} "$@"; done; return 0 } filter-ldflags () { _filter-var LDFLAGS "$@"; return 0 } filter-lfs-flags () { [[ $# -ne 0 ]] && die "filter-lfs-flags takes no arguments"; filter-flags -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE } filter-mfpmath () { local orig_mfpmath new_math prune_math; orig_mfpmath=$(get-flag -mfpmath); new_math=$(get-flag mfpmath); new_math=" ${new_math//,/ } "; prune_math=""; for prune_math in "$@"; do new_math=${new_math/ ${prune_math} / }; done; new_math=$(echo ${new_math}); new_math=${new_math// /,}; if [[ -z ${new_math} ]]; then filter-flags ${orig_mfpmath}; else replace-flags ${orig_mfpmath} -mfpmath=${new_math}; fi; return 0 } fix_includes () { if use aqua && [[ ${CHOST##*-darwin} -ge 9 ]]; then dodir "${QTHEADERDIR#${EPREFIX}}"/Qt; local dest f h; for frw in "${D}${QTLIBDIR}"/*.framework; do [[ -e "${frw}"/Headers ]] || continue; f=$(basename ${frw}); dest="${QTHEADERDIR#${EPREFIX}}"/${f%.framework}; dosym "${QTLIBDIR#${EPREFIX}}"/${f}/Headers "${dest}"; for hdr in "${D}/${QTLIBDIR}/${f}"/Headers/*; do h=$(basename ${hdr}); dosym "${QTLIBDIR#${EPREFIX}}"/${f}/Headers/${h} "${QTHEADERDIR#${EPREFIX}}"/Qt/${h}; done; done; fi } fix_library_files () { local libfile; for libfile in "${D}"/${QTLIBDIR}/{*.la,*.prl,pkgconfig/*.pc}; do if [[ -e ${libfile} ]]; then sed -i -e "s:${S}/lib:${QTLIBDIR}:g" ${libfile} || die "sed on ${libfile} failed"; fi; done; for libfile in "${D}"/${QTLIBDIR}/pkgconfig/*.pc; do if [[ -e ${libfile} ]]; then sed -i -e "s:${S}/bin:${QTBINDIR}:g" ${libfile} || die "sed on ${libfile} failed"; dodir ${QTPCDIR#${EPREFIX}}; mv ${libfile} "${D}"/${QTPCDIR}/ || die "moving ${libfile} to ${D}/${QTPCDIR}/ failed"; fi; done; rmdir "${D}"/${QTLIBDIR}/pkgconfig } gcc-fullversion () { _gcc_fullversion '$1.$2.$3' "$@" } gcc-major-version () { _gcc_fullversion '$1' "$@" } gcc-micro-version () { _gcc_fullversion '$3' "$@" } gcc-minor-version () { _gcc_fullversion '$2' "$@" } gcc-specs-directive () { local directive subdname subdirective; directive="$(_gcc-specs-directive_raw $1)"; while [[ ${directive} == *%\(*\)* ]]; do subdname=${directive/*%\(}; subdname=${subdname/\)*}; subdirective="$(_gcc-specs-directive_raw ${subdname})"; directive="${directive//\%(${subdname})/${subdirective}}"; done; echo "${directive}"; return 0 } gcc-specs-nostrict () { local directive; directive=$(gcc-specs-directive cc1); return $([[ "${directive/\{!fstrict-overflow:}" != "${directive}" ]]) } gcc-specs-now () { local directive; directive=$(gcc-specs-directive link_command); return $([[ "${directive/\{!nonow:}" != "${directive}" ]]) } gcc-specs-pie () { local directive; directive=$(gcc-specs-directive cc1); return $([[ "${directive/\{!nopie:}" != "${directive}" ]]) } gcc-specs-relro () { local directive; directive=$(gcc-specs-directive link_command); return $([[ "${directive/\{!norelro:}" != "${directive}" ]]) } gcc-specs-ssp () { local directive; directive=$(gcc-specs-directive cc1); return $([[ "${directive/\{!fno-stack-protector:}" != "${directive}" ]]) } gcc-specs-ssp-to-all () { local directive; directive=$(gcc-specs-directive cc1); return $([[ "${directive/\{!fno-stack-protector-all:}" != "${directive}" ]]) } gcc-version () { _gcc_fullversion '$1.$2' "$@" } gen_usr_ldscript () { local lib libdir=$(get_libdir) output_format="" auto=false suffix=$(get_libname); [[ -z ${ED+set} ]] && local ED=${D%/}${EPREFIX}/; tc-is-static-only && return; dodir /usr/${libdir}; if [[ $1 == "-a" ]]; then auto=true; shift; dodir /${libdir}; fi; output_format=$($(tc-getCC) ${CFLAGS} ${LDFLAGS} -Wl,--verbose 2>&1 | sed -n 's/^OUTPUT_FORMAT("\([^"]*\)",.*/\1/p'); [[ -n ${output_format} ]] && output_format="OUTPUT_FORMAT ( ${output_format} )"; for lib in "$@"; do local tlib; if ${auto}; then lib="lib${lib}${suffix}"; else [[ -r ${ED}/${libdir}/${lib} ]] || continue; fi; case ${CTARGET:-${CHOST}} in *-darwin*) if ${auto}; then tlib=$(scanmacho -qF'%S#F' "${ED}"/usr/${libdir}/${lib}); else tlib=$(scanmacho -qF'%S#F' "${ED}"/${libdir}/${lib}); fi; [[ -z ${tlib} ]] && die "unable to read install_name from ${lib}"; tlib=${tlib##*/}; if ${auto}; then mv "${ED}"/usr/${libdir}/${lib%${suffix}}.*${suffix#.} "${ED}"/${libdir}/ || die; if [[ ${tlib} != ${lib%${suffix}}.*${suffix#.} ]]; then mv "${ED}"/usr/${libdir}/${tlib%${suffix}}.*${suffix#.} "${ED}"/${libdir}/ || die; fi; rm -f "${ED}"/${libdir}/${lib}; fi; if [[ ! -w "${ED}/${libdir}/${tlib}" ]]; then chmod u+w "${ED}${libdir}/${tlib}"; local nowrite=yes; fi; install_name_tool -id "${EPREFIX}"/${libdir}/${tlib} "${ED}"/${libdir}/${tlib} || die "install_name_tool failed"; [[ -n ${nowrite} ]] && chmod u-w "${ED}${libdir}/${tlib}"; pushd "${ED}/usr/${libdir}" > /dev/null; ln -snf "../../${libdir}/${tlib}" "${lib}"; popd > /dev/null ;; *-aix* | *-irix* | *64*-hpux* | *-interix* | *-winnt*) if ${auto}; then mv "${ED}"/usr/${libdir}/${lib}* "${ED}"/${libdir}/ || die; tlib=$(readlink "${ED}"/${libdir}/${lib}); tlib=${tlib##*/}; if [[ -z ${tlib} ]]; then tlib=${lib}; else rm -f "${ED}"/${libdir}/${lib}; fi; else tlib=${lib}; fi; pushd "${ED}/usr/${libdir}" > /dev/null; ln -snf "../../${libdir}/${tlib}" "${lib}"; popd > /dev/null ;; hppa*-hpux*) if ${auto}; then tlib=$(chatr "${ED}"/usr/${libdir}/${lib} | sed -n '/internal name:/{n;s/^ *//;p;q}'); [[ -z ${tlib} ]] && tlib=${lib}; tlib=${tlib##*/}; mv "${ED}"/usr/${libdir}/${lib}* "${ED}"/${libdir}/ || die; if [[ ${tlib} != ${lib}* ]]; then mv "${ED}"/usr/${libdir}/${tlib}* "${ED}"/${libdir}/ || die; fi; [[ ${tlib} != ${lib} ]] && rm -f "${ED}"/${libdir}/${lib}; else tlib=$(chatr "${ED}"/${libdir}/${lib} | sed -n '/internal name:/{n;s/^ *//;p;q}'); [[ -z ${tlib} ]] && tlib=${lib}; tlib=${tlib##*/}; fi; pushd "${ED}"/usr/${libdir} > /dev/null; ln -snf "../../${libdir}/${tlib}" "${lib}"; [[ ${tlib} != ${lib} ]] && ln -snf "../../${libdir}/${tlib}" "${tlib}"; popd > /dev/null ;; *) if ${auto}; then tlib=$(scanelf -qF'%S#F' "${ED}"/usr/${libdir}/${lib}); [[ -z ${tlib} ]] && die "unable to read SONAME from ${lib}"; mv "${ED}"/usr/${libdir}/${lib}* "${ED}"/${libdir}/ || die; if [[ ${tlib} != ${lib}* ]]; then mv "${ED}"/usr/${libdir}/${tlib}* "${ED}"/${libdir}/ || die; fi; rm -f "${ED}"/${libdir}/${lib}; else tlib=${lib}; fi; cat > "${ED}/usr/${libdir}/${lib}" <<-END_LDSCRIPT /* GNU ld script Since Gentoo has critical dynamic libraries in /lib, and the static versions in /usr/lib, we need to have a "fake" dynamic lib in /usr/lib, otherwise we run into linking problems. This "fake" dynamic lib is a linker script that redirects the linker to the real lib. And yes, this works in the cross- compiling scenario as the sysroot-ed linker will prepend the real path. See bug http://bugs.gentoo.org/4411 for more info. */ ${output_format} GROUP ( ${EPREFIX}/${libdir}/${tlib} ) END_LDSCRIPT ;; esac fperms a+x "/usr/${libdir}/${lib}" || die "could not change perms on ${lib}"; done } generate_qconfigs () { if [[ -n ${QCONFIG_ADD} || -n ${QCONFIG_REMOVE} || -n ${QCONFIG_DEFINE} || ${PN} == qt-core ]]; then local x qconfig_add qconfig_remove qconfig_new; for x in "${ROOT}${QTDATADIR}"/mkspecs/gentoo/*-qconfig.pri; do [[ -f ${x} ]] || continue; qconfig_add+=" $(sed -n 's/^QCONFIG_ADD=//p' "${x}")"; qconfig_remove+=" $(sed -n 's/^QCONFIG_REMOVE=//p' "${x}")"; done; if [[ -e "${ROOT}${QTDATADIR}"/mkspecs/gentoo/qconfig.pri ]]; then if ! cp "${ROOT}${QTDATADIR}"/mkspecs/gentoo/qconfig.pri "${ROOT}${QTDATADIR}"/mkspecs/qconfig.pri; then eerror "cp qconfig failed."; return 1; fi; for x in $(sed -n 's/^QT_CONFIG +=//p' "${ROOT}${QTDATADIR}"/mkspecs/qconfig.pri) ${qconfig_add}; do has ${x} ${qconfig_remove} || qconfig_new+=" ${x}"; done; if ! sed -i -e "s/QT_CONFIG +=.*/QT_CONFIG += ${qconfig_new}/" "${ROOT}${QTDATADIR}"/mkspecs/qconfig.pri; then eerror "Sed for QT_CONFIG failed"; return 1; fi; if [[ ! -e ${ROOT}${QTHEADERDIR}/Gentoo ]]; then if ! mkdir -p "${ROOT}${QTHEADERDIR}"/Gentoo; then eerror "mkdir ${QTHEADERDIR}/Gentoo failed"; return 1; fi; fi; : > "${ROOT}${QTHEADERDIR}"/Gentoo/gentoo-qconfig.h; for x in "${ROOT}${QTHEADERDIR}"/Gentoo/gentoo-*-qconfig.h; do [[ -f ${x} ]] || continue; cat "${x}" >> "${ROOT}${QTHEADERDIR}"/Gentoo/gentoo-qconfig.h; done; else rm -f "${ROOT}${QTDATADIR}"/mkspecs/qconfig.pri; rm -f "${ROOT}${QTHEADERDIR}"/Gentoo/gentoo-qconfig.h; rmdir "${ROOT}${QTDATADIR}"/mkspecs "${ROOT}${QTDATADIR}" "${ROOT}${QTHEADERDIR}"/Gentoo "${ROOT}${QTHEADERDIR}" 2> /dev/null; fi; fi } get-flag () { local f var findflag="$1"; for var in $(all-flag-vars); do for f in ${!var}; do if [ "${f/${findflag}}" != "${f}" ]; then printf "%s\n" "${f/-${findflag}=}"; return 0; fi; done; done; return 1 } get_abi_CFLAGS () { get_abi_var CFLAGS "$@" } get_abi_CHOST () { get_abi_var CHOST "$@" } get_abi_CTARGET () { get_abi_var CTARGET "$@" } get_abi_FAKE_TARGETS () { get_abi_var FAKE_TARGETS "$@" } get_abi_LDFLAGS () { get_abi_var LDFLAGS "$@" } get_abi_LIBDIR () { get_abi_var LIBDIR "$@" } get_abi_var () { local flag=$1; local abi=${2:-${ABI:-${DEFAULT_ABI:-default}}}; local var="${flag}_${abi}"; echo ${!var} } get_after_major_version () { echo $(get_version_component_range 2- "${1:-${PV}}") } get_all_abis () { local order=""; if [[ -z ${MULTILIB_ABIS} ]]; then echo "default"; return 0; fi; for x in ${MULTILIB_ABIS}; do if [[ ${x} != ${DEFAULT_ABI} ]]; then order="${order:+${order} }${x}"; fi; done; order="${order:+${order} }${DEFAULT_ABI}"; echo ${order}; return 0 } get_all_libdirs () { local libdirs; local abi; local dir; for abi in ${MULTILIB_ABIS}; do libdirs+=" $(get_abi_LIBDIR ${abi})"; done; [[ " ${libdirs} " != *" lib "* ]] && libdirs+=" lib"; echo "${libdirs}" } get_all_version_components () { eshopts_push -s extglob; local ver_str=${1:-${PV}} result; result=(); if [[ ${VERSIONATOR_CACHE_VER_STR} == ${ver_str} ]]; then echo ${VERSIONATOR_CACHE_RESULT}; eshopts_pop; return; fi; export VERSIONATOR_CACHE_VER_STR=${ver_str}; while [[ -n $ver_str ]]; do case "${ver_str::1}" in [[:digit:]]) result+=("${ver_str%%[^[:digit:]]*}"); ver_str=${ver_str##+([[:digit:]])} ;; [-_.]) result+=("${ver_str::1}"); ver_str=${ver_str:1} ;; [[:alpha:]]) local not_match=${ver_str##+([[:alpha:]])*([[:digit:]])}; result+=("${ver_str::${#ver_str} - ${#not_match}}"); ver_str=${not_match} ;; *) result+=("${ver_str::1}"); ver_str=${ver_str:1} ;; esac; done; export VERSIONATOR_CACHE_RESULT=${result[*]}; echo ${result[@]}; eshopts_pop } get_install_abis () { local order=""; if [[ -z ${MULTILIB_ABIS} ]]; then echo "default"; return 0; fi; if [[ ${EMULTILIB_PKG} == "true" ]]; then for x in ${MULTILIB_ABIS}; do if [[ ${x} != "${DEFAULT_ABI}" ]]; then has ${x} ${ABI_DENY} || order="${order} ${x}"; fi; done; has ${DEFAULT_ABI} ${ABI_DENY} || order="${order} ${DEFAULT_ABI}"; if [[ -n ${ABI_ALLOW} ]]; then local ordera=""; for x in ${order}; do if has ${x} ${ABI_ALLOW}; then ordera="${ordera} ${x}"; fi; done; order=${ordera}; fi; else order=${DEFAULT_ABI}; fi; if [[ -z ${order} ]]; then die "The ABI list is empty. Are you using a proper multilib profile? Perhaps your USE flags or MULTILIB_ABIS are too restrictive for this package."; fi; echo ${order}; return 0 } get_last_version_component_index () { echo $(($(get_version_component_count "${1:-${PV}}" ) - 1)) } get_libdir () { local CONF_LIBDIR; if [ -n "${CONF_LIBDIR_OVERRIDE}" ]; then echo ${CONF_LIBDIR_OVERRIDE}; else get_abi_LIBDIR; fi } get_libname () { local libname; local ver=$1; case ${CHOST} in *-cygwin | mingw* | *-mingw*) libname="dll" ;; *-darwin*) libname="dylib" ;; *-mint*) libname="irrelevant" ;; hppa*-hpux*) libname="sl" ;; *) libname="so" ;; esac; if [[ -z $* ]]; then echo ".${libname}"; else for ver in "$@"; do case ${CHOST} in *-darwin*) echo ".${ver}.${libname}" ;; *-mint*) echo ".${libname}" ;; *) echo ".${libname}.${ver}" ;; esac; done; fi } get_major_version () { local c=($(get_all_version_components "${1:-${PV}}")); echo ${c[0]} } get_modname () { local modname; local ver=$1; case ${CHOST} in *-darwin*) modname="bundle" ;; *) modname="so" ;; esac; echo ".${modname}" } get_version_component_count () { local a=($(get_version_components "${1:-${PV}}")); echo ${#a[@]} } get_version_component_range () { eshopts_push -s extglob; local c v="${2:-${PV}}" range="${1}" range_start range_end; local -i i=-1 j=0; c=($(get_all_version_components "${v}")); range_start=${range%-*}; range_start=${range_start:-1}; range_end=${range#*-}; range_end=${range_end:-${#c[@]}}; while ((j < range_start)); do i+=1; ((i > ${#c[@]})) && eshopts_pop && return; [[ -n "${c[i]//[-._]}" ]] && j+=1; done; while ((j <= range_end)); do echo -n ${c[i]}; ((i > ${#c[@]})) && eshopts_pop && return; [[ -n "${c[i]//[-._]}" ]] && j+=1; i+=1; done; eshopts_pop } get_version_components () { local c=$(get_all_version_components "${1:-${PV}}"); echo ${c//[-._]/ } } has_m32 () { die "${FUNCNAME}: don't use this anymore" } has_m64 () { eqawarn "${FUNCNAME}: don't use this anymore"; local temp="$(emktemp)"; echo "int main() { return(0); }" > "${temp}".c; MY_CC=$(tc-getCC); ${MY_CC/ .*/} -m64 -o "$(emktemp)" "${temp}".c > /dev/null 2>&1; local ret=$?; rm -f "${temp}".c; [[ ${ret} != 1 ]] && return 0; return 1 } has_multilib_profile () { [ -n "${MULTILIB_ABIS}" -a "${MULTILIB_ABIS}" != "${MULTILIB_ABIS/ /}" ] } in_iuse () { debug-print-function ${FUNCNAME} "${@}"; [[ ${#} -eq 1 ]] || die "Invalid args to ${FUNCNAME}()"; local flag=${1}; local liuse=(${IUSE}); has "${flag}" "${liuse[@]#[+-]}" } install_directories () { for x in "$@"; do pushd "${S}"/${x} > /dev/null || die; emake INSTALL_ROOT="${D}" install || die "emake install failed"; popd > /dev/null || die; done } install_qconfigs () { local x; if [[ -n ${QCONFIG_ADD} || -n ${QCONFIG_REMOVE} ]]; then for x in QCONFIG_ADD QCONFIG_REMOVE; do [[ -n ${!x} ]] && echo ${x}=${!x} >> "${T}"/${PN}-qconfig.pri; done; insinto ${QTDATADIR#${EPREFIX}}/mkspecs/gentoo; doins "${T}"/${PN}-qconfig.pri || die "installing ${PN}-qconfig.pri failed"; fi; if [[ -n ${QCONFIG_DEFINE} ]]; then for x in ${QCONFIG_DEFINE}; do echo "#define ${x}" >> "${T}"/gentoo-${PN}-qconfig.h; done; insinto ${QTHEADERDIR#${EPREFIX}}/Gentoo; doins "${T}"/gentoo-${PN}-qconfig.h || die "installing ${PN}-qconfig.h failed"; fi } is-flag () { is-flagq "$@" && echo true } is-flagq () { [[ -n $2 ]] && die "Usage: is-flag "; local var; for var in $(all-flag-vars); do _is_flagq ${var} "$1" && return 0; done; return 1 } is-ldflag () { is-ldflagq "$@" && echo true } is-ldflagq () { [[ -n $2 ]] && die "Usage: is-ldflag "; _is_flagq LDFLAGS $1 } is_final_abi () { has_multilib_profile || return 0; set -- $(get_install_abis); local LAST_ABI=$#; [[ ${!LAST_ABI} == ${ABI} ]] } make_desktop_entry () { [[ -z $1 ]] && die "make_desktop_entry: You must specify the executable"; local exec=${1}; local name=${2:-${PN}}; local icon=${3:-${PN}}; local type=${4}; local fields=${5}; if [[ -z ${type} ]]; then local catmaj=${CATEGORY%%-*}; local catmin=${CATEGORY##*-}; case ${catmaj} in app) case ${catmin} in accessibility) type="Utility;Accessibility" ;; admin) type=System ;; antivirus) type=System ;; arch) type="Utility;Archiving" ;; backup) type="Utility;Archiving" ;; cdr) type="AudioVideo;DiscBurning" ;; dicts) type="Office;Dictionary" ;; doc) type=Documentation ;; editors) type="Utility;TextEditor" ;; emacs) type="Development;TextEditor" ;; emulation) type="System;Emulator" ;; laptop) type="Settings;HardwareSettings" ;; office) type=Office ;; pda) type="Office;PDA" ;; vim) type="Development;TextEditor" ;; xemacs) type="Development;TextEditor" ;; esac ;; dev) type="Development" ;; games) case ${catmin} in action | fps) type=ActionGame ;; arcade) type=ArcadeGame ;; board) type=BoardGame ;; emulation) type=Emulator ;; kids) type=KidsGame ;; puzzle) type=LogicGame ;; roguelike) type=RolePlaying ;; rpg) type=RolePlaying ;; simulation) type=Simulation ;; sports) type=SportsGame ;; strategy) type=StrategyGame ;; esac; type="Game;${type}" ;; gnome) type="Gnome;GTK" ;; kde) type="KDE;Qt" ;; mail) type="Network;Email" ;; media) case ${catmin} in gfx) type=Graphics ;; *) case ${catmin} in radio) type=Tuner ;; sound) type=Audio ;; tv) type=TV ;; video) type=Video ;; esac; type="AudioVideo;${type}" ;; esac ;; net) case ${catmin} in dialup) type=Dialup ;; ftp) type=FileTransfer ;; im) type=InstantMessaging ;; irc) type=IRCClient ;; mail) type=Email ;; news) type=News ;; nntp) type=News ;; p2p) type=FileTransfer ;; voip) type=Telephony ;; esac; type="Network;${type}" ;; sci) case ${catmin} in astro*) type=Astronomy ;; bio*) type=Biology ;; calc*) type=Calculator ;; chem*) type=Chemistry ;; elec*) type=Electronics ;; geo*) type=Geology ;; math*) type=Math ;; physics) type=Physics ;; visual*) type=DataVisualization ;; esac; type="Education;Science;${type}" ;; sys) type="System" ;; www) case ${catmin} in client) type=WebBrowser ;; esac; type="Network;${type}" ;; *) type= ;; esac; fi; if [ "${SLOT}" == "0" ]; then local desktop_name="${PN}"; else local desktop_name="${PN}-${SLOT}"; fi; local desktop="${T}/$(echo ${exec} | sed 's:[[:space:]/:]:_:g')-${desktop_name}.desktop"; type=${type%;}${type:+;}; eshopts_push -s extglob; if [[ -n ${icon} && ${icon} != /* ]] && [[ ${icon} == *.xpm || ${icon} == *.png || ${icon} == *.svg ]]; then ewarn "As described in the Icon Theme Specification, icon file extensions are not"; ewarn "allowed in .desktop files if the value is not an absolute path."; icon=${icon%.@(xpm|png|svg)}; fi; eshopts_pop; cat > "${desktop}" <<-EOF [Desktop Entry] Name=${name} Type=Application Comment=${DESCRIPTION} Exec=${exec} TryExec=${exec%% *} Icon=${icon} Categories=${type} EOF if [[ ${fields:-=} != *=* ]]; then ewarn "make_desktop_entry: update your 5th arg to read Path=${fields}"; fields="Path=${fields}"; fi; [[ -n ${fields} ]] && printf '%b\n' "${fields}" >> "${desktop}"; ( insinto /usr/share/applications; doins "${desktop}" ) || die "installing desktop file failed" } make_session_desktop () { [[ -z $1 ]] && eerror "$0: You must specify the title" && return 1; [[ -z $2 ]] && eerror "$0: You must specify the command" && return 1; local title=$1; local command=$2; local desktop=${T}/${wm:-${PN}}.desktop; shift 2; cat > "${desktop}" <<-EOF [Desktop Entry] Name=${title} Comment=This session logs you into ${title} Exec=${command} $* TryExec=${command} Type=XSession EOF ( insinto /usr/share/xsessions; doins "${desktop}" ) } make_wrapper () { local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5; local tmpwrapper=$(emktemp); cat > "${tmpwrapper}" <&1 /dev/null || die; einfo "Running qmake in: ${x}"; { echo "${S}"/mkspecs/common/*.conf; find "${S}" -name '*.pr[io]' } | xargs sed -i -e "s:\$\$\[QT_INSTALL_LIBS\]:${QTLIBDIR}:g" -e "s:\$\$\[QT_INSTALL_PLUGINS\]:${QTPLUGINDIR}:g" || die; "${S}"/bin/qmake "LIBS+=-L${QTLIBDIR}" "CONFIG+=nostrip" || die "qmake failed"; popd > /dev/null || die; done } preserve_old_lib () { if [[ ${EBUILD_PHASE} != "preinst" ]]; then eerror "preserve_old_lib() must be called from pkg_preinst() only"; die "Invalid preserve_old_lib() usage"; fi; [[ -z $1 ]] && die "Usage: preserve_old_lib [more libraries to preserve]"; has preserve-libs ${FEATURES} && return 0; local lib dir; for lib in "$@"; do [[ -e ${ROOT}/${lib} ]] || continue; dir=${lib%/*}; dodir ${dir} || die "dodir ${dir} failed"; cp "${ROOT}"/${lib} "${D}"/${lib} || die "cp ${lib} failed"; touch "${D}"/${lib}; done } preserve_old_lib_notify () { if [[ ${EBUILD_PHASE} != "postinst" ]]; then eerror "preserve_old_lib_notify() must be called from pkg_postinst() only"; die "Invalid preserve_old_lib_notify() usage"; fi; has preserve-libs ${FEATURES} && return 0; local lib notice=0; for lib in "$@"; do [[ -e ${ROOT}/${lib} ]] || continue; if [[ ${notice} -eq 0 ]]; then notice=1; ewarn "Old versions of installed libraries were detected on your system."; ewarn "In order to avoid breaking packages that depend on these old libs,"; ewarn "the libraries are not being removed. You need to run revdep-rebuild"; ewarn "in order to remove these old dependencies. If you do not have this"; ewarn "helper program, simply emerge the 'gentoolkit' package."; ewarn; fi; [[ ${PN} == "mpfr" ]] && lib=${lib##*/}; ewarn " # revdep-rebuild --library '${lib}'"; done; if [[ ${notice} -eq 1 ]]; then ewarn; ewarn "Once you've finished running revdep-rebuild, it should be safe to"; ewarn "delete the old libraries. Here is a copy & paste for the lazy:"; for lib in "$@"; do ewarn " # rm '${lib}'"; done; fi } qt4-build_pkg_postinst () { generate_qconfigs } qt4-build_pkg_postrm () { generate_qconfigs } qt4-build_pkg_setup () { [[ ${EAPI} == 2 ]] && use !prefix && EPREFIX=; if has_version '>'${CATEGORY}/${P}-r9999; then if [[ -z ${I_KNOW_WHAT_I_AM_DOING} ]]; then eerror "Sanity check to keep you from breaking your system:"; eerror " Downgrading Qt is completely unsupported and will break your system!"; die "aborting to save your system"; else ewarn "Downgrading Qt is completely unsupported and will break your system!"; fi; fi; if [[ ${PN} == qt-webkit ]]; then eshopts_push -s extglob; if is-flagq '-g?(gdb)?([1-9])'; then echo; ewarn "You have enabled debug info (probably have -g or -ggdb in your CFLAGS/CXXFLAGS)."; ewarn "You may experience really long compilation times and/or increased memory usage."; ewarn "If compilation fails, please try removing -g/-ggdb before reporting a bug."; ewarn "For more info check out bug #307861"; echo; fi; eshopts_pop; fi; PATH="${S}/bin${PATH:+:}${PATH}"; if [[ ${CHOST} != *-darwin* ]]; then LD_LIBRARY_PATH="${S}/lib${LD_LIBRARY_PATH:+:}${LD_LIBRARY_PATH}"; else DYLD_LIBRARY_PATH="${S}/lib${DYLD_LIBRARY_PATH:+:}${DYLD_LIBRARY_PATH}"; [[ ${CHOST} == *-apple-darwin* ]] && QT4_EXTRACT_DIRECTORIES="src/gui/kernel/qapplication_mac.mm ${QT4_EXTRACT_DIRECTORIES}"; fi; if ! version_is_at_least 4.1 $(gcc-version); then ewarn "Using a GCC version lower than 4.1 is not supported."; fi } qt4-build_src_compile () { setqtenv; build_directories ${QT4_TARGET_DIRECTORIES} } qt4-build_src_configure () { setqtenv; local conf=" -prefix ${QTPREFIXDIR} -bindir ${QTBINDIR} -libdir ${QTLIBDIR} -docdir ${QTDOCDIR} -headerdir ${QTHEADERDIR} -plugindir ${QTPLUGINDIR} $(version_is_at_least 4.7 && echo -importdir ${QTIMPORTDIR}) -datadir ${QTDATADIR} -translationdir ${QTTRANSDIR} -sysconfdir ${QTSYSCONFDIR} -examplesdir ${QTEXAMPLESDIR} -demosdir ${QTDEMOSDIR} -opensource -confirm-license -shared -fast -largefile -stl -verbose -nomake examples -nomake demos"; case "$(tc-arch)" in amd64 | x64-*) conf+=" -arch x86_64" ;; ppc-macos) conf+=" -arch ppc" ;; ppc | ppc64 | ppc-*) conf+=" -arch powerpc" ;; sparc | sparc-* | sparc64-*) conf+=" -arch sparc" ;; x86-macos) conf+=" -arch x86" ;; x86 | x86-*) conf+=" -arch i386" ;; alpha | arm | ia64 | mips | s390) conf+=" -arch $(tc-arch)" ;; hppa | sh) conf+=" -arch generic" ;; *) die "$(tc-arch) is unsupported by this eclass. Please file a bug." ;; esac; conf+=" -platform $(qt_mkspecs_dir)"; [[ $(get_libdir) != lib ]] && conf+=" -L${EPREFIX}/usr/$(get_libdir)"; if use debug; then conf+=" -debug"; else conf+=" -release"; fi; conf+=" -no-separate-debug-info"; conf+=" $(in_iuse exceptions && qt_use exceptions || echo -exceptions)"; version_is_at_least 4.8 && conf+=" -no-rpath"; conf+=" $(qt_use pch)"; [[ ${CHOST} != *-solaris* ]] && conf+=" -reduce-relocations"; if use !elibc_glibc && [[ ${CHOST} != *-darwin* ]]; then conf+=" -liconv"; fi; if use_if_iuse glib; then local glibflags="$(pkg-config --cflags --libs glib-2.0 gthread-2.0)"; conf+=" ${glibflags//-pthread}"; unset glibflags; fi; if use_if_iuse qpa; then echo; ewarn "The qpa useflag enables the Qt Platform Abstraction, formely"; ewarn "known as Qt Lighthouse. If you are not sure what that is, then"; ewarn "disable it before reporting any bugs related to this useflag."; echo; conf+=" -qpa"; fi; if use aqua; then if [[ ${CHOST##*-darwin} -ge 9 ]]; then conf+=" -cocoa -framework"; conf+=" -I${S}/include"; conf+=" -F${QTLIBDIR}"; if use qt3support; then sed -e "/case \"\$PLATFORM,\$CFG_MAC_COCOA\" in/,/;;/ s|CFG_QT3SUPPORT=\"no\"|CFG_QT3SUPPORT=\"yes\"|" -i configure || die; fi; else conf+=" -no-framework"; fi; else conf+=" $(pkg-config --cflags-only-I freetype2)"; fi; conf+=" ${myconf}"; myconf=; echo ./configure ${conf}; ./configure ${conf} || die "./configure failed"; prepare_directories ${QT4_TARGET_DIRECTORIES} } qt4-build_src_install () { [[ ${EAPI} == 2 ]] && use !prefix && ED=${D}; setqtenv; install_directories ${QT4_TARGET_DIRECTORIES}; install_qconfigs; fix_library_files; fix_includes; find "${D}"${QTLIBDIR} -type f -name '*.la' -print0 | xargs -0 rm -f } qt4-build_src_prepare () { setqtenv; cd "${S}"; if version_is_at_least 4.7; then local nolibx11_pkgs="qt-core qt-dbus qt-script qt-sql qt-test qt-xmlpatterns"; has ${PN} ${nolibx11_pkgs} && qt_nolibx11; qt_assistant_cleanup; fi; if use aqua; then use x64-macos && ln -s macx-g++ mkspecs/$(qt_mkspecs_dir); sed -e '/^CONFIG/s:app_bundle::' -e '/^CONFIG/s:plugin_no_soname:plugin_with_soname absolute_library_soname:' -i mkspecs/$(qt_mkspecs_dir)/qmake.conf || die; fi; if [[ ${PN} != qt-core ]]; then skip_qmake_build; skip_project_generation; symlink_binaries_to_buildtree; fi; if [[ ${CHOST} == *86*-apple-darwin* ]]; then replace-flags -O2 -O3; fi; if [[ $(gcc-major-version) == 3 ]] && use amd64; then ewarn "Appending -fno-gcse to CFLAGS/CXXFLAGS"; append-flags -fno-gcse; fi; if use_if_iuse c++0x; then echo; ewarn "You are about to build Qt4 using the C++11 standard. Even though"; ewarn "this is an official standard, some of the reverse dependencies"; ewarn "may fail to compile or link againt the Qt4 libraries. Before"; ewarn "reporting a bug, make sure your bug is reproducible with c++0x"; ewarn "disabled."; echo; append-flags -std=c++0x; fi; if [[ $(gcc-major-version) -lt 4 ]]; then ewarn "Appending -fno-stack-protector to CXXFLAGS"; append-cxxflags -fno-stack-protector; sed -e "/^QMAKE_CFLAGS\t/ s:$: -fno-stack-protector-all:" -i mkspecs/common/g++.conf || die; fi; if use ppc64; then ewarn "Appending -mminimal-toc to CFLAGS/CXXFLAGS"; append-flags -mminimal-toc; fi; sed -e "/^SYSTEM_VARIABLES=/i CC='$(tc-getCC)'\n CXX='$(tc-getCXX)'\n CFLAGS='${CFLAGS}'\n CXXFLAGS='${CXXFLAGS}'\n LDFLAGS='${LDFLAGS}'\n" -i configure || die "sed SYSTEM_VARIABLES failed"; find config.tests/unix -name '*.test' -type f -print0 | xargs -0 sed -i -e "/bin\/qmake/ s: \"QT_BUILD_TREE=: 'QMAKE_CC=$(tc-getCC)' 'QMAKE_CXX=$(tc-getCXX)' 'QMAKE_LINK=$(tc-getCXX)' 'QMAKE_CFLAGS+=${CFLAGS}' 'QMAKE_CXXFLAGS+=${CXXFLAGS}' 'QMAKE_LFLAGS+=${LDFLAGS}'&:" || die "sed config.tests failed"; sed -i -e '/^QMAKE_CFLAGS_RELEASE/s:+=.*:+=:' mkspecs/common/g++.conf || die; sed -e 's:/X11R6/:/:' -i mkspecs/$(qt_mkspecs_dir)/qmake.conf || die; if [[ ${CHOST} == *-darwin* ]]; then sed -e "s:QMAKE_CFLAGS_RELEASE.*=.*:QMAKE_CFLAGS_RELEASE=${CFLAGS}:" -e "s:QMAKE_CXXFLAGS_RELEASE.*=.*:QMAKE_CXXFLAGS_RELEASE=${CXXFLAGS}:" -e "s:QMAKE_LFLAGS_RELEASE.*=.*:QMAKE_LFLAGS_RELEASE=-headerpad_max_install_names ${LDFLAGS}:" -e "s:-arch\s\w*::g" -i mkspecs/common/mac-g++.conf || die "sed mkspecs/common/mac-g++.conf failed"; sed -e "s:-arch i386::" -e "s:-arch ppc::" -e "s:-arch x86_64::" -e "s:-arch ppc64::" -e "s:-arch \$i::" -e "/if \[ ! -z \"\$NATIVE_64_ARCH\" \]; then/,/fi/ d" -e "s:CFG_MAC_XARCH=yes:CFG_MAC_XARCH=no:g" -e "s:-Xarch_x86_64::g" -e "s:-Xarch_ppc64::g" -i configure mkspecs/common/mac-g++.conf || die "sed -arch/-Xarch failed"; if [[ ${CHOST} == *-apple-darwin10 ]]; then sed -e "s:QMakeVar set QMAKE_MACOSX_DEPLOYMENT_TARGET.*:QMakeVar set QMAKE_MACOSX_DEPLOYMENT_TARGET 10.6:g" -e "s:-mmacosx-version-min=10.[0-9]:-mmacosx-version-min=10.6:g" -i configure mkspecs/common/mac-g++.conf || die "sed deployment target failed"; fi; fi; if use !elibc_glibc && [[ ${CHOST} != *-darwin* ]]; then sed -e 's|mac:\(LIBS += -liconv\)|\1|g' -i config.tests/unix/iconv/iconv.pro || die "sed iconv.pro failed"; fi; sed -i -e '/^QMAKE_LFLAGS_THREAD/a\QMAKE_LFLAGS_DYNAMIC_LIST = -Wl,--dynamic-list,' mkspecs/$(qt_mkspecs_dir)/qmake.conf || die; sed -i -e '/PLATFORM=solaris-cc/s/cc/g++/' configure || die; sed -i -e '/^QMAKE_\(LIB\|INC\)DIR\(_X11\|_OPENGL\|\)\t/s/=.*$/=/' mkspecs/$(qt_mkspecs_dir)/qmake.conf || die; base_src_prepare } qt4-build_src_test () { [[ ${PN} == qt-multimedia ]] && return; for dir in ${QT4_TARGET_DIRECTORIES}; do emake -j1 check -C ${dir}; done } qt4-build_src_unpack () { setqtenv; local tarball="${MY_P}.tar.gz" target= targets=; for target in configure LICENSE.GPL3 LICENSE.LGPL projects.pro src/{qbase,qt_targets,qt_install}.pri bin config.tests mkspecs qmake ${QT4_EXTRACT_DIRECTORIES}; do targets+="${MY_P}/${target} "; done; ebegin "Unpacking parts of ${tarball}:" ${targets//${MY_P}\/}; tar -xzf "${DISTDIR}/${tarball}" ${targets}; eend $? || die "failed to unpack" } qt_assistant_cleanup () { [[ ${PN} != qt-assistant ]] && return; version_is_at_least 4.7.4 && return; case "${MY_PV_EXTRA}" in *kde-qt*) sed -e "/^[ \t]*porting/,/^[ \t]*win32.*activeqt$/d" -e "/mac/,/^embedded.*makeqpf$/d" -i tools/tools.pro || die "patching tools.pro failed" ;; *) sed -e "/^[ \t]*porting/,/^[ \t]*win32.*activeqt$/d" -e "/mac/,/^embedded.*makeqpf$/d" -e "s/^\([ \t]*pixeltool\) /\1 qdoc3 /" -i tools/tools.pro || die "patching tools.pro failed" ;; esac } qt_mkspecs_dir () { local spec=; case "${CHOST}" in *-freebsd* | *-dragonfly*) spec=freebsd ;; *-openbsd*) spec=openbsd ;; *-netbsd*) spec=netbsd ;; *-darwin*) if use aqua; then spec=macx; else spec=darwin; fi ;; *-solaris*) spec=solaris ;; *-linux-* | *-linux) spec=linux ;; *) die "${FUNCNAME}(): Unknown CHOST '${CHOST}'" ;; esac; case "$(tc-getCXX)" in *g++*) spec+=-g++ ;; *icpc*) spec+=-icc ;; *) die "${FUNCNAME}(): Unknown compiler '$(tc-getCXX)'" ;; esac; if use x64-freebsd || use amd64-linux || use x64-macos || use x64-solaris || use sparc64-solaris; then spec+=-64; fi; echo "${spec}" } qt_nolibx11 () { sed -i "/unixtests\/compile.test.*config.tests\/x11\/xlib/,/fi$/d" "${S}"/configure || die "x11 check sed failed" } qt_use () { use "$1" && echo "${3:+-$3}-${2:-$1}" || echo "-no-${2:-$1}" } raw-ldflags () { local x input="$@"; [[ -z ${input} ]] && input=${LDFLAGS}; set --; for x in ${input}; do x=${x#-Wl,}; set -- "$@" ${x//,/ }; done; echo "$@" } replace-cpu-flags () { local newcpu="$#"; newcpu="${!newcpu}"; while [ $# -gt 1 ]; do replace-flags "-march=${1}" "-march=${newcpu}"; replace-flags "-mcpu=${1}" "-mcpu=${newcpu}"; replace-flags "-mtune=${1}" "-mtune=${newcpu}"; shift; done; return 0 } replace-flags () { [[ $# != 2 ]] && die "Usage: replace-flags "; local f var new; for var in $(all-flag-vars); do new=(); for f in ${!var}; do [[ ${f} == ${1} ]] && f=${2}; new+=("${f}"); done; eval export ${var}=\""${new[*]}"\"; done; return 0 } replace-sparc64-flags () { local SPARC64_CPUS="ultrasparc3 ultrasparc v9"; if [ "${CFLAGS/mtune}" != "${CFLAGS}" ]; then for x in ${SPARC64_CPUS}; do CFLAGS="${CFLAGS/-mcpu=${x}/-mcpu=v8}"; done; else for x in ${SPARC64_CPUS}; do CFLAGS="${CFLAGS/-mcpu=${x}/-mcpu=v8 -mtune=${x}}"; done; fi; if [ "${CXXFLAGS/mtune}" != "${CXXFLAGS}" ]; then for x in ${SPARC64_CPUS}; do CXXFLAGS="${CXXFLAGS/-mcpu=${x}/-mcpu=v8}"; done; else for x in ${SPARC64_CPUS}; do CXXFLAGS="${CXXFLAGS/-mcpu=${x}/-mcpu=v8 -mtune=${x}}"; done; fi; export CFLAGS CXXFLAGS } replace_all_version_separators () { local c=($(get_all_version_components "${2:-${PV}}")); c=${c[@]//[-._]/$1}; echo ${c// } } replace_version_separator () { eshopts_push -s extglob; local w c v="${3:-${PV}}"; declare -i i found=0; w=${1:-1}; c=($(get_all_version_components ${v})); if [[ ${w} != *[[:digit:]]* ]]; then for ((i = 0; i < ${#c[@]}; i++)) do if [[ ${c[i]} == ${w} ]]; then c[i]=${2}; break; fi; done; else for ((i = 0; i < ${#c[@]}; i++)) do if [[ -n "${c[i]//[^-._]}" ]]; then found+=1; if ((found == w)); then c[i]=${2}; break; fi; fi; done; fi; c=${c[*]}; echo ${c// }; eshopts_pop } setqtenv () { QTPREFIXDIR=${EPREFIX}/usr; QTBINDIR=${EPREFIX}/usr/bin; QTLIBDIR=${EPREFIX}/usr/$(get_libdir)/qt4; QTPCDIR=${EPREFIX}/usr/$(get_libdir)/pkgconfig; QTDOCDIR=${EPREFIX}/usr/share/doc/qt-${PV}; QTHEADERDIR=${EPREFIX}/usr/include/qt4; QTPLUGINDIR=${QTLIBDIR}/plugins; QTIMPORTDIR=${QTLIBDIR}/imports; QTDATADIR=${EPREFIX}/usr/share/qt4; QTTRANSDIR=${QTDATADIR}/translations; QTSYSCONFDIR=${EPREFIX}/etc/qt4; QTEXAMPLESDIR=${QTDATADIR}/examples; QTDEMOSDIR=${QTDATADIR}/demos; QMAKE_LIBDIR_QT=${QTLIBDIR}; QT_INSTALL_PREFIX=${EPREFIX}/usr/$(get_libdir)/qt4; PLATFORM=$(qt_mkspecs_dir); unset QMAKESPEC } setup-allowed-flags () { ALLOWED_FLAGS="-pipe"; ALLOWED_FLAGS+=" -O -O1 -O2 -Os -mcpu -march -mtune"; ALLOWED_FLAGS+=" -fstack-protector -fstack-protector-all"; ALLOWED_FLAGS+=" -fbounds-checking -fno-strict-overflow"; ALLOWED_FLAGS+=" -fno-PIE -fno-pie -fno-unit-at-a-time"; ALLOWED_FLAGS+=" -g -g[0-9] -ggdb -ggdb[0-9] -gstabs -gstabs+"; ALLOWED_FLAGS+=" -fno-ident -fpermissive"; ALLOWED_FLAGS+=" -W* -w"; ALLOWED_FLAGS+=" -fno-stack-protector -fno-stack-protector-all -fno-strict-aliasing -fno-bounds-checking -fstrict-overflow -fno-omit-frame-pointer"; ALLOWED_FLAGS+=" -mregparm -mno-app-regs -mapp-regs -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-ssse3 -mno-sse4 -mno-sse4.1 -mno-sse4.2 -mno-avx -mno-aes -mno-pclmul -mno-sse4a -mno-3dnow -mno-popcnt -mno-abm -mips1 -mips2 -mips3 -mips4 -mips32 -mips64 -mips16 -mplt -msoft-float -mno-soft-float -mhard-float -mno-hard-float -mfpu -mieee -mieee-with-inexact -mschedule -mfloat-gprs -mspe -mno-spe -mtls-direct-seg-refs -mno-tls-direct-seg-refs -mflat -mno-flat -mno-faster-structs -mfaster-structs -m32 -m64 -mx32 -mabi -mlittle-endian -mbig-endian -EL -EB -fPIC -mlive-g0 -mcmodel -mstack-bias -mno-stack-bias -msecure-plt -m*-toc -D* -U*"; ALLOWED_FLAGS+=" -mno-fma4 -mno-movbe -mno-xop -mno-lwp"; ALLOWED_FLAGS+=" -mno-fsgsbase -mno-rdrnd -mno-f16c -mno-bmi -mno-tbm"; export ALLOWED_FLAGS; return 0 } skip_project_generation () { sed -i -e "s:echo \"Finding:exit 0\n\necho \"Finding:g" "${S}"/configure || die } skip_qmake_build () { sed -i -e "s:if true:if false:g" "${S}"/configure || die } src_compile () { qt4-build_src_compile "$@" } src_configure () { export PATH="${S}/bin:${PATH}"; export LD_LIBRARY_PATH="${S}/lib:${LD_LIBRARY_PATH}"; myconf="$(qt_use accessibility) $(qt_use cups) $(use gif || echo -no-gif) $(qt_use glib) $(qt_use mng libmng system) $(qt_use nas nas-sound system) $(qt_use nis) $(qt_use tiff libtiff system) $(qt_use dbus qdbus) $(qt_use dbus) $(qt_use egl) $(qt_use qt3support) $(qt_use gtkstyle) $(qt_use xinerama) $(qt_use xv xvideo)"; myconf+=" -system-libpng -system-libjpeg -no-sql-mysql -no-sql-psql -no-sql-ibase -no-sql-sqlite -no-sql-sqlite2 -no-sql-odbc -sm -xshape -xsync -xcursor -xfixes -xrandr -xrender -mitshm -xinput -xkb -fontconfig -no-svg -no-webkit -no-phonon -no-opengl"; [[ ${CHOST} == *86*-apple-darwin* ]] && myconf+=" -no-ssse3"; qt4-build_src_configure; if use gtkstyle; then einfo "patching the Makefile to fix qgtkstyle compilation"; sed "s:-I/usr/include/qt4 ::" -i src/gui/Makefile || die "sed failed"; fi; sed -i -e "s:-I/usr/include/qt4/QtGui ::" src/gui/Makefile || die "sed failed" } src_install () { QCONFIG_ADD=" mitshm x11sm xcursor xfixes xinput xkb xrandr xrender xshape xsync fontconfig gif png system-png jpeg system-jpeg $(usev accessibility) $(usev cups) $(use mng && echo system-mng) $(usev nas) $(usev nis) $(use tiff && echo system-tiff) $(usev xinerama) $(use xv && echo xvideo)"; QCONFIG_REMOVE="no-gif no-jpeg no-png"; QCONFIG_DEFINE="$(use accessibility && echo QT_ACCESSIBILITY) $(use cups && echo QT_CUPS) $(use egl && echo QT_EGL) QT_FONTCONFIG $(use gtkstyle && echo QT_STYLE_GTK) QT_IMAGEFORMAT_JPEG QT_IMAGEFORMAT_PNG $(use mng && echo QT_IMAGEFORMAT_MNG) $(use nas && echo QT_NAS) $(use nis && echo QT_NIS) $(use tiff && echo QT_IMAGEFORMAT_TIFF) QT_SESSIONMANAGER QT_SHAPE QT_XCURSOR QT_XFIXES $(use xinerama && echo QT_XINERAMA) QT_XINPUT QT_XKB QT_XRANDR QT_XRENDER QT_XSYNC $(use xv && echo QT_XVIDEO)"; qt4-build_src_install; if use aqua && [[ ${CHOST##*-darwin} -ge 9 ]]; then insinto "${QTLIBDIR#${EPREFIX}}"/QtDesigner.framework/Headers/private/; else insinto "${QTHEADERDIR#${EPREFIX}}"/QtDesigner/private/; fi; doins "${S}"/tools/designer/src/lib/shared/*; doins "${S}"/tools/designer/src/lib/sdk/*; if use aqua && [[ ${CHOST##*-darwin} -ge 9 ]]; then insinto "${QTLIBDIR#${EPREFIX}}"/QtGui.framework/Headers/private/; else insinto "${QTHEADERDIR#${EPREFIX}}"/QtGui/private; fi; find "${S}"/src/gui -type f -name '*_p.h' -exec doins {} +; if use aqua && [[ ${CHOST##*-darwin} -ge 9 ]]; then fix_includes; fi; dodir /usr/share/qt4/graphicssystems; echo "default" > "${ED}"/usr/share/qt4/graphicssystems/raster || die; touch "${ED}"/usr/share/qt4/graphicssystems/native || die; doicon tools/designer/src/designer/images/designer.png tools/linguist/linguist/images/icons/linguist-128-32.png; make_desktop_entry designer Designer designer 'Qt;Development;GUIDesigner'; make_desktop_entry linguist Linguist linguist-128-32 'Qt;Development;GUIDesigner' } src_prepare () { qt4-build_src_prepare; sed -i -e 's:|-xinerama|:&-xvideo|:' configure; sed -i -e 's:CONFIG(shared:# &:g' tools/designer/src/src.pro } src_test () { qt4-build_src_test "$@" } src_unpack () { qt4-build_src_unpack "$@" } strip-flags () { local x y var; setup-allowed-flags; set -f; for var in $(all-flag-vars); do local new=(); for x in ${!var}; do local flag=${x%%=*}; for y in ${ALLOWED_FLAGS}; do if [[ -z ${flag%%${y}} ]]; then new+=("${x}"); break; fi; done; done; if _is_flagq ${var} "-O*" && ! _is_flagq new "-O*"; then new+=(-O2); fi; eval export ${var}=\""${new[*]}"\"; done; set +f; return 0 } strip-linguas () { local ls newls nols; if [[ $1 == "-i" ]] || [[ $1 == "-u" ]]; then local op=$1; shift; ls=$(find "$1" -name '*.po' -exec basename {} .po ';'); shift; local d f; for d in "$@"; do if [[ ${op} == "-u" ]]; then newls=${ls}; else newls=""; fi; for f in $(find "$d" -name '*.po' -exec basename {} .po ';'); do if [[ ${op} == "-i" ]]; then has ${f} ${ls} && newls="${newls} ${f}"; else has ${f} ${ls} || newls="${newls} ${f}"; fi; done; ls=${newls}; done; else ls="$@"; fi; nols=""; newls=""; for f in ${LINGUAS}; do if has ${f} ${ls}; then newls="${newls} ${f}"; else nols="${nols} ${f}"; fi; done; [[ -n ${nols} ]] && ewarn "Sorry, but ${PN} does not support the LINGUAS:" ${nols}; export LINGUAS=${newls:1} } strip-unsupported-flags () { export CFLAGS=$(test-flags-CC ${CFLAGS}); export CXXFLAGS=$(test-flags-CXX ${CXXFLAGS}); export FFLAGS=$(test-flags-F77 ${FFLAGS}); export FCFLAGS=$(test-flags-FC ${FCFLAGS}) } symlink_binaries_to_buildtree () { for bin in qmake moc uic rcc; do ln -s "${QTBINDIR}"/${bin} "${S}"/bin/ || die "symlinking ${bin} to ${S}/bin failed"; done } tc-arch () { tc-ninja_magic_to_arch portage "$@" } tc-arch-kernel () { tc-ninja_magic_to_arch kern "$@" } tc-endian () { local host=$1; [[ -z ${host} ]] && host=${CTARGET:-${CHOST}}; host=${host%%-*}; case ${host} in alpha*) echo big ;; arm*b*) echo big ;; arm*) echo little ;; cris*) echo little ;; hppa*) echo big ;; i?86*) echo little ;; ia64*) echo little ;; m68*) echo big ;; mips*l*) echo little ;; mips*) echo big ;; powerpc*) echo big ;; s390*) echo big ;; sh*b*) echo big ;; sh*) echo little ;; sparc*) echo big ;; x86_64*) echo little ;; *) echo wtf ;; esac } tc-env_build () { CFLAGS=${BUILD_CFLAGS:--O1 -pipe} CXXFLAGS=${BUILD_CXXFLAGS:--O1 -pipe} CPPFLAGS=${BUILD_CPPFLAGS} LDFLAGS=${BUILD_LDFLAGS} AR=$(tc-getBUILD_AR) AS=$(tc-getBUILD_AS) CC=$(tc-getBUILD_CC) CPP=$(tc-getBUILD_CPP) CXX=$(tc-getBUILD_CXX) LD=$(tc-getBUILD_LD) NM=$(tc-getBUILD_NM) PKG_CONFIG=$(tc-getBUILD_PKG_CONFIG) RANLIB=$(tc-getBUILD_RANLIB) "$@" } tc-export () { local var; for var in "$@"; do [[ $(type -t tc-get${var}) != "function" ]] && die "tc-export: invalid export variable '${var}'"; eval tc-get${var} > /dev/null; done } tc-getAR () { tc-getPROG AR ar "$@" } tc-getAS () { tc-getPROG AS as "$@" } tc-getBUILD_AR () { tc-getBUILD_PROG AR ar "$@" } tc-getBUILD_AS () { tc-getBUILD_PROG AS as "$@" } tc-getBUILD_CC () { tc-getBUILD_PROG CC gcc "$@" } tc-getBUILD_CPP () { tc-getBUILD_PROG CPP cpp "$@" } tc-getBUILD_CXX () { tc-getBUILD_PROG CXX g++ "$@" } tc-getBUILD_LD () { tc-getBUILD_PROG LD ld "$@" } tc-getBUILD_NM () { tc-getBUILD_PROG NM nm "$@" } tc-getBUILD_OBJCOPY () { tc-getBUILD_PROG OBJCOPY objcopy "$@" } tc-getBUILD_PKG_CONFIG () { tc-getBUILD_PROG PKG_CONFIG pkg-config "$@" } tc-getBUILD_PROG () { _tc-getPROG CBUILD "BUILD_$1 $1_FOR_BUILD HOST$1" "${@:2}" } tc-getBUILD_RANLIB () { tc-getBUILD_PROG RANLIB ranlib "$@" } tc-getBUILD_STRIP () { tc-getBUILD_PROG STRIP strip "$@" } tc-getCC () { tc-getPROG CC gcc "$@" } tc-getCPP () { tc-getPROG CPP cpp "$@" } tc-getCXX () { tc-getPROG CXX g++ "$@" } tc-getDLLWRAP () { tc-getPROG DLLWRAP dllwrap "$@" } tc-getF77 () { tc-getPROG F77 gfortran "$@" } tc-getFC () { tc-getPROG FC gfortran "$@" } tc-getGCJ () { tc-getPROG GCJ gcj "$@" } tc-getLD () { tc-getPROG LD ld "$@" } tc-getNM () { tc-getPROG NM nm "$@" } tc-getOBJCOPY () { tc-getPROG OBJCOPY objcopy "$@" } tc-getPKG_CONFIG () { tc-getPROG PKG_CONFIG pkg-config "$@" } tc-getPROG () { _tc-getPROG CHOST "$@" } tc-getRANLIB () { tc-getPROG RANLIB ranlib "$@" } tc-getRC () { tc-getPROG RC windres "$@" } tc-getSTRIP () { tc-getPROG STRIP strip "$@" } tc-has-openmp () { local base="${T}/test-tc-openmp"; cat > "${base}.c" <<-EOF #include int main() { int nthreads, tid, ret = 0; #pragma omp parallel private(nthreads, tid) { tid = omp_get_thread_num(); nthreads = omp_get_num_threads(); ret += tid + nthreads; } return ret; } EOF $(tc-getCC "$@") -fopenmp "${base}.c" -o "${base}" &>/dev/null; local ret=$?; rm -f "${base}"*; return ${ret} } tc-has-tls () { local base="${T}/test-tc-tls"; cat > "${base}.c" <<-EOF int foo(int *i) { static __thread int j = 0; return *i ? j : *i; } EOF local flags; case $1 in -s) flags="-S" ;; -c) flags="-c" ;; -l) ;; -*) die "Usage: tc-has-tls [-c|-l] [toolchain prefix]" ;; esac; : ${flags:=-fPIC -shared -Wl,-z,defs}; [[ $1 == -* ]] && shift; $(tc-getCC "$@") ${flags} "${base}.c" -o "${base}" &>/dev/null; local ret=$?; rm -f "${base}"*; return ${ret} } tc-is-cross-compiler () { return $([[ ${CBUILD:-${CHOST}} != ${CHOST} ]]) } tc-is-hardfloat () { [[ ${CTARGET//_/-} == *-hardfloat-* ]] && echo "yes" || echo "no" } tc-is-softfloat () { case ${CTARGET} in bfin* | h8300*) echo "only" ;; *) [[ ${CTARGET//_/-} == *-softfloat-* ]] && echo "yes" || echo "no" ;; esac } tc-is-static-only () { local host=${CTARGET:-${CHOST}}; return $([[ ${host} == *-mint* ]]) } tc-ninja_magic_to_arch () { function ninj () { [[ ${type} == "kern" ]] && echo $1 || echo $2 }; local type=$1; local host=$2; [[ -z ${host} ]] && host=${CTARGET:-${CHOST}}; case ${host} in alpha*) echo alpha ;; arm*) echo arm ;; avr*) ninj avr32 avr ;; bfin*) ninj blackfin bfin ;; cris*) echo cris ;; hppa*) ninj parisc hppa ;; i?86*) if [[ ${type} == "kern" ]] && [[ $(KV_to_int ${KV}) -lt $(KV_to_int 2.6.24) || ${host} == *freebsd* ]]; then echo i386; else echo x86; fi ;; ia64*) echo ia64 ;; m68*) echo m68k ;; mips*) echo mips ;; nios2*) echo nios2 ;; nios*) echo nios ;; powerpc*) if [[ ${type} == "kern" ]] && [[ $(KV_to_int ${KV}) -ge $(KV_to_int 2.6.16) ]]; then echo powerpc; else if [[ ${type} == "kern" ]] && [[ $(KV_to_int ${KV}) -eq $(KV_to_int 2.6.15) ]]; then if [[ ${host} == powerpc64* ]] || [[ ${PROFILE_ARCH} == "ppc64" ]]; then echo powerpc; else echo ppc; fi; else if [[ ${host} == powerpc64* ]]; then echo ppc64; else if [[ ${PROFILE_ARCH} == "ppc64" ]]; then ninj ppc64 ppc; else echo ppc; fi; fi; fi; fi ;; s390*) echo s390 ;; sh64*) ninj sh64 sh ;; sh*) echo sh ;; sparc64*) ninj sparc64 sparc ;; sparc*) [[ ${PROFILE_ARCH} == "sparc64" ]] && ninj sparc64 sparc || echo sparc ;; vax*) echo vax ;; x86_64*freebsd*) echo amd64 ;; x86_64*) if [[ ${type} == "kern" ]] && [[ $(KV_to_int ${KV}) -ge $(KV_to_int 2.6.24) ]]; then echo x86; else ninj x86_64 amd64; fi ;; *) echo unknown ;; esac } test-flag-CC () { test-flag-PROG "CC" "$1" } test-flag-CXX () { test-flag-PROG "CXX" "$1" } test-flag-F77 () { test-flag-PROG "F77" "$1" } test-flag-FC () { test-flag-PROG "FC" "$1" } test-flag-PROG () { local comp=$1; local flag=$2; [[ -z ${comp} || -z ${flag} ]] && return 1; local PROG=$(tc-get${comp}); ${PROG} "${flag}" -c -o /dev/null -xc /dev/null > /dev/null 2>&1 } test-flags () { test-flags-CC "$@" } test-flags-CC () { test-flags-PROG "CC" "$@" } test-flags-CXX () { test-flags-PROG "CXX" "$@" } test-flags-F77 () { test-flags-PROG "F77" "$@" } test-flags-FC () { test-flags-PROG "FC" "$@" } test-flags-PROG () { local comp=$1; local flags; local x; shift; [[ -z ${comp} ]] && return 1; for x in "$@"; do test-flag-${comp} "${x}" && flags="${flags}${flags:+ }${x}"; done; echo "${flags}"; [[ -n ${flags} ]] } test_version_info () { if [[ $($(tc-getCC) --version 2>&1) == *$1* ]]; then return 0; else return 1; fi } use_if_iuse () { in_iuse $1 || return 1; use $1 } usex () { use "$1" && echo "${2-yes}$4" || echo "${3-no}$5" } validate_desktop_entries () { if [[ -x /usr/bin/desktop-file-validate ]]; then einfo "Checking desktop entry validity"; local directories=""; for d in /usr/share/applications $@; do [[ -d ${D}${d} ]] && directories="${directories} ${D}${d}"; done; if [[ -n ${directories} ]]; then for FILE in $(find ${directories} -name "*\.desktop" -not -path '*.hidden*' | sort -u 2>/dev/null); do local temp=$(desktop-file-validate ${FILE} | grep -v "warning:" | sed -e "s|error: ||" -e "s|${FILE}:|--|g" ); [[ -n $temp ]] && elog ${temp/--/${FILE/${D}/}:}; done; fi; echo ""; else einfo "Passing desktop entry validity check. Install dev-util/desktop-file-utils, if you want to help to improve Gentoo."; fi } version_compare () { eshopts_push -s extglob; local ver_a=${1} ver_b=${2} parts_a parts_b; local cur_tok_a cur_tok_b num_part_a num_part_b; local -i cur_idx_a=0 cur_idx_b=0 prev_idx_a prev_idx_b; parts_a=($(get_all_version_components "${ver_a}" )); parts_b=($(get_all_version_components "${ver_b}" )); local -i inf_loop=0; while true; do inf_loop+=1; ((inf_loop > 20)) && die "versionator compare bug [numbers, ${ver_a}, ${ver_b}]"; prev_idx_a=cur_idx_a; prev_idx_b=cur_idx_b; cur_tok_a=${parts_a[cur_idx_a]}; cur_tok_b=${parts_b[cur_idx_b]}; if [[ -n ${cur_tok_a} ]] && [[ -z ${cur_tok_a//[[:digit:]]} ]]; then cur_idx_a+=1; [[ ${parts_a[cur_idx_a]} == . ]] && cur_idx_a+=1; else cur_tok_a=; fi; if [[ -n ${cur_tok_b} ]] && [[ -z ${cur_tok_b//[[:digit:]]} ]]; then cur_idx_b+=1; [[ ${parts_b[cur_idx_b]} == . ]] && cur_idx_b+=1; else cur_tok_b=; fi; [[ -z ${cur_tok_a} && -z ${cur_tok_b} ]] && break; [[ -z ${cur_tok_a} ]] && eshopts_pop && return 1; [[ -z ${cur_tok_b} ]] && eshopts_pop && return 3; if (( prev_idx_a != 0 && prev_idx_b != 0 )) && [[ ${cur_tok_a} == 0* || ${cur_tok_b} == 0* ]]; then cur_tok_a=${cur_tok_a%%+(0)}; cur_tok_b=${cur_tok_b%%+(0)}; [[ ${cur_tok_a} < ${cur_tok_b} ]] && eshopts_pop && return 1; [[ ${cur_tok_a} > ${cur_tok_b} ]] && eshopts_pop && return 3; else cur_tok_a=${cur_tok_a##+(0)}; cur_tok_b=${cur_tok_b##+(0)}; : ${cur_tok_a:=0}; : ${cur_tok_b:=0}; ((cur_tok_a < cur_tok_b)) && eshopts_pop && return 1; ((cur_tok_a > cur_tok_b)) && eshopts_pop && return 3; fi; done; local letter_a=; letter_a=${parts_a[cur_idx_a]}; if [[ ${#letter_a} -eq 1 && -z ${letter_a/[a-z]} ]]; then cur_idx_a+=1; else letter_a=@; fi; local letter_b=; letter_b=${parts_b[cur_idx_b]}; if [[ ${#letter_b} -eq 1 && -z ${letter_b/[a-z]} ]]; then cur_idx_b+=1; else letter_b=@; fi; [[ ${letter_a} < ${letter_b} ]] && eshopts_pop && return 1; [[ ${letter_a} > ${letter_b} ]] && eshopts_pop && return 3; inf_loop=0; while true; do inf_loop+=1; ((inf_loop > 20)) && die "versionator compare bug [numbers, ${ver_a}, ${ver_b}]"; [[ ${parts_a[cur_idx_a]} == _ ]] && ((cur_idx_a++)); [[ ${parts_b[cur_idx_b]} == _ ]] && ((cur_idx_b++)); cur_tok_a=${parts_a[cur_idx_a]}; cur_tok_b=${parts_b[cur_idx_b]}; num_part_a=0; num_part_b=0; if has ${cur_tok_a%%+([0-9])} "alpha" "beta" "pre" "rc" "p"; then cur_idx_a+=1; num_part_a=${cur_tok_a##+([a-z])}; num_part_a=${num_part_a##+(0)}; : ${num_part_a:=0}; cur_tok_a=${cur_tok_a%%+([0-9])}; else cur_tok_a=; fi; if has ${cur_tok_b%%+([0-9])} alpha beta pre rc p; then cur_idx_b+=1; num_part_b=${cur_tok_b##+([a-z])}; num_part_b=${num_part_b##+(0)}; : ${num_part_b:=0}; cur_tok_b=${cur_tok_b%%+([0-9])}; else cur_tok_b=; fi; if [[ ${cur_tok_a} != ${cur_tok_b} ]]; then local suffix; for suffix in alpha beta pre rc "" p; do [[ ${cur_tok_a} == ${suffix} ]] && eshopts_pop && return 1; [[ ${cur_tok_b} == ${suffix} ]] && eshopts_pop && return 3; done; else if [[ -z ${cur_tok_a} && -z ${cur_tok_b} ]]; then break; else ((num_part_a < num_part_b)) && eshopts_pop && return 1; ((num_part_a > num_part_b)) && eshopts_pop && return 3; fi; fi; done; [[ ${parts_a[cur_idx_a]} == - ]] && ((cur_idx_a++)); [[ ${parts_b[cur_idx_b]} == - ]] && ((cur_idx_b++)); if [[ -n ${parts_a[cur_idx_a]/r+([0-9])} || -n ${parts_b[cur_idx_b]/r+([0-9])} ]]; then die "versionator compare bug [revisions, ${ver_a}, ${ver_b}]"; fi; num_part_a=${parts_a[cur_idx_a]#r}; num_part_a=${num_part_a##+(0)}; : ${num_part_a:=0}; num_part_b=${parts_b[cur_idx_b]#r}; num_part_b=${num_part_b##+(0)}; : ${num_part_b:=0}; ((num_part_a < num_part_b)) && eshopts_pop && return 1; ((num_part_a > num_part_b)) && eshopts_pop && return 3; eshopts_pop; return 2 } version_format_string () { local fstr=$1; shift; set -- $(get_version_components "$@"); eval echo "${fstr}" } version_is_at_least () { local want_s="$1" have_s="${2:-${PVR}}" r; version_compare "${want_s}" "${have_s}"; r=$?; case $r in 1 | 2) return 0 ;; 3) return 1 ;; *) die "versionator compare bug [atleast, ${want_s}, ${have_s}, ${r}]" ;; esac } version_sort () { eshopts_push -s extglob; local items=; local -i left=0; items=("$@"); while ((left < ${#items[@]})); do local -i lowest_idx=left; local -i idx=lowest_idx+1; while ((idx < ${#items[@]})); do version_compare "${items[lowest_idx]}" "${items[idx]}"; [[ $? -eq 3 ]] && lowest_idx=idx; idx+=1; done; local tmp=${items[lowest_idx]}; items[lowest_idx]=${items[left]}; items[left]=${tmp}; left+=1; done; echo ${items[@]}; eshopts_pop }