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