#!/bin/sh # Copyright 2008-2014 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # # This creates a pkg-config frontend that has the form TARGET-pkg-config # as this is the utility that autoconf scripts will automatically search # for when cross-compiling for TARGET. Here we setup the pkg config env # paths so that the .pc files that are searched and used come from the # staging directory rather than the host system. # # # Helper functions. So very helpful. # msg_to_stderr() { echo "cross-pkg-config: $*" 1>&2 ; } warn() { msg_to_stderr "warning: $*" ; } error() { msg_to_stderr "error: $*" exit 1 } # # Sanity/distro checks # MIN_VER="0.24" # needs working PKG_CONFIG_SYSROOT_DIR if ! pkg-config --atleast-pkgconfig-version ${MIN_VER} ; then error pkg-config is too old ... upgrade to at least v${MIN_VER} fi if [ "$1" = "--cross-pkg-config-install" ] ; then # --cross-pkg-config-install [pkg-config wrapper] pkg_path="$2" pkg_config="${3:-$0}" sed -i.tmp \ -e "s:@CROSS_PKG_CONFIG_INSTALLED@:installed:" \ -e "s:@CROSS_PKG_CONFIG_PATH@:${pkg_path}:" \ "${pkg_config}" rm -f "${pkg_config}".tmp chmod a+rx "${pkg_config}" exit 0 fi unset EXTRA_PKG_CONFIG_LIBDIR if [ -z "${CHOST}" ] ; then CHOST=${0##*/} CHOST=${CHOST%-pkg-config} fi if [ -z "${SYSROOT}" ] ; then if [ "@CROSS_PKG_CONFIG_INSTALLED@" = "installed" ] ; then # Manual install SYSROOT="@CROSS_PKG_CONFIG_PATH@" elif [ -n "${ROOT}" ] ; then # Gentoo SYSROOT=${ROOT} elif [ -n "${STAGEDIR}" ] ; then # uClinux-dist SYSROOT=${STAGEDIR} EXTRA_PKG_CONFIG_LIBDIR=${UCLINUX_PKG_CONFIG_LIBDIR} else # /usr/ SYSROOT="/usr/${CHOST}" if [ -z "${CHOST}" ] || [ ! -d "${SYSROOT}" ] ; then error "Need \$ROOT or \$STAGEDIR set first" fi fi fi # abort infinite loop due to misconfiguration [ "${0##*/}" = "pkg-config" ] && error "aborting infinite loop! (make sure to delete uClinux-dist/tools/pkg-config)" # # Some distributions pollute the pkg-config environment. # Time to pull a captain planet on them. # unset PKG_CONFIG_PATH unset PKG_CONFIG_ALLOW_SYSTEM_CFLAGS unset PKG_CONFIG_ALLOW_SYSTEM_LIBS # # Try and figure out the appropriate libdir for this target. # This logic matches Gentoo's get_libdir which uses $ABI. # : ${ABI:=${DEFAULT_ABI:-default}} var="LIBDIR_${ABI}" eval libdir=\${${var}} if [ -z "${libdir}" ] ; then # Fall back to probing the compiler. libdir=$(realpath "$(${CC:-${CHOST}-gcc} ${CFLAGS} ${LDFLAGS} -print-file-name=pkgconfig)/..") # Chopping the basename isn't exactly correct, but it's good enough for now. libdir=$(basename "${libdir}") fi : ${libdir:=lib} export PKG_CONFIG_SYSTEM_LIBRARY_PATH="/usr/${libdir}:/${libdir}" # # Set the pkg-config search paths to our staging directory. # export PKG_CONFIG_LIBDIR="${SYSROOT}/usr/${libdir}/pkgconfig:${SYSROOT}/usr/share/pkgconfig" if [ -n "${EXTRA_PKG_CONFIG_LIBDIR}" ] ; then PKG_CONFIG_LIBDIR="${EXTRA_PKG_CONFIG_LIBDIR}:${PKG_CONFIG_LIBDIR}" fi export PKG_CONFIG_SYSROOT_DIR="${SYSROOT}" # # Sanity check the output to catch common errors that do not # cause failures until much later on. # output=$(pkg-config "$@") ret=$? # We turn the output into a newline separate string of options, then use grep # to look for bad -Is and -Ls. Bad -Is and -Ls are ones that point to things # outside the ${SYSROOT}. bad_lines=$(echo "${output}" | # Get the pkg-config output. tr -s ' ' '\n' | # Put each flags on its own line. grep '^-[LI]' | # Find all -I and -L lines. grep -v -E "..${SYSROOT}" # Find all things outside the SYSROOT. ) if [ -n "${bad_lines}" ] ; then warn "### falling down so here is a dump state ######" pkg-config --debug "$@" 1>&2 warn "### end of dump ###############################" warn "### suspicious compile flags dumped here ######" echo "${bad_lines}" warn "### end of flag dump ##########################" error "host -I or -L paths detected: ${output}" fi [ -n "${output}" ] && echo "${output}" exit ${ret}