summaryrefslogtreecommitdiff
path: root/support/dependencies/dependencies.sh
blob: bfd65960ce8ed5d79de3fdfbc9985bbff7e800ce (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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
#!/bin/sh
# vi: set sw=4 ts=4:

export LC_ALL=C

# Verify that grep works
echo "WORKS" | grep "WORKS" >/dev/null 2>&1
if test $? != 0 ; then
	echo
	echo "grep doesn't work"
	exit 1
fi

# sanity check for CWD in LD_LIBRARY_PATH
# try not to rely on egrep..
if test -n "$LD_LIBRARY_PATH" ; then
	echo TRiGGER_start"$LD_LIBRARY_PATH"TRiGGER_end | grep '::' >/dev/null 2>&1 ||
	echo TRiGGER_start"$LD_LIBRARY_PATH"TRiGGER_end | grep ':\.:' >/dev/null 2>&1 ||
	echo TRiGGER_start"$LD_LIBRARY_PATH"TRiGGER_end | grep 'TRiGGER_start:' >/dev/null 2>&1 ||
	echo TRiGGER_start"$LD_LIBRARY_PATH"TRiGGER_end | grep 'TRiGGER_start\.:' >/dev/null 2>&1 ||
	echo TRiGGER_start"$LD_LIBRARY_PATH"TRiGGER_end | grep ':TRiGGER_end' >/dev/null 2>&1 ||
	echo TRiGGER_start"$LD_LIBRARY_PATH"TRiGGER_end | grep ':\.TRiGGER_end' >/dev/null 2>&1 ||
	echo TRiGGER_start"$LD_LIBRARY_PATH"TRiGGER_end | grep 'TRiGGER_start\.TRiGGER_end' >/dev/null 2>&1
	if test $? = 0; then
		echo
		echo "You seem to have the current working directory in your"
		echo "LD_LIBRARY_PATH environment variable. This doesn't work."
		exit 1;
	fi
fi;

# sanity check for CWD in PATH. Having the current working directory
# in the PATH makes the toolchain build process break.
# try not to rely on egrep..
if test -n "$PATH" ; then
	echo TRiGGER_start"$PATH"TRiGGER_end | grep ':\.:' >/dev/null 2>&1 ||
	echo TRiGGER_start"$PATH"TRiGGER_end | grep 'TRiGGER_start\.:' >/dev/null 2>&1 ||
	echo TRiGGER_start"$PATH"TRiGGER_end | grep ':\.TRiGGER_end' >/dev/null 2>&1 ||
	echo TRiGGER_start"$PATH"TRiGGER_end | grep 'TRiGGER_start\.TRiGGER_end' >/dev/null 2>&1
	if test $? = 0; then
		echo
		echo "You seem to have the current working directory in your"
		echo "PATH environment variable. This doesn't work."
		exit 1;
	fi
fi;

if test -n "$PERL_MM_OPT" ; then
	echo
	echo "You have PERL_MM_OPT defined because Perl local::lib"
	echo "is installed on your system. Please unset this variable"
	echo "before starting Buildroot, otherwise the compilation of"
	echo "Perl related packages will fail"
	exit 1
fi

check_prog_host()
{
	prog="$1"
	if ! which $prog > /dev/null ; then
		echo >&2
		echo "You must install '$prog' on your build machine" >&2
		exit 1
	fi
}

# Verify that which is installed
check_prog_host "which"
# Verify that sed is installed
check_prog_host "sed"

# Check make
MAKE=$(which make 2> /dev/null)
if [ -z "$MAKE" ] ; then
	echo
	echo "You must install 'make' on your build machine";
	exit 1;
fi;
MAKE_VERSION=$($MAKE --version 2>&1 | sed -e 's/^.* \([0-9\.]\)/\1/g' -e 's/[-\ ].*//g' -e '1q')
if [ -z "$MAKE_VERSION" ] ; then
	echo
	echo "You must install 'make' on your build machine";
	exit 1;
fi;
MAKE_MAJOR=$(echo $MAKE_VERSION | sed -e "s/\..*//g")
MAKE_MINOR=$(echo $MAKE_VERSION | sed -e "s/^$MAKE_MAJOR\.//g" -e "s/\..*//g" -e "s/[a-zA-Z].*//g")
if [ $MAKE_MAJOR -lt 3 ] || [ $MAKE_MAJOR -eq 3 -a $MAKE_MINOR -lt 81 ] ; then
	echo
	echo "You have make '$MAKE_VERSION' installed.  GNU make >=3.81 is required"
	exit 1;
fi;

# Check host gcc
COMPILER=$(which $HOSTCC_NOCCACHE 2> /dev/null)
if [ -z "$COMPILER" ] ; then
	COMPILER=$(which cc 2> /dev/null)
fi;
if [ -z "$COMPILER" ] ; then
	echo
	echo "You must install 'gcc' on your build machine";
	exit 1;
fi;

COMPILER_VERSION=$($COMPILER -v 2>&1 | sed -n '/^gcc version/p' |
	sed -e 's/^gcc version \([0-9\.]\)/\1/g' -e 's/[-\ ].*//g' -e '1q')
if [ -z "$COMPILER_VERSION" ] ; then
	echo
	echo "You must install 'gcc' on your build machine";
	exit 1;
fi;
COMPILER_MAJOR=$(echo $COMPILER_VERSION | sed -e "s/\..*//g")
COMPILER_MINOR=$(echo $COMPILER_VERSION | sed -e "s/^$COMPILER_MAJOR\.//g" -e "s/\..*//g")
if [ $COMPILER_MAJOR -lt 3 -o $COMPILER_MAJOR -eq 2 -a $COMPILER_MINOR -lt 95 ] ; then
	echo
	echo "You have gcc '$COMPILER_VERSION' installed.  gcc >= 2.95 is required"
	exit 1;
fi;

# check for host CXX
CXXCOMPILER=$(which $HOSTCXX_NOCCACHE 2> /dev/null)
if [ -z "$CXXCOMPILER" ] ; then
	CXXCOMPILER=$(which c++ 2> /dev/null)
fi

if [ -z "$CXXCOMPILER" ] ; then
	echo
	echo "You may have to install 'g++' on your build machine"
fi
if [ ! -z "$CXXCOMPILER" ] ; then
	CXXCOMPILER_VERSION=$($CXXCOMPILER -v 2>&1 | sed -n '/^gcc version/p' |
		sed -e 's/^gcc version \([0-9\.]\)/\1/g' -e 's/[-\ ].*//g' -e '1q')
	if [ -z "$CXXCOMPILER_VERSION" ] ; then
		echo
		echo "You may have to install 'g++' on your build machine"
	fi
fi

if [ -n "$CXXCOMPILER_VERSION" ] ; then
	CXXCOMPILER_MAJOR=$(echo $CXXCOMPILER_VERSION | sed -e "s/\..*//g")
	CXXCOMPILER_MINOR=$(echo $CXXCOMPILER_VERSION | sed -e "s/^$CXXCOMPILER_MAJOR\.//g" -e "s/\..*//g")
	if [ $CXXCOMPILER_MAJOR -lt 3 -o $CXXCOMPILER_MAJOR -eq 2 -a $CXXCOMPILER_MINOR -lt 95 ] ; then
		echo
		echo "You have g++ '$CXXCOMPILER_VERSION' installed.  g++ >= 2.95 is required"
		exit 1
	fi
fi

# Check bash
# We only check bash is available, setting SHELL appropriately is done
# in the top-level Makefile, and we mimick the same sequence here
if   [ -n "${BASH}" ]; then :
elif [ -x /bin/bash ]; then :
elif [ -z "$( sh -c 'echo $BASH' )" ]; then
	echo
	echo "You must install 'bash' on your build machine"
	exit 1
fi

# Check that a few mandatory programs are installed
missing_progs="no"
for prog in patch perl tar wget cpio python unzip rsync bc ${DL_TOOLS} ; do
	if ! which $prog > /dev/null ; then
		echo "You must install '$prog' on your build machine";
		missing_progs="yes"
		if test $prog = "svn" ; then
			echo "  svn is usually part of the subversion package in your distribution"
		elif test $prog = "hg" ; then
			echo "  hg is usually part of the mercurial package in your distribution"
		elif test $prog = "zcat" ; then
			echo "  zcat is usually part of the gzip package in your distribution"
		elif test $prog = "bzcat" ; then
			echo "  bzcat is usually part of the bzip2 package in your distribution"
		fi
	fi
done

if test "${missing_progs}" = "yes" ; then
	exit 1
fi

if grep ^BR2_NEEDS_HOST_UTF8_LOCALE=y $BR2_CONFIG > /dev/null; then
	if ! which locale > /dev/null ; then
		echo
		echo "You need locale support on your build machine to build a toolchain supporting locales"
		exit 1 ;
	fi
	if ! locale -a | grep -q -i utf8$ ; then
		echo
		echo "You need at least one UTF8 locale to build a toolchain supporting locales"
		exit 1 ;
	fi
fi

if grep -q ^BR2_NEEDS_HOST_JAVA=y $BR2_CONFIG ; then
	check_prog_host "java"
	JAVA_GCJ=$(java -version 2>&1 | grep gcj)
	if [ ! -z "$JAVA_GCJ" ] ; then
		echo
		echo "$JAVA_GCJ is not sufficient to compile your package selection."
		echo "Please install an OpenJDK/IcedTea/Oracle Java."
		exit 1 ;
	fi
fi

if grep -q ^BR2_NEEDS_HOST_JAVAC=y $BR2_CONFIG ; then
	check_prog_host "javac"
fi

if grep -q ^BR2_NEEDS_HOST_JAR=y $BR2_CONFIG ; then
	check_prog_host "jar"
fi

if grep -q ^BR2_HOSTARCH_NEEDS_IA32_LIBS=y $BR2_CONFIG ; then
	if test ! -f /lib/ld-linux.so.2 ; then
		echo
		echo "Your Buildroot configuration uses pre-built tools for the x86 architecture,"
		echo "but your build machine uses the x86-64 architecture without the 32 bits compatibility"
		echo "library."
		echo "If you're running a Debian/Ubuntu distribution, install the libc6-i386,"
		echo "lib32stdc++6, and lib32z1 packages (or alternatively libc6:i386,"
		echo "libstdc++6:i386, and zlib1g:i386)."
		echo "For other distributions, refer to the documentation on how to install the 32 bits"
		echo "compatibility libraries."
		exit 1
	fi
fi

if grep -q ^BR2_HOSTARCH_NEEDS_IA32_COMPILER=y $BR2_CONFIG ; then
	if ! echo "int main(void) {}" | gcc -m32 -x c - -o /dev/null 2>/dev/null; then
		echo
		echo "Your Buildroot configuration needs a compiler capable of building 32 bits binaries."
		echo "If you're running a Debian/Ubuntu distribution, install the gcc-multilib package."
		echo "For other distributions, refer to their documentation."
		exit 1
	fi
fi

# Check that the Perl installation is complete enough for Buildroot.
required_perl_modules="Data::Dumper" # Needed to build host-autoconf
required_perl_modules="$required_perl_modules ExtUtils::MakeMaker" # Used by host-libxml-parser-perl
required_perl_modules="$required_perl_modules Thread::Queue" # Used by host-automake

if grep -q ^BR2_PACKAGE_MPV=y $BR2_CONFIG ; then
    required_perl_modules="$required_perl_modules Math::BigInt"
    required_perl_modules="$required_perl_modules Math::BigRat"
fi

# This variable will keep the modules that are missing in your system.
missing_perl_modules=""

for pm in $required_perl_modules ; do
	if ! perl  -e "require $pm" > /dev/null 2>&1 ; then
		missing_perl_modules="$missing_perl_modules $pm"
	fi
done

if [ -n "$missing_perl_modules" ] ; then
	echo "Your Perl installation is not complete enough; at least the following"
	echo "modules are missing:"
	echo
	for pm in $missing_perl_modules ; do
		printf "\t $pm\n"
	done
	echo
	exit 1
fi