blob: 62f0dfa589f192434e70cec1e98bdb3df66b2bb4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
#!/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
}
#
# Allow very basic checks. This is not very sophisticated, but should get the
# job done, practically speaking.
#
case $1 in
--about|--help|--version)
exec pkg-config "$@"
;;
esac
#
# Sanity/distro checks
#
if [ "$1" = "--cross-pkg-config-install" ] ; then
# --cross-pkg-config-install <sysroot dir> [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/<target>
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
: ${PKG_CONFIG_SYSROOT_DIR=${SYSROOT}}
export PKG_CONFIG_SYSROOT_DIR
#
# 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}
|