aboutsummaryrefslogtreecommitdiff
blob: f17814762124959eff6e0b5e47d493f14d18867a (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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#!/bin/sh
# Copyright 2008-2022 Gentoo Authors
# 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
}

# abort infinite loop due to misconfiguration
[ "${0##*/}" = "pkg-config" ] && error "aborting infinite loop! (make sure to delete uClinux-dist/tools/pkg-config)"

#
# 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

export PKG_CONFIG_LIBDIR=
unset PREFIX

if [ -z "${CHOST}" ] ; then
	CHOST=${0##*/}
	CHOST=${CHOST%-pkg-config}
fi

if [ -n "${ESYSROOT+x}" ] ; then
	# Gentoo EAPI 7+
	: ${PKG_CONFIG_SYSROOT_DIR=${SYSROOT}}
	PREFIX=${ESYSROOT%/}
	PREFIX=${PREFIX#${SYSROOT%/}}
elif [ -n "${ROOT+x}" ] ; then
	# Gentoo EAPI 0-6
	if [ -n "${SYSROOT%/}" ]; then
		: ${PKG_CONFIG_SYSROOT_DIR=${SYSROOT}}
		PREFIX=${EPREFIX%/}
	else
		: ${PKG_CONFIG_SYSROOT_DIR=}
		PREFIX=${PORTAGE_OVERRIDE_EPREFIX%/}
	fi
elif [ -n "${SYSROOT+x}" ] ; then
	# Generic
	: ${PKG_CONFIG_SYSROOT_DIR=${SYSROOT}}
elif [ "@CROSS_PKG_CONFIG_INSTALLED@" = "installed" ] ; then
	# Manual install
	: ${PKG_CONFIG_SYSROOT_DIR="@CROSS_PKG_CONFIG_PATH@"}
elif [ -n "${STAGEDIR}" ] ; then
	# uClinux-dist
	: ${PKG_CONFIG_SYSROOT_DIR=${STAGEDIR}}
	PKG_CONFIG_LIBDIR=${UCLINUX_PKG_CONFIG_LIBDIR}
else
	# /usr/<target>
	: ${PKG_CONFIG_SYSROOT_DIR=/usr/${CHOST}}

	if [ -z "${CHOST}" ] || [ ! -d "${PKG_CONFIG_SYSROOT_DIR}" ] ; then
		error "Need \$ROOT or \$STAGEDIR set first"
	fi
fi

export PKG_CONFIG_SYSROOT_DIR=${PKG_CONFIG_SYSROOT_DIR%/}
PKG_CONFIG_ESYSROOT_DIR=${PKG_CONFIG_SYSROOT_DIR}${PREFIX}

#
# 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=${libdir##*/}
fi
: ${libdir:=lib}
export PKG_CONFIG_SYSTEM_LIBRARY_PATH="${PREFIX}/usr/${libdir}:${PREFIX}/${libdir}"

#
# Set the pkg-config search paths to our staging directory.
#
PKG_CONFIG_LIBDIR="${PKG_CONFIG_LIBDIR}${PKG_CONFIG_LIBDIR:+:}${PKG_CONFIG_ESYSROOT_DIR}/usr/${libdir}/pkgconfig:${PKG_CONFIG_ESYSROOT_DIR}/usr/share/pkgconfig"

#
# 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 ${PKG_CONFIG_ESYSROOT_DIR}.
bad_lines=$(
	printf "%s\n" ${output} |                # Put each flags on its own line.
	grep '^-[LI]' |                          # Find all -I and -L lines.
	grep -v "^..${PKG_CONFIG_ESYSROOT_DIR}"  # 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 ######"
	printf "%s\n" "${bad_lines}"
	warn "### end of flag dump ##########################"
	error "host -I or -L paths detected: ${output}"
fi
[ -n "${output}" ] && printf "%s\n" "${output}"
exit ${ret}