aboutsummaryrefslogtreecommitdiff
blob: e7a234c0bac74661a165c06548193398bf95469c (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
#!/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 <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
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}