aboutsummaryrefslogtreecommitdiffstats
path: root/tools/check/funcs.sh
blob: 054c579f15c148c7ece74f851c36dc9fbff229a3 (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
# has is the same as which, except it handles cross environments
has() {
	if [ -z "$CROSS_COMPILE" ]; then
		command which "$@"
		return $?
	fi

	check_sys_root || return 1

	# subshell to prevent pollution of caller's IFS
	(
	IFS=:
	for p in $PATH; do
		if [ -x "$CROSS_SYS_ROOT/$p/$1" ]; then
			echo "$CROSS_SYS_ROOT/$p/$1"
			return 0
		fi
	done
	return 1
	)
}

has_or_fail() {
	has "$1" >/dev/null || fail "can't find $1"
}

has_header() {
	check_sys_root || return 1

	case $1 in
		/*) ;;
		*)
		if [ -r "$CROSS_SYS_ROOT/usr/include/$1" ]; then
			return 0
		fi
		for path in ${CHECK_INCLUDES}; do
			if [ -r "$CROSS_SYS_ROOT${path}/$1" ]; then
				return 0
			fi
		done
		;;
	esac

	return 1
}

has_lib() {
	check_sys_root || return 1

	# subshell to prevent pollution of caller's environment
	(
	PATH=/sbin:$PATH        # for ldconfig
	LIBRARIES="$CHECK_LIB /usr/lib"

	# This relatively common in a sys-root; libs are installed but
	# ldconfig hasn't run there, so ldconfig -p won't work.
	if [ "$OS" = Linux -a ! -f "$CROSS_SYS_ROOT/etc/ld.so.cache" ]; then
	    echo "Please run ldconfig -r \"$CROSS_SYS_ROOT\" to generate ld.so.cache"
	    # fall through; ldconfig test below should fail
	fi
	if [ "${OS}" = "Linux" ]; then
		ldconfig -p ${CROSS_SYS_ROOT+-r "$CROSS_SYS_ROOT"} | grep -Fq "$1"
		return $?
	fi
	if [ "${OS}" = "NetBSD" ]; then
		ls -1 ${LIBRARIES} | grep -Fq "$1"
		return $?
	fi
	return 1
	)
}

test_link() {
	# subshell to trap removal of tmpfile
	(
	unset tmpfile
	trap 'rm -f "$tmpfile"; exit' 0 1 2 15
	tmpfile=`mktemp` || return 1
	ld "$@" -o "$tmpfile" >/dev/null 2>&1
	return $?
	)
}

# this function is used commonly above
check_sys_root() {
	[ -z "$CROSS_COMPILE" ] && return 0
	if [ -z "$CROSS_SYS_ROOT" ]; then
		echo "please set CROSS_SYS_ROOT in the environment"
		return 1
	fi
	if [ ! -d "$CROSS_SYS_ROOT" ]; then
		echo "no sys-root found at $CROSS_SYS_ROOT"
		return 1
	fi
}

warning() {
	echo
	echo " *** `basename "$0"` FAILED${*+: $*}"
}

fail() {
	echo
	echo " *** `basename "$0"` FAILED${*+: $*}"
	exit 1
}