xref: /haiku/configure (revision 503ef6d4ddd62e1f608b5f3d0e62dd0a2c2a4426)
152a38012Sejakowatz#!/bin/sh
252a38012Sejakowatz#
3338b8dc3SIngo Weinhold# configure [ <options> ]
4614026d7Sshatty
5022fa244SIngo Weinhold# usage
6022fa244SIngo Weinhold#
7022fa244SIngo Weinhold# Prints usage.
8022fa244SIngo Weinhold#
9022fa244SIngo Weinholdusage()
10022fa244SIngo Weinhold{
11022fa244SIngo Weinhold	cat << EOF
12022fa244SIngo Weinhold
13022fa244SIngo WeinholdUsage: $0 <options>
14022fa244SIngo Weinholdoptions:
15825700d3SAugustin Cavalier  --help                      Prints out this help.
16825700d3SAugustin Cavalier  --update                    Re-runs last configure invocation [must be given
17825700d3SAugustin Cavalier                              as first option!]
18e173a1ecSIngo Weinhold  --bootstrap <haikuporter> <HaikuPorts cross repo> <HaikuPorts repo>
19e173a1ecSIngo Weinhold                              Prepare for a bootstrap build. No pre-built
20e173a1ecSIngo Weinhold                              packages will be used, instead they will be built
21e173a1ecSIngo Weinhold                              from the sources (in several phases).
22e173a1ecSIngo Weinhold                              <haikuporter> is the path to the haikuporter tool
23e173a1ecSIngo Weinhold                              suitable for the host platform.
24e173a1ecSIngo Weinhold                              <HaikuPorts cross repo> is the path to a checked
25e173a1ecSIngo Weinhold                              out HaikuPorts cross-compilation repository.
26e173a1ecSIngo Weinhold                              <HaikuPorts repo> is the path to a checked out
27e173a1ecSIngo Weinhold                              HaikuPorts repository.
28c0e8cc1aSIngo Weinhold  --build-cross-tools <arch> [ <build tools dir> ]
29338b8dc3SIngo Weinhold                              Assume cross compilation. <build tools dir>
30338b8dc3SIngo Weinhold                              defines the location of the build tools sources.
31338b8dc3SIngo Weinhold                              They will be compiled and placed in the output
32a5b60fa8SOliver Tappe                              directory under "cross-tools". The HAIKU_* tools
33a5b60fa8SOliver Tappe                              variables will be set accordingly.
3420ab75e6SIngo Weinhold                              <arch> specifies the target architecture, either
351b38c341SAlexander von Gluck IV                              "x86_gcc2", "x86", "x86_64", "ppc", "m68k", "arm"
36c0e8cc1aSIngo Weinhold                              This option and --cross-tools-prefix can be
37c0e8cc1aSIngo Weinhold                              specified multiple times. The first cross tools
38c0e8cc1aSIngo Weinhold                              specify the primary tools, the subsequent ones the
39c0e8cc1aSIngo Weinhold                              secondary tools (for "hybrid" images).
40c0e8cc1aSIngo Weinhold                              For the first --build-cross-tools the
41c0e8cc1aSIngo Weinhold                              <build tools dir> argument must be specified and
42c0e8cc1aSIngo Weinhold                              for the subsequent ones it must be omitted.
43eccc7665SIngo Weinhold  --cross-tools-prefix <prefix>
44eccc7665SIngo Weinhold                              Assume cross compilation. <prefix> should be a
45eccc7665SIngo Weinhold                              path to the directory where the cross
46eccc7665SIngo Weinhold                              compilation tools are located, plus the platform
470da9c208SIngo Weinhold                              prefix, e.g. "/path/to/tools/i586-pc-haiku-".
48eccc7665SIngo Weinhold                              This overrides the HAIKU_* tool variables.
49a66c32ddSIngo Weinhold  --distro-compatibility <level>
50a66c32ddSIngo Weinhold                              The distribution's level of compatibility with
51a66c32ddSIngo Weinhold                              the official Haiku distribution. The generated
52a66c32ddSIngo Weinhold                              files will contain the respective trademarks
53a66c32ddSIngo Weinhold                              accordingly.
54a66c32ddSIngo Weinhold                              official -- the official Haiku distribution.
55a66c32ddSIngo Weinhold                              compatible -- a Haiku Compatible (tm) distro.
56a66c32ddSIngo Weinhold                              default -- any other distro (default value).
572ebcd86dSIngo Weinhold  --host-only                 Configure for building tools for the build host
582ebcd86dSIngo Weinhold                              only. Haiku cannot be built when configured like
592ebcd86dSIngo Weinhold                              this.
6067838392SAxel Dörfler  --include-patented-code     Enable code that is known to implemented patented
6167838392SAxel Dörfler                              ideas and techniques. If this option is not
6267838392SAxel Dörfler                              specified, the resulting distribution may still
6367838392SAxel Dörfler                              implement patented ideas and techniques. This
64825700d3SAugustin Cavalier                              option only enables code that is currently known
6567838392SAxel Dörfler                              to be problematic.
6676fa0be3SIngo Weinhold  --include-sources           Includes the source code of projects that require
6776fa0be3SIngo Weinhold                              either an offer of source code or a copy of the
6876fa0be3SIngo Weinhold                              patched sources. This is preferable when
6976fa0be3SIngo Weinhold                              distributing on physical mediums.
701974210fSFrançois Revol  --include-3rdparty          Include 3rdparty/ in the build system.
714880ae01SJessica Hamilton  -j<n>                       Only relevant for --build-cross-tools. Is passed
724880ae01SJessica Hamilton                              on to the make building the build tools.
73aa2e5ecaSOliver Tappe  --no-downloads              Do not download anything. Useful when trying to
74aa2e5ecaSOliver Tappe                              bootstrap and build Haiku from source only.
757c4641d0SOliver Tappe  --target=TARGET             Select build target platform.
767c4641d0SOliver Tappe                              [default=${TARGET_PLATFORM}]
77deb1a319SAlexander von Gluck IV                              valid targets=r5,bone,dano,haiku
78483b28e4SIngo Weinhold  --target-arch <arch>        Haiku only: Specify the target architecture to
79483b28e4SIngo Weinhold                              build for. Must be one of the architectures of the
80483b28e4SIngo Weinhold                              host system. The installed build tools for that
81483b28e4SIngo Weinhold                              architecture will be used.
82483b28e4SIngo Weinhold                              This option can be specified multiple times. The
83483b28e4SIngo Weinhold                              first occurrence specifies the primary
84483b28e4SIngo Weinhold                              architecture of the Haiku to build, subsequent
85483b28e4SIngo Weinhold                              ones the secondary architectures.
86d73993ffSAugustin Cavalier  --use-clang <arch>          Build with host Clang instead of GCC cross
87d73993ffSAugustin Cavalier                              compiler, targeting <arch>
88eccc7665SIngo Weinhold  --use-gcc-pipe              Build with GCC option -pipe. Speeds up the build
895a34a443SFrançois Revol                              process, but uses more memory.
90ed38d2efSJerome Duval  --use-gcc-graphite          Build with GCC Graphite engine for loop
91a5c952dbSAugustin Cavalier                              optimizations. (Only for GCC 4+.)
920385b065SIngo Weinhold  --use-32bit                 Use -m32 flag on 64bit host gcc compiler.
93fc2c93fbSAugustin Cavalier  --no-full-xattr             Do not use Linux/*BSD/Darwin's native extended file
94fc2c93fbSAugustin Cavalier                              attributes as Haiku attributes. If they are still
95fc2c93fbSAugustin Cavalier                              available, they will be used to store hashes for
96fc2c93fbSAugustin Cavalier                              the attribute emulation layer.
97fc2c93fbSAugustin Cavalier  --no-xattr                  Do not use Linux/*BSD/Darwin's native extended file
98fc2c93fbSAugustin Cavalier                              attributes for Haiku extended attributes at all,
99fc2c93fbSAugustin Cavalier                              even if they are available.
1004da6cf84SFrançois Revol  --with-gdb <gdb sources dir>
1014da6cf84SFrançois Revol                              specify the path to a GDB source dir, to build
1024da6cf84SFrançois Revol                              GDB for each arch we build the cross-tools for.
103338b8dc3SIngo Weinhold
104338b8dc3SIngo Weinholdenvironment variables:
10563701e7dSOliver Tappe  CC                          The host compiler. Defaults to "gcc".
10665706842SAugustin Cavalier  HAIKU_AR_<arch>             The static library archiver for <arch>.
107c0e8cc1aSIngo Weinhold                              Defaults to "ar".
10865706842SAugustin Cavalier  HAIKU_CC_<arch>             The compiler for <arch>. Defaults to "gcc".
10965706842SAugustin Cavalier  HAIKU_LD_<arch>             The <arch> linker. Defaults to "ld".
11065706842SAugustin Cavalier  HAIKU_OBJCOPY_<arch>        The <arch> objcopy to be used. Defaults to
111c0e8cc1aSIngo Weinhold                              "objcopy".
11265706842SAugustin Cavalier  HAIKU_RANLIB_<arch>         The static library indexer for <arch>. Defaults
113c0e8cc1aSIngo Weinhold                              to "ranlib".
11465706842SAugustin Cavalier  HAIKU_STRIP_<arch>          The <arch> strip command. Defaults to "strip".
115a04a520bSJonathan Schleifer  HAIKU_NASM                  The nasm assembler (x86 and x86_64 only).
116c0e8cc1aSIngo Weinhold  HAIKU_CPPFLAGS_<arch>       The preprocessor flags for target architecture
117c0e8cc1aSIngo Weinhold                              <arch>. Defaults to "".
118c0e8cc1aSIngo Weinhold  HAIKU_CCFLAGS_<arch>        The C flags for target architecture <arch>.
119c0e8cc1aSIngo Weinhold                              Defaults to "".
120c0e8cc1aSIngo Weinhold  HAIKU_CXXFLAGS_<arch>       The C++ flags for target architecture <arch>.
121c0e8cc1aSIngo Weinhold                              Defaults to "".
122c0e8cc1aSIngo Weinhold  HAIKU_LDFLAGS_<arch>        The linker flags for target architecture <arch>.
123c0e8cc1aSIngo Weinhold                              Defaults to "".
124c0e8cc1aSIngo Weinhold  HAIKU_ARFLAGS_<arch>        The flags passed to HAIKU_AR for target
125c0e8cc1aSIngo Weinhold                              architecture <arch> for archiving. Defaults to
126c0e8cc1aSIngo Weinhold                              "cru".
127c0e8cc1aSIngo Weinhold  HAIKU_UNARFLAGS_<arch>      The flags passed to HAIKU_AR for target
128c0e8cc1aSIngo Weinhold                              architecture <arch> for unarchiving. Defaults to
129c0e8cc1aSIngo Weinhold                              "x".
13064f6da31SIngo Weinhold
131c0e8cc1aSIngo WeinholdNon-default output directories:
13264f6da31SIngo Weinhold  By default all objects, build configuration, and other related files are
13364f6da31SIngo Weinhold  stored in /path/to/haiku_source/generated.  To store objects in a non-default
13464f6da31SIngo Weinhold  location, run "../../relative/path/to/haiku_source/configure <options>" from
13564f6da31SIngo Weinhold  within your non-default location.  "jam [ options ] targets" can then be run
13664f6da31SIngo Weinhold  directly inside your non-default location.  Another option is to invoke "jam
13764f6da31SIngo Weinhold  [ options ] targets" from within haiku_source.  This can be accomplished by
13864f6da31SIngo Weinhold  either "export HAIKU_OUTPUT_DIR=your non-default location" before invoking
13964f6da31SIngo Weinhold  jam or by creating a symlink of haiku_source/generated pointing to your
14064f6da31SIngo Weinhold  non-default location and running jam.
14164f6da31SIngo Weinhold
14264f6da31SIngo Weinhold
143022fa244SIngo WeinholdEOF
144022fa244SIngo Weinhold}
145022fa244SIngo Weinhold
146022fa244SIngo Weinhold# assertparam
147022fa244SIngo Weinhold#
148022fa244SIngo Weinhold# Checks whether at least one parameter is left.
149022fa244SIngo Weinhold#
150022fa244SIngo Weinholdassertparam()
151022fa244SIngo Weinhold{
15220ab75e6SIngo Weinhold	if [ $2 -lt 2 ]; then
153022fa244SIngo Weinhold		echo $0: \`$1\': Parameter expected.
154022fa244SIngo Weinhold		exit 1
155022fa244SIngo Weinhold	fi
156022fa244SIngo Weinhold}
157022fa244SIngo Weinhold
15820ab75e6SIngo Weinhold# assertparams
15920ab75e6SIngo Weinhold#
16020ab75e6SIngo Weinhold# Checks whether at least a certain number of parameters is left.
16120ab75e6SIngo Weinhold#
16220ab75e6SIngo Weinholdassertparams()
16320ab75e6SIngo Weinhold{
16420ab75e6SIngo Weinhold	if [ $3 -le $2 ]; then
16520ab75e6SIngo Weinhold		echo $0: \`$1\': Not enough parameters.
16620ab75e6SIngo Weinhold		exit 1
16720ab75e6SIngo Weinhold	fi
16820ab75e6SIngo Weinhold}
16920ab75e6SIngo Weinhold
170e173a1ecSIngo Weinhold# absolute_path
171e173a1ecSIngo Weinhold#
172e173a1ecSIngo Weinhold# returns the absolute path of a given path.
173e173a1ecSIngo Weinhold#
174e173a1ecSIngo Weinholdabsolute_path()
175e173a1ecSIngo Weinhold{
1766a4f3954SFrançois Revol	if [ "x$1" != "x${1#/}" ]; then
177e173a1ecSIngo Weinhold		echo "$1"
178e173a1ecSIngo Weinhold	else
179e173a1ecSIngo Weinhold		echo "`pwd`/$1"
180e173a1ecSIngo Weinhold	fi
181e173a1ecSIngo Weinhold}
182e173a1ecSIngo Weinhold
18339d444a3SArvind S Raj# check_dir_exists
18439d444a3SArvind S Raj#
18539d444a3SArvind S Raj# check if a directory exists or not
18639d444a3SArvind S Raj#
18739d444a3SArvind S Rajcheck_dir_exists()
18839d444a3SArvind S Raj{
18939d444a3SArvind S Raj	if [ -d "$1" ]; then
19039d444a3SArvind S Raj		return 0
19139d444a3SArvind S Raj	else
19239d444a3SArvind S Raj		return 1
19339d444a3SArvind S Raj	fi
19439d444a3SArvind S Raj}
19539d444a3SArvind S Raj
196502882dbSJessica Hamilton# check_file_exists
197502882dbSJessica Hamilton#
198502882dbSJessica Hamilton# check if a file exists or not
199502882dbSJessica Hamilton#
200502882dbSJessica Hamiltoncheck_file_exists()
201502882dbSJessica Hamilton{
202502882dbSJessica Hamilton	if [ -f "$1" ]; then
203502882dbSJessica Hamilton		return 0
204502882dbSJessica Hamilton	else
205502882dbSJessica Hamilton		return 1
206502882dbSJessica Hamilton	fi
207502882dbSJessica Hamilton}
208502882dbSJessica Hamilton
2099a001156SOliver Tappe# real_path
2109a001156SOliver Tappe#
2119a001156SOliver Tappe# returns the realpath of a symbolic link.
2129a001156SOliver Tappe#
2139a001156SOliver Tappereal_path()
2149a001156SOliver Tappe{
2159a001156SOliver Tappe	perl -MCwd=realpath -e'print realpath($ARGV[0]), "\n"' "$1"
2169a001156SOliver Tappe}
2179a001156SOliver Tappe
21809c5682dSIngo Weinhold# standard_gcc_settings
21909c5682dSIngo Weinhold#
22009c5682dSIngo Weinhold# Sets the variables for a GCC platform.
22109c5682dSIngo Weinhold#
22209c5682dSIngo Weinholdstandard_gcc_settings()
22309c5682dSIngo Weinhold{
22465706842SAugustin Cavalier	local gcc="$1"
225c0e8cc1aSIngo Weinhold
226138f5fb4SIngo Weinhold	if which greadlink > /dev/null 2>&1; then
227b29b48b1SMatt Madia		readlink="greadlink -e"
228138f5fb4SIngo Weinhold	elif which realpath > /dev/null 2>&1; then
229b29b48b1SMatt Madia		readlink=realpath
2309a001156SOliver Tappe	elif readlink -e / > /dev/null 2>&1; then
231b29b48b1SMatt Madia		readlink="readlink -e"
2329a001156SOliver Tappe	else
2339a001156SOliver Tappe		readlink=real_path
234b4b6d83cSMatt Madia	fi
235138f5fb4SIngo Weinhold
23609c5682dSIngo Weinhold	# PLATFORM_LINKLIBS
237c0e8cc1aSIngo Weinhold	local gcclib=`$gcc -print-libgcc-file-name`
238c0e8cc1aSIngo Weinhold	local gccdir=`dirname ${gcclib}`
2395b0f7b1bSOliver Tappe
240c0e8cc1aSIngo Weinhold	local gccRawVersion=`$gcc -dumpversion`
241c0e8cc1aSIngo Weinhold	local gccMachine=`$gcc -dumpmachine`
242338b8dc3SIngo Weinhold
243fc8967f1SIngo Weinhold	# determine architecture from machine triple
244c0e8cc1aSIngo Weinhold	case $gccMachine in
245c0e8cc1aSIngo Weinhold		arm-*)		targetCpu=arm;;
246c0e8cc1aSIngo Weinhold		i?86-*)		targetCpu=x86;;
247c0e8cc1aSIngo Weinhold		m68k-*)		targetCpu=m68k;;
248c0e8cc1aSIngo Weinhold		powerpc-*)	targetCpu=ppc;;
249c0e8cc1aSIngo Weinhold		x86_64-*)	targetCpu=x86_64;;
250fc8967f1SIngo Weinhold		*)
251c0e8cc1aSIngo Weinhold			echo "Unsupported gcc target machine: $gccMachine" >&2
252fc8967f1SIngo Weinhold			exit 1
253fc8967f1SIngo Weinhold			;;
254fc8967f1SIngo Weinhold	esac
255fc8967f1SIngo Weinhold
256c0e8cc1aSIngo Weinhold	local targetArch=$targetCpu
257fc8967f1SIngo Weinhold
258c0e8cc1aSIngo Weinhold	case $gccRawVersion in
2596cc8eecfSOliver Tappe		2.9*)
2605b0f7b1bSOliver Tappe			# check for correct (most up-to-date) legacy compiler and complain
2615b0f7b1bSOliver Tappe			# if an older one is installed
262c0e8cc1aSIngo Weinhold			if [ $gccRawVersion != $haikuRequiredLegacyGCCVersion ]; then
2635b0f7b1bSOliver Tappe				echo "GCC version $haikuRequiredLegacyGCCVersion is required!";
2645b0f7b1bSOliver Tappe				echo "Please download it from www.haiku-os.org...";
2655b0f7b1bSOliver Tappe				exit 1;
2665b0f7b1bSOliver Tappe			fi
267aaeadfcbSAlex Smith
268c0e8cc1aSIngo Weinhold			targetArch=x86_gcc2
2695b0f7b1bSOliver Tappe			;;
2708b5934c9SIngo Weinhold	esac
27165ad1ba3SAlex Smith
272c0e8cc1aSIngo Weinhold	local bootLibgcc
273c0e8cc1aSIngo Weinhold	local bootLibSupCxx
27466a7f29fSJérôme Duval	local bootCxxHeaders
275c0e8cc1aSIngo Weinhold	case $gccMachine in
2764591ebc9SAlex Smith		x86_64-*)
27766a7f29fSJérôme Duval			# Boot loader is 32-bit, need the 32-bit libs and c++ config
27811ae3c5fSOliver Tappe			bootLibgcc=`$gcc -m32 -print-file-name=libgcc.a`
279c0e8cc1aSIngo Weinhold			bootLibSupCxx=`$gcc -m32 -print-file-name=libsupc++.a`
28066a7f29fSJérôme Duval
28166a7f29fSJérôme Duval			local headersBase=$gccdir/../../../..
28266a7f29fSJérôme Duval			local headers=$headersBase/$gccMachine/include/c++/$gccRawVersion
28366a7f29fSJérôme Duval			if [ ! -d $headers ]; then
28466a7f29fSJérôme Duval				headers=$headersBase/include/c++/$gccRawVersion
28566a7f29fSJérôme Duval			fi
28666a7f29fSJérôme Duval			bootCxxHeaders="$headers/$gccMachine/32"
2874591ebc9SAlex Smith			;;
288338b8dc3SIngo Weinhold	esac
289c0e8cc1aSIngo Weinhold
290c0e8cc1aSIngo Weinhold	# determine whether graphite loop optimization should/can be used
291c0e8cc1aSIngo Weinhold	local useGraphite=`get_variable HAIKU_USE_GCC_GRAPHITE_$targetCpu`
292c0e8cc1aSIngo Weinhold	if [ -z "$useGraphite" ]; then
293c0e8cc1aSIngo Weinhold		useGraphite=$useGccGraphiteDefault
294c0e8cc1aSIngo Weinhold	fi
295c0e8cc1aSIngo Weinhold
296c0e8cc1aSIngo Weinhold	if [ "$useGraphite" != 0 ]; then
297c0e8cc1aSIngo Weinhold		UNUSED=`echo "int main() {}" | $gcc -xc -c -floop-block - 2>&1`
298c0e8cc1aSIngo Weinhold		if [ $? != 0 ]; then
299c0e8cc1aSIngo Weinhold			echo "GCC Graphite loop optimizations cannot be used on $targetArch"
300c0e8cc1aSIngo Weinhold			useGraphite=0
301c0e8cc1aSIngo Weinhold		fi
302c0e8cc1aSIngo Weinhold	fi
303c0e8cc1aSIngo Weinhold
304c0e8cc1aSIngo Weinhold	set_variable HAIKU_CPU_$targetArch $targetCpu
305c0e8cc1aSIngo Weinhold
306c0e8cc1aSIngo Weinhold	get_build_tool_path CC_$targetArch "$gcc"
307a7bddff1SJonathan Schleifer	set_variable HAIKU_CC_IS_CLANG_$targetArch $useClang
308c0e8cc1aSIngo Weinhold	set_variable HAIKU_GCC_RAW_VERSION_$targetArch $gccRawVersion
309c0e8cc1aSIngo Weinhold	set_variable HAIKU_GCC_MACHINE_$targetArch $gccMachine
310c0e8cc1aSIngo Weinhold	set_variable HAIKU_GCC_LIB_DIR_$targetArch $gccdir
31166a7f29fSJérôme Duval	set_variable HAIKU_BOOT_CXX_HEADERS_DIR_$targetArch "$bootCxxHeaders"
31211ae3c5fSOliver Tappe	set_variable HAIKU_BOOT_LIBSUPCXX_$targetArch "$bootLibSupCxx"
31311ae3c5fSOliver Tappe	set_variable HAIKU_BOOT_LIBGCC_$targetArch $bootLibgcc
314c0e8cc1aSIngo Weinhold	set_variable HAIKU_USE_GCC_GRAPHITE_$targetArch $useGraphite
315c0e8cc1aSIngo Weinhold
316c0e8cc1aSIngo Weinhold	standard_gcc_settings_targetArch=$targetArch
317c0e8cc1aSIngo Weinhold}
318c0e8cc1aSIngo Weinhold
319c0e8cc1aSIngo Weinhold# set_variable
320c0e8cc1aSIngo Weinhold#
321c0e8cc1aSIngo Weinhold# Set the value of a variable.
322c0e8cc1aSIngo Weinhold#
323c0e8cc1aSIngo Weinholdset_variable()
324c0e8cc1aSIngo Weinhold{
325c0e8cc1aSIngo Weinhold	eval "$1=\"$2\""
326c0e8cc1aSIngo Weinhold}
327c0e8cc1aSIngo Weinhold
328c0e8cc1aSIngo Weinhold# get_variable
329c0e8cc1aSIngo Weinhold#
330c0e8cc1aSIngo Weinhold# Echo the value of a variable.
331c0e8cc1aSIngo Weinhold#
332c0e8cc1aSIngo Weinholdget_variable()
333c0e8cc1aSIngo Weinhold{
334c0e8cc1aSIngo Weinhold	eval "echo \${$1}"
33509c5682dSIngo Weinhold}
33609c5682dSIngo Weinhold
337338b8dc3SIngo Weinhold# set_default_value
338338b8dc3SIngo Weinhold#
339338b8dc3SIngo Weinhold# Set the value for a variable, if no value is set yet.
340338b8dc3SIngo Weinhold#
341338b8dc3SIngo Weinholdset_default_value()
342338b8dc3SIngo Weinhold{
3430838a930SJérôme Duval	eval "$1=\${$1-$2}"
344338b8dc3SIngo Weinhold}
345338b8dc3SIngo Weinhold
346338b8dc3SIngo Weinhold# get_build_tool_path
347338b8dc3SIngo Weinhold#
348338b8dc3SIngo Weinhold# Gets a usable absolute path of a build tool.
349338b8dc3SIngo Weinhold#
350338b8dc3SIngo Weinholdget_build_tool_path()
351338b8dc3SIngo Weinhold{
352338b8dc3SIngo Weinhold	local var="HAIKU_$1"
35365706842SAugustin Cavalier	local varval="`get_variable $var`"
35465706842SAugustin Cavalier	local cmd="$2"
355d73993ffSAugustin Cavalier
356e042a53bSAugustin Cavalier	if [ ! -z "$varval" ]; then
357d73993ffSAugustin Cavalier		# this variable is already set (probably by user) so grab its contents
358e042a53bSAugustin Cavalier		cmd=$varval
359d73993ffSAugustin Cavalier	fi
360d73993ffSAugustin Cavalier
361d73993ffSAugustin Cavalier	local path=${cmd%% *}
362338b8dc3SIngo Weinhold
363338b8dc3SIngo Weinhold	if [ -f "$path" ]; then
36465706842SAugustin Cavalier		# get absolute path from relative path
365a559f87aSFrançois Revol		local oldPwd="`pwd`"
366a559f87aSFrançois Revol		cd "`dirname "$path"`"
367a559f87aSFrançois Revol		path="`pwd`/`basename "$path"`"
368338b8dc3SIngo Weinhold		cd $oldPwd
369338b8dc3SIngo Weinhold	else
3707fe2e06cSMatt Madia		which "$path" > /dev/null 2>&1 || {
371d73993ffSAugustin Cavalier			echo "Build tool \"$path\" not found (maybe specify it in $var?)" >&2
372338b8dc3SIngo Weinhold			exit 1
373338b8dc3SIngo Weinhold		}
374338b8dc3SIngo Weinhold	fi
375338b8dc3SIngo Weinhold
37665706842SAugustin Cavalier	if test "${cmd#* }" != "$cmd"; then
37765706842SAugustin Cavalier		# $cmd contains arguments, so preserve them (and only them)
37865706842SAugustin Cavalier		cmd=${cmd#* }
37965706842SAugustin Cavalier	else
38065706842SAugustin Cavalier		# $cmd does not contain arguments, so unset it
38165706842SAugustin Cavalier		cmd=
38265706842SAugustin Cavalier	fi
38365706842SAugustin Cavalier	eval "$var=\"$path $cmd\""
384338b8dc3SIngo Weinhold}
385338b8dc3SIngo Weinhold
386a5c952dbSAugustin Cavalier# check_native_xattrs
387a5c952dbSAugustin Cavalier#
388a5c952dbSAugustin Cavalier# Checks the host platform's support for extended attributes.
389a5c952dbSAugustin Cavalier# 0: no support, 1: only enough for xattr-ref, 2: full support
390a5c952dbSAugustin Cavalier#
391a5c952dbSAugustin Cavaliercheck_native_xattrs()
392a5c952dbSAugustin Cavalier{
393a5c952dbSAugustin Cavalier	local xattr_set=
394a5c952dbSAugustin Cavalier	local xattr_set_args=
395a5c952dbSAugustin Cavalier	local xattr_get=
396a5c952dbSAugustin Cavalier	local xattr_get_args=
397a5c952dbSAugustin Cavalier	case $HOST_PLATFORM in
398*503ef6d4SAugustin Cavalier		haiku_host)
399*503ef6d4SAugustin Cavalier			xattr_set="addattr"; xattr_set_args="\$NAME \"\$VALUE\""
400*503ef6d4SAugustin Cavalier			xattr_get="catattr"; xattr_get_args="\$NAME"
401*503ef6d4SAugustin Cavalier			;;
402a5c952dbSAugustin Cavalier		darwin)
403a5c952dbSAugustin Cavalier			xattr_set="xattr"; xattr_set_args="-w \$NAME \"\$VALUE\""
404a5c952dbSAugustin Cavalier			xattr_get="xattr"; xattr_get_args="-p \$NAME"
405a5c952dbSAugustin Cavalier			;;
406a5c952dbSAugustin Cavalier		freebsd)
407a5c952dbSAugustin Cavalier			xattr_set="setextattr"; xattr_set_args="user \$NAME \"\$VALUE\""
408a5c952dbSAugustin Cavalier			xattr_get="getextattr"; xattr_get_args="user \$NAME"
409a5c952dbSAugustin Cavalier			;;
410a5c952dbSAugustin Cavalier		linux)
411a5c952dbSAugustin Cavalier			xattr_set="setfattr"; xattr_set_args="-n user.\$NAME -v \"\$VALUE\""
412a5c952dbSAugustin Cavalier			xattr_get="getfattr"; xattr_get_args="-n user.\$NAME"
413a5c952dbSAugustin Cavalier			;;
414a5c952dbSAugustin Cavalier		*)
415a5c952dbSAugustin Cavalier			return 0
416a5c952dbSAugustin Cavalier			;;
417a5c952dbSAugustin Cavalier	esac
418a5c952dbSAugustin Cavalier	if ! type $xattr_set >/dev/null 2>&1; then
419a5c952dbSAugustin Cavalier		echo "$0: could not find $xattr_set, assuming host has no extended attributes"
420a5c952dbSAugustin Cavalier		return 0
421a5c952dbSAugustin Cavalier	elif ! type $xattr_get >/dev/null 2>&1; then
422a5c952dbSAugustin Cavalier		echo "$0: could not find $xattr_get, assuming host has no extended attributes"
423a5c952dbSAugustin Cavalier		return 0
424a5c952dbSAugustin Cavalier	fi
425a5c952dbSAugustin Cavalier
426a5c952dbSAugustin Cavalier	echo "xattr test file" >"$outputDir/xattrtest"
427a5c952dbSAugustin Cavalier	local i=0
428a5c952dbSAugustin Cavalier	# on round 0, we test if we can set 3 attrs of 1K each (enough for xattr-ref)
429a5c952dbSAugustin Cavalier	# on round 1, we test if we can set 3 attrs of 45K each (enough for full xattr)
430a5c952dbSAugustin Cavalier	while [ $i -lt 2 ]; do
431a5c952dbSAugustin Cavalier		local j=0
432a5c952dbSAugustin Cavalier		while [ $j -lt 3 ]; do
433a5c952dbSAugustin Cavalier			NAME=attr$j
434a5c952dbSAugustin Cavalier			VALUE=`printf '%*s' $((1024 + $i * 45056)) "" | tr ' ' x`
435a5c952dbSAugustin Cavalier			if [ `echo -n $VALUE | wc -c` -lt $((1024 + $i * 45056)) ]; then
436a5c952dbSAugustin Cavalier				echo "$0: warning: could not generate test data for extended attributes"
437a5c952dbSAugustin Cavalier				rm "$outputDir/xattrtest"
438a5c952dbSAugustin Cavalier				return $i
439a5c952dbSAugustin Cavalier			elif ! $xattr_set `eval echo \"$xattr_set_args\"` \
440a5c952dbSAugustin Cavalier					"$outputDir/xattrtest" >/dev/null 2>&1 ; then
441a5c952dbSAugustin Cavalier				rm "$outputDir/xattrtest"
442a5c952dbSAugustin Cavalier				return $i
443a5c952dbSAugustin Cavalier			fi
444a5c952dbSAugustin Cavalier			j=$((j+1))
445a5c952dbSAugustin Cavalier		done
446a5c952dbSAugustin Cavalier		i=$((i+1))
447a5c952dbSAugustin Cavalier	done
448a5c952dbSAugustin Cavalier	rm "$outputDir/xattrtest"
449a5c952dbSAugustin Cavalier	return 2
450a5c952dbSAugustin Cavalier}
451a5c952dbSAugustin Cavalier
452483b28e4SIngo Weinholdis_in_list()
453483b28e4SIngo Weinhold{
454483b28e4SIngo Weinhold	local element
455483b28e4SIngo Weinhold	for element in $2; do
456483b28e4SIngo Weinhold		if [ "$1" = "$element" ]; then
457483b28e4SIngo Weinhold			return 0
458483b28e4SIngo Weinhold		fi
459483b28e4SIngo Weinhold	done
460483b28e4SIngo Weinhold	return 1
461483b28e4SIngo Weinhold}
462483b28e4SIngo Weinhold
4637f9beaf1SOliver Tappe# check for --help or -h and show usage immediately
4647f9beaf1SOliver Tappeif [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
4658b420c2fSOliver Tappe	usage; exit 0;
4668b420c2fSOliver Tappefi
4678b420c2fSOliver Tappe
468c6c03d56SAugustin Cavalier# ensure umask is not too restrictive
469c6c03d56SAugustin Cavalierif [ $(umask) -gt 22 ]; then
470c6c03d56SAugustin Cavalier	echo "Your umask is too restrictive (should be: <= 0022; is actually:" $(umask)")"
471c6c03d56SAugustin Cavalier	exit 1
472c6c03d56SAugustin Cavalierfi
4738b420c2fSOliver Tappe
474338b8dc3SIngo Weinhold# get cwd and the source directory
475338b8dc3SIngo WeinholdcurrentDir=`pwd`
4766e7c6fe5SIngo Weinholdcd `dirname "$0"`
477338b8dc3SIngo WeinholdsourceDir=`pwd`
4786e7c6fe5SIngo Weinholdcd "$currentDir"
479338b8dc3SIngo Weinhold
48055d267a4SFrançois Revol# backup the passed arguments
48155d267a4SFrançois RevolconfigureArgs="$@"
482825700d3SAugustin CavalierconfigurePath=$0
483825700d3SAugustin Cavalier
484825700d3SAugustin Cavalier# backup relevant environs
485825700d3SAugustin CavalierconfigureEnvirons=
486825700d3SAugustin Cavalierfor var in `env`; do
487825700d3SAugustin Cavalier	case "$var" in
488825700d3SAugustin Cavalier		CC\=*|HAIKU*\=*)
489825700d3SAugustin Cavalier			configureEnvirons="$configureEnvirons $var"
490825700d3SAugustin Cavalier			;;
491825700d3SAugustin Cavalier	esac
492825700d3SAugustin Cavalierdone
49355d267a4SFrançois Revol
4947c4641d0SOliver Tappe# internal default parameter values
495022fa244SIngo Weinhold#
49652a38012Sejakowatzplatform=`uname`
4975abd9a46SIngo WeinholdplatformMachine=`uname  -m`
498c0e8cc1aSIngo WeinholdtargetArchs=
499338b8dc3SIngo WeinholdbuildCrossTools=
50029ef597dSIngo WeinholdbuildCrossToolsScript="$sourceDir/build/scripts/build_cross_tools"
50160d8d8fcSIngo WeinholdbuildCrossToolsJobs=
502c2b76f7fSJonathan SchleiferuseClang=0
503c0e8cc1aSIngo WeinholduseGccGraphiteDefault=0
504c0e8cc1aSIngo WeinholdunknownArchIndex=1
505483b28e4SIngo WeinholdhaikuTargetArchs=
5064da6cf84SFrançois RevolgdbSources=
5077c4641d0SOliver Tappe
50863701e7dSOliver Tappeif [ -z "$CC" ]; then
50963701e7dSOliver Tappe	CC=gcc
51063701e7dSOliver Tappefi
51163701e7dSOliver Tappe
5127c4641d0SOliver Tappe# exported (BuildSetup) default parameter values
5137c4641d0SOliver Tappe#
51463701e7dSOliver TappeHOST_GCC_RAW_VERSION=`$CC -dumpversion`
51563701e7dSOliver TappeHOST_GCC_MACHINE=`$CC -dumpmachine`
5167c4641d0SOliver TappeHAIKU_INCLUDE_PATENTED_CODE=0
51776fa0be3SIngo WeinholdHAIKU_INCLUDE_SOURCES=0
5187c4641d0SOliver TappeHAIKU_INCLUDE_3RDPARTY=0
5197c4641d0SOliver TappeHAIKU_DISTRO_COMPATIBILITY=default
5207c4641d0SOliver TappeTARGET_PLATFORM=haiku
5217c4641d0SOliver TappeHAIKU_USE_GCC_PIPE=0
5227986925fSIngo WeinholdHAIKU_HOST_USE_32BIT=0
523fc2c93fbSAugustin CavalierHAIKU_HOST_USE_XATTR=
524fc2c93fbSAugustin CavalierHAIKU_HOST_USE_XATTR_REF=
5252ebcd86dSIngo WeinholdHAIKU_HOST_BUILD_ONLY=0
526f04f7042SNiels Sascha ReedijkHOST_EXTENDED_REGEX_SED="sed -r"
52763701e7dSOliver TappeHOST_GCC_LD=`$CC -print-prog-name=ld`
52863701e7dSOliver TappeHOST_GCC_OBJCOPY=`$CC -print-prog-name=objcopy`
5292a5d0aafSIngo WeinholdHOST_SHA256=
530e173a1ecSIngo WeinholdHOST_HAIKU_PORTER=
531e173a1ecSIngo WeinholdHAIKU_PORTS=
532e173a1ecSIngo WeinholdHAIKU_PORTS_CROSS=
533c9dd05ffSJonathan SchleiferHAIKU_IS_BOOTSTRAP=0
534e70c4c64SPulkoMandyHAIKU_BOOT_BOARD=
535aa2e5ecaSOliver TappeHAIKU_NO_DOWNLOADS=0
5362a5d0aafSIngo Weinhold
537c0e8cc1aSIngo WeinholdHAIKU_PACKAGING_ARCHS=
538c0e8cc1aSIngo Weinhold
539a04a520bSJonathan Schleiferset_default_value HAIKU_NASM		nasm
540c0e8cc1aSIngo Weinhold
5413942ca0dSIngo Weinholdif sha256sum < /dev/null > /dev/null 2>&1; then
5422a5d0aafSIngo Weinhold	HOST_SHA256=sha256sum
5433942ca0dSIngo Weinholdelif sha256 < /dev/null > /dev/null 2>&1; then
5442a5d0aafSIngo Weinhold	HOST_SHA256="sha256 -q"
545b5a871b1SNiels Sascha Reedijkelif shasum < /dev/null > /dev/null 2>&1; then
546b5a871b1SNiels Sascha Reedijk	HOST_SHA256="shasum -a 256"
5472a5d0aafSIngo Weinholdelse
5482a5d0aafSIngo Weinhold	echo "Error: Neither sha256sum nor sha256 seem to be available!" >&2
5492a5d0aafSIngo Weinhold	exit 1
5502a5d0aafSIngo Weinholdfi
551338b8dc3SIngo Weinhold
55284edb1a1SAxel DörflerhaikuRequiredLegacyGCCVersion="2.95.3-haiku-2017_07_20"
553a559f87aSFrançois Revolexport haikuRequiredLegacyGCCVersion
554af4bf973SOliver Tappe	# version of legacy gcc required to build haiku
555483b28e4SIngo WeinholdsupportedTargetArchs="
556483b28e4SIngo Weinhold	arm
557483b28e4SIngo Weinhold	m68k
558483b28e4SIngo Weinhold	ppc
559483b28e4SIngo Weinhold	x86
560483b28e4SIngo Weinhold	x86_64
561483b28e4SIngo Weinhold	x86_gcc2
562483b28e4SIngo Weinhold	"
563af4bf973SOliver Tappe
5647c4641d0SOliver Tappe# determine output directory
5657c4641d0SOliver Tappeif [ "$currentDir" = "$sourceDir" ]; then
5667c4641d0SOliver Tappe	outputDir=$currentDir/generated
5677c4641d0SOliver Tappeelse
5687c4641d0SOliver Tappe	outputDir=$currentDir
5697c4641d0SOliver Tappefi
5707c4641d0SOliver TappebuildOutputDir="$outputDir/build"
5717c4641d0SOliver TappeHAIKU_BUILD_ATTRIBUTES_DIR="$outputDir/attributes"
5727c4641d0SOliver TappebuildConfigFile="$buildOutputDir/BuildConfig"
5737c4641d0SOliver Tappe
5747c4641d0SOliver Tappe# check for update request
5757c4641d0SOliver Tappeif [ "$1" = "--update" ]; then
5767c4641d0SOliver Tappe	if ! [ -e "$buildConfigFile" ]; then
5777c4641d0SOliver Tappe		echo $0 --update: \'$buildConfigFile\' not found - updating not possible.
5787c4641d0SOliver Tappe		exit 1
5797c4641d0SOliver Tappe	fi
580825700d3SAugustin Cavalier	# get last configure invocation and flags from BuildConfig and call ourselves with it
581825700d3SAugustin Cavalier	lastPwd=`grep "#d " "$buildConfigFile" | cut -c 4-`
582825700d3SAugustin Cavalier	lastConfig=`grep "#c " "$buildConfigFile" | cut -c 4-`
583825700d3SAugustin Cavalier	lastEnv=`grep "#e " "$buildConfigFile" | cut -c 4-`
584825700d3SAugustin Cavalier	lastArgs=`grep "#a " "$buildConfigFile" | cut -c 4-`
585825700d3SAugustin Cavalier	if [ -z "$lastConfig" ]; then
586825700d3SAugustin Cavalier		echo "$0 --update: The previous configure invocation was not properly" \
587825700d3SAugustin Cavalier			"encoded into '$buildConfigFile' - updating not possible."
5887c4641d0SOliver Tappe		exit 1
5897c4641d0SOliver Tappe	fi
590825700d3SAugustin Cavalier	cd $lastPwd
591fc2c93fbSAugustin Cavalier	if [ -n "$lastEnv" ]; then
592825700d3SAugustin Cavalier		export $lastEnv
593fc2c93fbSAugustin Cavalier	fi
594825700d3SAugustin Cavalier	$lastConfig $lastArgs
595825700d3SAugustin Cavalier	exit $?
5967c4641d0SOliver Tappefi
5977c4641d0SOliver Tappe
598022fa244SIngo Weinhold# parse parameters
599022fa244SIngo Weinhold#
60020ab75e6SIngo Weinholdwhile [ $# -gt 0 ] ; do
601022fa244SIngo Weinhold	case "$1" in
602e173a1ecSIngo Weinhold		--bootstrap)
603e173a1ecSIngo Weinhold			assertparams "$1" 3 $#
604e173a1ecSIngo Weinhold			HOST_HAIKU_PORTER="`absolute_path $2`"
605e173a1ecSIngo Weinhold			HAIKU_PORTS_CROSS="`absolute_path $3`"
606e173a1ecSIngo Weinhold			HAIKU_PORTS="`absolute_path $4`"
607c9dd05ffSJonathan Schleifer			HAIKU_IS_BOOTSTRAP=1
608c9dd05ffSJonathan Schleifer			HAIKU_NO_DOWNLOADS=1
609502882dbSJessica Hamilton			check_file_exists "$HOST_HAIKU_PORTER" || (
610502882dbSJessica Hamilton				echo "Invalid path to haikuporter: $HOST_HAIKU_PORTER" >&2
61139d444a3SArvind S Raj				exit 1
61239d444a3SArvind S Raj			)
61339d444a3SArvind S Raj			check_dir_exists "$HAIKU_PORTS" || (
61439d444a3SArvind S Raj				echo "Non-existent directory $HAIKU_PORTS" >&2
61539d444a3SArvind S Raj				exit 1
61639d444a3SArvind S Raj			)
61739d444a3SArvind S Raj			check_dir_exists "$HAIKU_PORTS_CROSS" || (
61839d444a3SArvind S Raj				echo "Non-existent directory $HAIKU_PORTS_CROSS" >&2
61939d444a3SArvind S Raj				exit 1
62039d444a3SArvind S Raj			)
621e173a1ecSIngo Weinhold			shift 4
622e173a1ecSIngo Weinhold			;;
623c0e8cc1aSIngo Weinhold		--build-cross-tools)
624c0e8cc1aSIngo Weinhold			if [ -z "$buildCrossTools" ]; then
6259b0dd528SIngo Weinhold				assertparams "$1" 2 $#
626c0e8cc1aSIngo Weinhold				targetArch=$2
6279b0dd528SIngo Weinhold				buildCrossTools=$3
6289b0dd528SIngo Weinhold				shift 3
629c0e8cc1aSIngo Weinhold			else
630c0e8cc1aSIngo Weinhold				assertparam "$1" $#
631c0e8cc1aSIngo Weinhold				targetArch=$2
632c0e8cc1aSIngo Weinhold				shift 2
633c0e8cc1aSIngo Weinhold			fi
634c0e8cc1aSIngo Weinhold			case "$targetArch" in
635c0e8cc1aSIngo Weinhold				x86_gcc2)	targetMachine=i586-pc-haiku;;
636c0e8cc1aSIngo Weinhold				x86)		targetMachine=i586-pc-haiku;;
637c0e8cc1aSIngo Weinhold				x86_64)		targetMachine=x86_64-unknown-haiku;;
638c0e8cc1aSIngo Weinhold				ppc)		targetMachine=powerpc-apple-haiku;;
639c0e8cc1aSIngo Weinhold				m68k)		targetMachine=m68k-unknown-haiku;;
640c0e8cc1aSIngo Weinhold				arm)		targetMachine=arm-unknown-haiku;;
641c0e8cc1aSIngo Weinhold				*)
642c0e8cc1aSIngo Weinhold					echo "Unsupported target architecture: $2" >&2
643c0e8cc1aSIngo Weinhold					exit 1
644c0e8cc1aSIngo Weinhold					;;
645c0e8cc1aSIngo Weinhold			esac
646c0e8cc1aSIngo Weinhold			set_variable buildCrossToolsMachine_$targetArch $targetMachine
647c0e8cc1aSIngo Weinhold			targetArchs="$targetArchs $targetArch"
648c0e8cc1aSIngo Weinhold			HAIKU_PACKAGING_ARCHS=
6499b0dd528SIngo Weinhold			;;
6509b0dd528SIngo Weinhold		--cross-tools-prefix)
6519b0dd528SIngo Weinhold			assertparam "$1" $#
652c0e8cc1aSIngo Weinhold			targetArch=unknown${unknownArchIndex}
653c0e8cc1aSIngo Weinhold			set_variable crossToolsPrefix_$targetArch "$2"
654c0e8cc1aSIngo Weinhold			targetArchs="$targetArchs $targetArch"
655c0e8cc1aSIngo Weinhold			HAIKU_PACKAGING_ARCHS=
656d68208faSMatt Madia			unknownArchIndex=$(($unknownArchIndex + 1))
6579b0dd528SIngo Weinhold			shift 2
6589b0dd528SIngo Weinhold			;;
659a66c32ddSIngo Weinhold		--distro-compatibility)
6609b0dd528SIngo Weinhold			assertparam "$1" $#
6617c4641d0SOliver Tappe			HAIKU_DISTRO_COMPATIBILITY=$2
6627c4641d0SOliver Tappe			case "$HAIKU_DISTRO_COMPATIBILITY" in
663a66c32ddSIngo Weinhold				official)	;;
664a66c32ddSIngo Weinhold				compatible)	;;
665a66c32ddSIngo Weinhold				default)	;;
666a66c32ddSIngo Weinhold				*)			echo "Invalid distro compatibility" \
6677c4641d0SOliver Tappe								"level: $HAIKU_DISTRO_COMPATIBILITY"
668a66c32ddSIngo Weinhold							exit 1;;
669a66c32ddSIngo Weinhold			esac
6709b0dd528SIngo Weinhold			shift 2
6719b0dd528SIngo Weinhold			;;
6722ebcd86dSIngo Weinhold		--host-only)	HAIKU_HOST_BUILD_ONLY=1; shift 1;;
6737c4641d0SOliver Tappe		--include-patented-code)	HAIKU_INCLUDE_PATENTED_CODE=1; shift 1;;
67476fa0be3SIngo Weinhold		--include-sources)	HAIKU_INCLUDE_SOURCES=1; shift 1;;
6757c4641d0SOliver Tappe		--include-3rdparty)	HAIKU_INCLUDE_3RDPARTY=1; shift 1;;
67660d8d8fcSIngo Weinhold        -j*)				buildCrossToolsJobs="$1"; shift 1;;
677aa2e5ecaSOliver Tappe		--no-downloads)	HAIKU_NO_DOWNLOADS=1; shift 1;;
6787c4641d0SOliver Tappe		--target=*)     TARGET_PLATFORM=`echo $1 | cut -d'=' -f2-`; shift 1;;
679483b28e4SIngo Weinhold		--target-arch)
680483b28e4SIngo Weinhold			assertparam "$1" $#
681483b28e4SIngo Weinhold			targetArch=$2
682483b28e4SIngo Weinhold			shift 2
683483b28e4SIngo Weinhold			if [ ! "$platform" = Haiku ]; then
684483b28e4SIngo Weinhold				echo "--target-arch can only be specified on Haiku." >&2
685483b28e4SIngo Weinhold				exit 1
686483b28e4SIngo Weinhold			fi
687483b28e4SIngo Weinhold			is_in_list "$targetArch" "$supportedTargetArchs" || (
688483b28e4SIngo Weinhold				echo "Unsupported target architecture: \"$targetArch\"" >&2
689483b28e4SIngo Weinhold				exit 1
690483b28e4SIngo Weinhold			)
691483b28e4SIngo Weinhold			haikuTargetArchs="$haikuTargetArchs $targetArch"
692483b28e4SIngo Weinhold			;;
693d73993ffSAugustin Cavalier		--use-clang)
694d73993ffSAugustin Cavalier			assertparam "$1" $#
695d73993ffSAugustin Cavalier			targetArch=$2
696d73993ffSAugustin Cavalier			useClang=1
697d73993ffSAugustin Cavalier			case "$targetArch" in
698d73993ffSAugustin Cavalier				x86)		targetMachine=i586-pc-haiku;;
699d73993ffSAugustin Cavalier				x86_64)		targetMachine=x86_64-unknown-haiku;;
700d73993ffSAugustin Cavalier				*)
701d73993ffSAugustin Cavalier					echo "Unsupported target architecture: $2" >&2
702d73993ffSAugustin Cavalier					exit 1
703d73993ffSAugustin Cavalier					;;
704d73993ffSAugustin Cavalier			esac
70565706842SAugustin Cavalier			get_build_tool_path clang clang
70636f28382SAugustin Cavalier			if [ -z `get_variable "crossToolsPrefix_$targetArch"` ] \
70736f28382SAugustin Cavalier					&& [ -z `get_variable buildCrossToolsMachine_$targetArch` ]; then
70865706842SAugustin Cavalier				set_variable crossToolsPrefix_$targetArch llvm-
70965706842SAugustin Cavalier			fi
71036f28382SAugustin Cavalier			if ! test "${targetArchs#*$targetArch}" != "$targetArchs"; then
71136f28382SAugustin Cavalier				# we have not already added this arch to targetArchs, so add it now
712d73993ffSAugustin Cavalier				targetArchs="$targetArchs $targetArch"
71336f28382SAugustin Cavalier			fi
714d73993ffSAugustin Cavalier			HAIKU_PACKAGING_ARCHS=
715d73993ffSAugustin Cavalier			shift 2
716d73993ffSAugustin Cavalier			;;
7177c4641d0SOliver Tappe		--use-gcc-pipe)	HAIKU_USE_GCC_PIPE=1; shift 1;;
718c0e8cc1aSIngo Weinhold		--use-gcc-graphite)	useGccGraphiteDefault=1; shift 1;;
7197986925fSIngo Weinhold		--use-32bit)	HAIKU_HOST_USE_32BIT=1; shift 1;;
720fc2c93fbSAugustin Cavalier		--no-full-xattr)HAIKU_HOST_USE_XATTR=0; shift 1;;
721fc2c93fbSAugustin Cavalier		--no-xattr)		HAIKU_HOST_USE_XATTR_REF=0; shift 1;;
7224da6cf84SFrançois Revol		--with-gdb)	gdbSources=$2; shift 2;;
723022fa244SIngo Weinhold		*)				echo Invalid argument: \`$1\'; exit 1;;
724022fa244SIngo Weinhold	esac
725022fa244SIngo Weinholddone
726022fa244SIngo Weinhold
7270df3cc9cSIngo Weinhold# detect the build platform
728338b8dc3SIngo Weinholdcase "${platform}" in
7297c4641d0SOliver Tappe	Darwin)	HOST_PLATFORM=darwin ;;
7307c4641d0SOliver Tappe	FreeBSD)	HOST_PLATFORM=freebsd
7317986925fSIngo Weinhold				if [ "$HAIKU_HOST_USE_32BIT" = 1 ] ; then
7325abd9a46SIngo Weinhold					echo Unsupported platform: FreeBSD ${platformMachine}
733308c212cSIngo Weinhold					exit 1
734308c212cSIngo Weinhold				fi	;;
7357c4641d0SOliver Tappe	Haiku)	HOST_PLATFORM=haiku_host ;;
7367c4641d0SOliver Tappe	Linux)	HOST_PLATFORM=linux ;;
7377c4641d0SOliver Tappe	OpenBSD) HOST_PLATFORM=openbsd ;;
7387c4641d0SOliver Tappe	SunOS)	HOST_PLATFORM=sunos ;;
7397c4641d0SOliver Tappe	CYGWIN_NT-*) HOST_PLATFORM=cygwin ;;
740338b8dc3SIngo Weinhold	*)		echo Unsupported platform: ${platform}
7414cbe4925SAxel Dörfler			exit 1 ;;
7424cbe4925SAxel Dörfleresac
74352a38012Sejakowatz
7440962132cSAlex Smith# check for case-sensitive filesystem
7450962132cSAlex Smithmkdir haikuCaseTest 2>/dev/null
7460962132cSAlex Smithmkdir haikucasetest 2>/dev/null
7470962132cSAlex SmithcaseInsensitive=$?
74897f5a0bdSAlex Smithrmdir haikuCaseTest haikucasetest 2>/dev/null
7490962132cSAlex Smithif [ $caseInsensitive != 0 ]; then
7503ecc5287SMichael Lotz	echo "You need a case-sensitive file-system to build Haiku."
7510962132cSAlex Smith	if [ $HOST_PLATFORM = "darwin" ]; then
7527a05e252SJohn Scipione		echo "You can create a case-sensitive disk image using Disk Utility."
7533ecc5287SMichael Lotz	fi
7540962132cSAlex Smith	exit 1
7553ecc5287SMichael Lotzfi
7563ecc5287SMichael Lotz
757a5c952dbSAugustin Cavalier# check xattr support
758*503ef6d4SAugustin Cavalierif [ -z $HAIKU_HOST_USE_XATTR_REF ]; then
759a5c952dbSAugustin Cavalier	check_native_xattrs
760a5c952dbSAugustin Cavalier	attrSupport=$?
761fc2c93fbSAugustin Cavalier	if [ $attrSupport = 2 ] && [ -z $HAIKU_HOST_USE_XATTR ]; then
762fc2c93fbSAugustin Cavalier		HAIKU_HOST_USE_XATTR=1
763a5c952dbSAugustin Cavalier	elif [ $attrSupport = 1 ]; then
764fc2c93fbSAugustin Cavalier		HAIKU_HOST_USE_XATTR_REF=1
765a5c952dbSAugustin Cavalier	fi
766a5c952dbSAugustin Cavalierfi
767fc2c93fbSAugustin Cavalierif [ -z $HAIKU_HOST_USE_XATTR ]; then HAIKU_HOST_USE_XATTR=0; fi
768fc2c93fbSAugustin Cavalierif [ -z $HAIKU_HOST_USE_XATTR_REF ]; then HAIKU_HOST_USE_XATTR_REF=0; fi
769a5c952dbSAugustin Cavalier
770f04f7042SNiels Sascha Reedijk# determine how to invoke sed with extended regexp support for non-GNU sed
771f04f7042SNiels Sascha Reedijkif [ $HOST_PLATFORM = "darwin" ]; then
772f04f7042SNiels Sascha Reedijk	HOST_EXTENDED_REGEX_SED="sed -E"
773f04f7042SNiels Sascha Reedijkfi
774f04f7042SNiels Sascha Reedijk
775cb721c59SFrançois Revol# check if nasm can actually output ELF files
776cb721c59SFrançois Revol# (the stock version in OSX can't)
777cb721c59SFrançois Revol# XXX: should probably only test for x86* arch
7783e6c09cdSAdrien Destuguesif [ "$("$HAIKU_NASM" -hf | grep -c elf'[36][24] ')" -ne "2" ]; then
779cb721c59SFrançois Revol	echo "$HAIKU_NASM cannot generate ELF files. Please install a working version."
780cb721c59SFrançois Revol	if [ $HOST_PLATFORM = "darwin" ]; then
781cb721c59SFrançois Revol		echo "You can install it from Mac Ports."
782cb721c59SFrançois Revol		echo "Mac Ports is available at: http://www.macports.org/"
783cb721c59SFrançois Revol	fi
784cb721c59SFrançois Revol	exit 1
785cb721c59SFrançois Revolfi
786cb721c59SFrançois Revol
787338b8dc3SIngo Weinhold# create output directory
7886e7c6fe5SIngo Weinholdmkdir -p "$buildOutputDir" || exit 1
789338b8dc3SIngo Weinhold
7902ebcd86dSIngo Weinholdif [ "$HAIKU_HOST_BUILD_ONLY" = 1 ]; then
7912ebcd86dSIngo Weinhold	invalidCommand=$sourceDir/build/scripts/host_build_only
7922ebcd86dSIngo Weinhold	HAIKU_AR=$invalidCommand
7932ebcd86dSIngo Weinhold	HAIKU_CC=$invalidCommand
7942ebcd86dSIngo Weinhold	HAIKU_LD=$invalidCommand
7952ebcd86dSIngo Weinhold	HAIKU_OBJCOPY=$invalidCommand
7962ebcd86dSIngo Weinhold	HAIKU_RANLIB=$invalidCommand
7972ebcd86dSIngo Weinhold	HAIKU_ELFEDIT=$invalidCommand
798d6f80927SJonathan Schleifer	HAIKU_NASM=$invalidCommand
7992ebcd86dSIngo Weinhold	HAIKU_STRIP=$invalidCommand
8002ebcd86dSIngo Weinholdelse
801c0e8cc1aSIngo Weinhold	if [ -n "$HAIKU_PACKAGING_ARCHS" ]; then
802c0e8cc1aSIngo Weinhold		targetArchs="$HAIKU_PACKAGING_ARCHS"
803c0e8cc1aSIngo Weinhold	fi
804c0e8cc1aSIngo Weinhold	HAIKU_PACKAGING_ARCHS=
805c0e8cc1aSIngo Weinhold
806483b28e4SIngo Weinhold	# On Haiku determine target architectures and tools automatically.
807c0e8cc1aSIngo Weinhold	if [ -z "$targetArchs" ]; then
808483b28e4SIngo Weinhold		if [ $HOST_PLATFORM != haiku_host ]; then
809483b28e4SIngo Weinhold			echo "Please specify the build tools to use or build (via" \
810eaef83a9SJeroen Oortwijn				"--cross-tools-prefix or --build-cross-tools) or specify a" \
811483b28e4SIngo Weinhold				"host-only build (--host-only)." >&2
8127f9beaf1SOliver Tappe			echo "For more info, invoke $0 --help"
813483b28e4SIngo Weinhold			exit 1
814483b28e4SIngo Weinhold		fi
815483b28e4SIngo Weinhold
816483b28e4SIngo Weinhold		# determine primary architecture
817dda53eaeSIngo Weinhold		targetArch=`package list -i /system/packages/haiku-*.hpkg \
818483b28e4SIngo Weinhold			| sed '/^\s*architecture:/!d; s,^\s*architecture:\s*,,'`
819483b28e4SIngo Weinhold		is_in_list "$targetArch" "$supportedTargetArchs" || (
820483b28e4SIngo Weinhold			echo "Unsupported target architecture: \"$targetArch\"" >&2
821483b28e4SIngo Weinhold			exit 1
822483b28e4SIngo Weinhold		)
823c0e8cc1aSIngo Weinhold		targetArchs=$targetArch
824483b28e4SIngo Weinhold
825c0e8cc1aSIngo Weinhold		set_default_value HAIKU_AR_$targetArch			ar
826c0e8cc1aSIngo Weinhold		set_default_value HAIKU_CC_$targetArch			gcc
827c0e8cc1aSIngo Weinhold		set_default_value HAIKU_LD_$targetArch			ld
828c0e8cc1aSIngo Weinhold		set_default_value HAIKU_OBJCOPY_$targetArch		objcopy
829c0e8cc1aSIngo Weinhold		set_default_value HAIKU_RANLIB_$targetArch		ranlib
830c0e8cc1aSIngo Weinhold		set_default_value HAIKU_ELFEDIT_$targetArch		elfedit
831c0e8cc1aSIngo Weinhold		set_default_value HAIKU_STRIP_$targetArch		strip
832483b28e4SIngo Weinhold
833483b28e4SIngo Weinhold		# determine secondary architectures
834483b28e4SIngo Weinhold		for targetArch in $supportedTargetArchs; do
83580262a91SMatt Madia			if [ -e /system/packages/haiku_$targetArch-*.hpkg ]; then
836483b28e4SIngo Weinhold				targetArchs="$targetArchs $targetArch"
837483b28e4SIngo Weinhold				set_default_value HAIKU_AR_$targetArch		ar-$targetArch
838483b28e4SIngo Weinhold				set_default_value HAIKU_CC_$targetArch		gcc-$targetArch
839483b28e4SIngo Weinhold				set_default_value HAIKU_LD_$targetArch		ld-$targetArch
840483b28e4SIngo Weinhold				set_default_value HAIKU_OBJCOPY_$targetArch	objcopy-$targetArch
841483b28e4SIngo Weinhold				set_default_value HAIKU_RANLIB_$targetArch	ranlib-$targetArch
842483b28e4SIngo Weinhold				set_default_value HAIKU_ELFEDIT_$targetArch	elfedit-$targetArch
843483b28e4SIngo Weinhold				set_default_value HAIKU_STRIP_$targetArch	strip-$targetArch
844483b28e4SIngo Weinhold			fi
845483b28e4SIngo Weinhold		done
846483b28e4SIngo Weinhold
847483b28e4SIngo Weinhold		# The target architectures might have been specified explicitly.
848483b28e4SIngo Weinhold		if [ -n "$haikuTargetArchs" ]; then
849483b28e4SIngo Weinhold			for targetArch in $haikuTargetArchs; do
850483b28e4SIngo Weinhold				is_in_list "$targetArch" "$targetArchs" || (
851483b28e4SIngo Weinhold					echo "Unsupported target architecture: \"$targetArch\"." \
852483b28e4SIngo Weinhold						"Only native architectures of the host platform can" \
853483b28e4SIngo Weinhold						"be specified." >&2
854483b28e4SIngo Weinhold					exit 1
855483b28e4SIngo Weinhold				)
856483b28e4SIngo Weinhold			done
857483b28e4SIngo Weinhold			targetArchs="$haikuTargetArchs"
858483b28e4SIngo Weinhold		fi
859c0e8cc1aSIngo Weinhold	fi
860c0e8cc1aSIngo Weinhold
86168ccc989SIngo Weinhold	isPrimaryArch=1
862c0e8cc1aSIngo Weinhold	for targetArch in $targetArchs; do
863c0e8cc1aSIngo Weinhold		# Note: targetArch is "unknown<n>" at this point, if a cross-tools
864c0e8cc1aSIngo Weinhold		# prefix was specified. The standard_gcc_settings call below will get
865c0e8cc1aSIngo Weinhold		# the actual architecture.
866c0e8cc1aSIngo Weinhold
867c0e8cc1aSIngo Weinhold		crossToolsPrefix=`get_variable crossToolsPrefix_$targetArch`
868c0e8cc1aSIngo Weinhold
869338b8dc3SIngo Weinhold		# build cross tools from sources
870c0e8cc1aSIngo Weinhold		if [ -n "$buildCrossTools" -a -z "$crossToolsPrefix" ]; then
871c0e8cc1aSIngo Weinhold			crossToolsDir="$outputDir/cross-tools-$targetArch"
872c0e8cc1aSIngo Weinhold			targetMachine=`get_variable buildCrossToolsMachine_$targetArch`
873c0e8cc1aSIngo Weinhold			script="$buildCrossToolsScript"
8748304ec7cSIngo Weinhold			scriptArgs=
875c0e8cc1aSIngo Weinhold			if [ $targetArch != x86_gcc2 ]; then
8768304ec7cSIngo Weinhold				script="${script}_gcc4"
8778304ec7cSIngo Weinhold				scriptArgs="$targetMachine"
8781e93288eSJérôme Duval				set_default_value HAIKU_USE_GCC_GRAPHITE_$targetArch	\
8791e93288eSJérôme Duval					$useGccGraphiteDefault
880c0e8cc1aSIngo Weinhold			fi
88168ccc989SIngo Weinhold			secondaryArch=
88268ccc989SIngo Weinhold			if [ -z "$isPrimaryArch" ]; then
88368ccc989SIngo Weinhold				secondaryArch=$targetArch
88468ccc989SIngo Weinhold			fi
88586de8c37SIngo Weinhold
88686de8c37SIngo Weinhold			case $HOST_PLATFORM in
88786de8c37SIngo Weinhold				freebsd|openbsd)	MAKE=gmake;;
88886de8c37SIngo Weinhold				*)					MAKE=make;;
88986de8c37SIngo Weinhold			esac
89086de8c37SIngo Weinhold
891825700d3SAugustin Cavalier			if [ ! -d "$crossToolsDir" ]; then
89286de8c37SIngo Weinhold				MAKE=$MAKE \
89368ccc989SIngo Weinhold				SECONDARY_ARCH=$secondaryArch \
894c0e8cc1aSIngo Weinhold				HAIKU_USE_GCC_GRAPHITE=`get_variable \
895c0e8cc1aSIngo Weinhold					HAIKU_USE_GCC_GRAPHITE_$targetArch` \
896b3ece905SJérôme Duval				HAIKU_USE_GCC_PIPE=$HAIKU_USE_GCC_PIPE \
8974da6cf84SFrançois Revol				HAIKU_USE_GDB="$gdbSources" \
8988304ec7cSIngo Weinhold				"$script" $scriptArgs "$sourceDir" "$buildCrossTools" \
8998304ec7cSIngo Weinhold					"$crossToolsDir" $buildCrossToolsJobs || exit 1
900825700d3SAugustin Cavalier			else
901825700d3SAugustin Cavalier				echo "$targetArch crosstools already exist in $crossToolsDir; skipping build"
902825700d3SAugustin Cavalier			fi
903c0e8cc1aSIngo Weinhold			crossToolsPrefix="$crossToolsDir/bin/${targetMachine}-"
904338b8dc3SIngo Weinhold		fi
905338b8dc3SIngo Weinhold
906c0e8cc1aSIngo Weinhold		# prepare gcc settings and get the actual target architecture
907a7bddff1SJonathan Schleifer		if [ $useClang = 1 ]; then
90865706842SAugustin Cavalier			gcc="$HAIKU_clang -target ${targetMachine} -no-integrated-as"
9091f6fe055SAugustin Cavalier
9101f6fe055SAugustin Cavalier			# Clang's compiler intrinsics are not compatible with GCC's or even
9111f6fe055SAugustin Cavalier			# across versions of Clang, so we must collect them for use in the build.
9121f6fe055SAugustin Cavalier			mkdir -p "$outputDir/clang_headers" || exit 1
9131f6fe055SAugustin Cavalier			clangHeadersDir=`$gcc -print-resource-dir`/include/
9141f6fe055SAugustin Cavalier			cp $clangHeadersDir/*intrin* $clangHeadersDir/mm3* "$outputDir/clang_headers" || exit 1
915d73993ffSAugustin Cavalier		elif [ -z "${crossToolsPrefix}" ]; then
916d73993ffSAugustin Cavalier			gcc=`get_variable HAIKU_CC_$targetArch`
917a7bddff1SJonathan Schleifer		else
918c0e8cc1aSIngo Weinhold			gcc="${crossToolsPrefix}gcc"
919a7bddff1SJonathan Schleifer		fi
920c0e8cc1aSIngo Weinhold		standard_gcc_settings "$gcc"
921c0e8cc1aSIngo Weinhold		targetArch=$standard_gcc_settings_targetArch
922338b8dc3SIngo Weinhold
923c0e8cc1aSIngo Weinhold		# set default values for flags
924c0e8cc1aSIngo Weinhold		set_default_value HAIKU_CPPFLAGS_$targetArch	""
925c0e8cc1aSIngo Weinhold		set_default_value HAIKU_CCFLAGS_$targetArch		""
926c0e8cc1aSIngo Weinhold		set_default_value HAIKU_CXXFLAGS_$targetArch	""
927c0e8cc1aSIngo Weinhold		set_default_value HAIKU_LDFLAGS_$targetArch		""
928c0e8cc1aSIngo Weinhold		set_default_value HAIKU_ARFLAGS_$targetArch		cru
929c0e8cc1aSIngo Weinhold		set_default_value HAIKU_UNARFLAGS_$targetArch	x
930338b8dc3SIngo Weinhold
931c0e8cc1aSIngo Weinhold		# Override the cross tools variables, if the tools were built or a
932c0e8cc1aSIngo Weinhold		# prefix was specified.
933b7777272SAlex Smith		if [ -n "$crossToolsPrefix" ]; then
934c0e8cc1aSIngo Weinhold			get_build_tool_path AR_$targetArch ${crossToolsPrefix}ar
935c0e8cc1aSIngo Weinhold			get_build_tool_path LD_$targetArch ${crossToolsPrefix}ld
936c0e8cc1aSIngo Weinhold			get_build_tool_path OBJCOPY_$targetArch ${crossToolsPrefix}objcopy
937c0e8cc1aSIngo Weinhold			get_build_tool_path RANLIB_$targetArch ${crossToolsPrefix}ranlib
938c0e8cc1aSIngo Weinhold			get_build_tool_path STRIP_$targetArch ${crossToolsPrefix}strip
939c0e8cc1aSIngo Weinhold
940c0e8cc1aSIngo Weinhold			case `get_variable HAIKU_GCC_RAW_VERSION_$targetArch` in
941133e4131SJérôme Duval				4.*|5.*|6.*|7.*|8.*)
942c0e8cc1aSIngo Weinhold					get_build_tool_path ELFEDIT_$targetArch \
943c0e8cc1aSIngo Weinhold						${crossToolsPrefix}elfedit
944bd16f0ddSAlex Smith				;;
945bd16f0ddSAlex Smith			esac
94652a38012Sejakowatz		fi
94752a38012Sejakowatz
948ef57df3dSIngo Weinhold		# check whether the Haiku compiler really targets Haiku
949c0e8cc1aSIngo Weinhold		targetMachine=`get_variable HAIKU_GCC_MACHINE_$targetArch`
950c0e8cc1aSIngo Weinhold		case "$targetMachine" in
951eedc3d0bSIngo Weinhold			*-*-haiku)	;;
952c0e8cc1aSIngo Weinhold			*)
953c0e8cc1aSIngo Weinhold				echo The compiler specified as Haiku target compiler is not a \
954c0e8cc1aSIngo Weinhold				valid Haiku cross-compiler. Please see ReadMe.cross-compile. >&2
955eedc3d0bSIngo Weinhold				echo compiler: $HAIKU_CC
956c0e8cc1aSIngo Weinhold				echo compiler is configured for target: $targetMachine
957eedc3d0bSIngo Weinhold				exit 1 ;;
958eedc3d0bSIngo Weinhold		esac
959c0e8cc1aSIngo Weinhold
960c0e8cc1aSIngo Weinhold		HAIKU_PACKAGING_ARCHS="$HAIKU_PACKAGING_ARCHS $targetArch"
96168ccc989SIngo Weinhold		isPrimaryArch=
962c0e8cc1aSIngo Weinhold	done
9632ebcd86dSIngo Weinholdfi
964eedc3d0bSIngo Weinhold
96552a38012Sejakowatz# Generate BuildConfig
9667c4641d0SOliver Tappecat << EOF > "$buildConfigFile"
967825700d3SAugustin Cavalier# -- WARNING --
968825700d3SAugustin Cavalier# This file was AUTOMATICALLY GENERATED by configure, and will be completely
969825700d3SAugustin Cavalier# overwritten the next time configure is run.
970825700d3SAugustin Cavalier#
971825700d3SAugustin Cavalier#d ${currentDir}
972825700d3SAugustin Cavalier#c ${configurePath}
973825700d3SAugustin Cavalier#e ${configureEnvirons}
974825700d3SAugustin Cavalier#a ${configureArgs}
97552a38012Sejakowatz
9767c4641d0SOliver TappeTARGET_PLATFORM 			?= "${TARGET_PLATFORM}" ;
9777c4641d0SOliver TappeHOST_PLATFORM				?= "${HOST_PLATFORM}" ;
978338b8dc3SIngo Weinhold
9797c4641d0SOliver TappeHAIKU_INCLUDE_PATENTED_CODE			?= "${HAIKU_INCLUDE_PATENTED_CODE}" ;
98076fa0be3SIngo WeinholdHAIKU_INCLUDE_SOURCES				?= "${HAIKU_INCLUDE_SOURCES}" ;
9817c4641d0SOliver TappeHAIKU_INCLUDE_3RDPARTY				?= "${HAIKU_INCLUDE_3RDPARTY}" ;
9827c4641d0SOliver TappeHAIKU_DISTRO_COMPATIBILITY			?= "${HAIKU_DISTRO_COMPATIBILITY}" ;
9837c4641d0SOliver TappeHAIKU_USE_GCC_PIPE					?= "${HAIKU_USE_GCC_PIPE}" ;
9847986925fSIngo WeinholdHAIKU_HOST_USE_32BIT				?= "${HAIKU_HOST_USE_32BIT}" ;
9857986925fSIngo WeinholdHAIKU_HOST_USE_XATTR				?= "${HAIKU_HOST_USE_XATTR}" ;
986bc96e8f3SIngo WeinholdHAIKU_HOST_USE_XATTR_REF			?= "${HAIKU_HOST_USE_XATTR_REF}" ;
9872ebcd86dSIngo WeinholdHAIKU_HOST_BUILD_ONLY				?= "${HAIKU_HOST_BUILD_ONLY}" ;
988eccc7665SIngo Weinhold
989c0e8cc1aSIngo WeinholdHAIKU_PACKAGING_ARCHS		?= ${HAIKU_PACKAGING_ARCHS} ;
99065ad1ba3SAlex Smith
991aa2e5ecaSOliver TappeHAIKU_NO_DOWNLOADS			?= "${HAIKU_NO_DOWNLOADS}" ;
992aa2e5ecaSOliver Tappe
9937c4641d0SOliver TappeHAIKU_BUILD_ATTRIBUTES_DIR	?= ${HAIKU_BUILD_ATTRIBUTES_DIR} ;
994338b8dc3SIngo Weinhold
995d6f80927SJonathan SchleiferHAIKU_NASM					?= ${HAIKU_NASM} ;
996e70c4c64SPulkoMandyHAIKU_BOOT_BOARD			?= ${HAIKU_BOOT_BOARD} ;
997338b8dc3SIngo Weinhold
998f04f7042SNiels Sascha ReedijkHOST_EXTENDED_REGEX_SED		?= ${HOST_EXTENDED_REGEX_SED} ;
9997c4641d0SOliver TappeHOST_GCC_RAW_VERSION		?= ${HOST_GCC_RAW_VERSION} ;
10007c4641d0SOliver TappeHOST_GCC_MACHINE			?= ${HOST_GCC_MACHINE} ;
10017c4641d0SOliver TappeHOST_LD						?= ${HOST_GCC_LD} ;
10027c4641d0SOliver TappeHOST_OBJCOPY				?= ${HOST_GCC_OBJCOPY} ;
10032a5d0aafSIngo WeinholdHOST_SHA256					?= ${HOST_SHA256} ;
10048b5934c9SIngo Weinhold
1005e173a1ecSIngo WeinholdHOST_HAIKU_PORTER			?= ${HOST_HAIKU_PORTER} ;
1006e173a1ecSIngo WeinholdHAIKU_PORTS					?= ${HAIKU_PORTS} ;
1007e173a1ecSIngo WeinholdHAIKU_PORTS_CROSS			?= ${HAIKU_PORTS_CROSS} ;
1008c9dd05ffSJonathan SchleiferHAIKU_IS_BOOTSTRAP			?= ${HAIKU_IS_BOOTSTRAP} ;
1009e173a1ecSIngo Weinhold
1010c4786ea6SlilloEOF
1011c4786ea6Slillo
1012c0e8cc1aSIngo Weinholdfor targetArch in $HAIKU_PACKAGING_ARCHS; do
1013c0e8cc1aSIngo Weinhold	variables="
1014c0e8cc1aSIngo Weinhold		HAIKU_GCC_RAW_VERSION		HAIKU_GCC_RAW_VERSION
1015c0e8cc1aSIngo Weinhold		HAIKU_GCC_MACHINE			HAIKU_GCC_MACHINE
1016c0e8cc1aSIngo Weinhold		HAIKU_GCC_LIB_DIR			HAIKU_GCC_LIB_DIR
1017c0e8cc1aSIngo Weinhold		HAIKU_CPU					HAIKU_CPU
1018c0e8cc1aSIngo Weinhold		HAIKU_BOOT_LIBGCC			HAIKU_BOOT_LIBGCC
1019c0e8cc1aSIngo Weinhold		HAIKU_BOOT_LIBSUPC++		HAIKU_BOOT_LIBSUPCXX
1020c0e8cc1aSIngo Weinhold		HAIKU_AR					HAIKU_AR
1021c0e8cc1aSIngo Weinhold		HAIKU_CC					HAIKU_CC
1022c2b76f7fSJonathan Schleifer		HAIKU_CC_IS_CLANG			HAIKU_CC_IS_CLANG
1023c0e8cc1aSIngo Weinhold		HAIKU_LD					HAIKU_LD
1024c0e8cc1aSIngo Weinhold		HAIKU_OBJCOPY				HAIKU_OBJCOPY
1025c0e8cc1aSIngo Weinhold		HAIKU_RANLIB				HAIKU_RANLIB
1026c0e8cc1aSIngo Weinhold		HAIKU_ELFEDIT				HAIKU_ELFEDIT
1027c0e8cc1aSIngo Weinhold		HAIKU_STRIP					HAIKU_STRIP
1028c0e8cc1aSIngo Weinhold		HAIKU_CPPFLAGS				HAIKU_CPPFLAGS
1029c0e8cc1aSIngo Weinhold		HAIKU_CCFLAGS				HAIKU_CCFLAGS
1030c0e8cc1aSIngo Weinhold		HAIKU_C++FLAGS				HAIKU_CXXFLAGS
1031c0e8cc1aSIngo Weinhold		HAIKU_LDFLAGS				HAIKU_LDFLAGS
1032c0e8cc1aSIngo Weinhold		HAIKU_ARFLAGS				HAIKU_ARFLAGS
1033c0e8cc1aSIngo Weinhold		HAIKU_UNARFLAGS				HAIKU_UNARFLAGS
1034c0e8cc1aSIngo Weinhold		HAIKU_USE_GCC_GRAPHITE		HAIKU_USE_GCC_GRAPHITE
1035c0e8cc1aSIngo Weinhold		"
1036c0e8cc1aSIngo Weinhold	set -- $variables
1037c0e8cc1aSIngo Weinhold	while [ $# -ge 2 ]; do
1038c0e8cc1aSIngo Weinhold		value=`get_variable ${2}_$targetArch`
1039c0e8cc1aSIngo Weinhold		echo "${1}_${targetArch} ?= $value ;" >> "$buildConfigFile"
1040c0e8cc1aSIngo Weinhold		shift 2
1041c0e8cc1aSIngo Weinhold	done
1042b1e5b60cSAxel Dörfler
1043c0e8cc1aSIngo Weinhold	# For variables that may have long values, distribute them over multiple
1044c0e8cc1aSIngo Weinhold	# lines so that jam doesn't hit the maximum line length.
1045c0e8cc1aSIngo Weinhold	variables="
104666a7f29fSJérôme Duval		HAIKU_BOOT_C++_HEADERS_DIR	HAIKU_BOOT_CXX_HEADERS_DIR
1047c0e8cc1aSIngo Weinhold		"
1048c0e8cc1aSIngo Weinhold	set -- $variables
1049c0e8cc1aSIngo Weinhold	while [ $# -ge 2 ]; do
1050c0e8cc1aSIngo Weinhold		echo "${1}_${targetArch} ?= " >> "$buildConfigFile"
1051c0e8cc1aSIngo Weinhold		get_variable ${2}_$targetArch | xargs -n 1 echo "   " \
1052c0e8cc1aSIngo Weinhold			>> "$buildConfigFile"
1053c0e8cc1aSIngo Weinhold		echo "    ;" >> "$buildConfigFile"
1054c0e8cc1aSIngo Weinhold		shift 2
1055c0e8cc1aSIngo Weinhold	done
1056c0e8cc1aSIngo Weinholddone
1057b1e5b60cSAxel Dörfler
1058b1e5b60cSAxel Dörfler
10599b0dd528SIngo Weinhold# Generate a boot strap Jamfile in the output directory.
1060338b8dc3SIngo Weinhold
1061338b8dc3SIngo Weinholdcat << EOF > $outputDir/Jamfile
1062338b8dc3SIngo Weinhold# automatically generated Jamfile
1063338b8dc3SIngo Weinhold
1064338b8dc3SIngo WeinholdHAIKU_TOP			= ${sourceDir} ;
1065338b8dc3SIngo WeinholdHAIKU_OUTPUT_DIR	= ${outputDir} ;
1066338b8dc3SIngo Weinhold
1067338b8dc3SIngo Weinholdinclude [ FDirName \$(HAIKU_TOP) Jamfile ] ;
1068338b8dc3SIngo Weinhold
1069338b8dc3SIngo WeinholdEOF
1070d73993ffSAugustin Cavalier
1071d73993ffSAugustin Cavalierecho "Configured successfully!"
1072