xref: /haiku/configure (revision 788e359072485f0439a9bed8278168aed8fe023b)
1#!/bin/sh
2#
3# configure [ <options> ]
4
5# set flag to exit script when exit command is executed
6set -e
7
8# usage
9#
10# Prints usage.
11#
12usage()
13{
14	cat << EOF
15
16Usage: $0 <options>
17options:
18  --bootstrap <haikuporter> <HaikuPorts cross repo> <HaikuPorts repo>
19                              Prepare for a bootstrap build. No pre-built
20                              packages will be used, instead they will be built
21                              from the sources (in several phases).
22                              <haikuporter> is the path to the haikuporter tool
23                              suitable for the host platform.
24                              <HaikuPorts cross repo> is the path to a checked
25                              out HaikuPorts cross-compilation repository.
26                              <HaikuPorts repo> is the path to a checked out
27                              HaikuPorts repository.
28  --build-cross-tools <arch> [ <build tools dir> ]
29                              Assume cross compilation. <build tools dir>
30                              defines the location of the build tools sources.
31                              They will be compiled and placed in the output
32                              directory under "cross-tools". The HAIKU_* tools
33                              variables will be set accordingly.
34                              <arch> specifies the target architecture, either
35                              "x86_gcc2", "x86", "x86_64", "ppc", "m68k", "arm"
36                              This option and --cross-tools-prefix can be
37                              specified multiple times. The first cross tools
38                              specify the primary tools, the subsequent ones the
39                              secondary tools (for "hybrid" images).
40                              For the first --build-cross-tools the
41                              <build tools dir> argument must be specified and
42                              for the subsequent ones it must be omitted.
43  --cross-tools-prefix <prefix>
44                              Assume cross compilation. <prefix> should be a
45                              path to the directory where the cross
46                              compilation tools are located, plus the platform
47                              prefix, e.g. "/path/to/tools/i586-pc-haiku-".
48                              This overrides the HAIKU_* tool variables.
49  --distro-compatibility <level>
50                              The distribution's level of compatibility with
51                              the official Haiku distribution. The generated
52                              files will contain the respective trademarks
53                              accordingly.
54                              official -- the official Haiku distribution.
55                              compatible -- a Haiku Compatible (tm) distro.
56                              default -- any other distro (default value).
57  --enable-multiuser          Enable experimental multiuser support.
58  --help                      Prints out this help.
59  --host-only                 Configure for building tools for the build host
60                              only. Haiku cannot be built when configured like
61                              this.
62  --include-gpl-addons        Include GPL licensed add-ons.
63  --include-patented-code     Enable code that is known to implemented patented
64                              ideas and techniques. If this option is not
65                              specified, the resulting distribution may still
66                              implement patented ideas and techniques. This
67                              option only disables code that is currently known
68                              to be problematic.
69  --include-sources           Includes the source code of projects that require
70                              either an offer of source code or a copy of the
71                              patched sources. This is preferable when
72                              distributing on physical mediums.
73  --include-3rdparty          Include 3rdparty/ in the build system.
74  -j<n>                       Only relevant for --build-cross-tools. Is passed
75                              on to the make building the build tools.
76  --no-downloads              Do not download anything. Useful when trying to
77                              bootstrap and build Haiku from source only.
78  --remote-user <username>    Use given username when logging into
79                              git.haiku-os.org (via ssh).
80  --target=TARGET             Select build target platform.
81                              [default=${TARGET_PLATFORM}]
82                              valid targets=r5,bone,dano,haiku
83  --target-arch <arch>        Haiku only: Specify the target architecture to
84                              build for. Must be one of the architectures of the
85                              host system. The installed build tools for that
86                              architecture will be used.
87                              This option can be specified multiple times. The
88                              first occurrence specifies the primary
89                              architecture of the Haiku to build, subsequent
90                              ones the secondary architectures.
91  --target-board <board>      ARM only: Specify the board to build for. Must be
92                              one of beagle,raspberry_pi,verdex.
93  --update                    re-runs last configure invocation [must be given
94                              as first option!]
95  --use-clang                 Build with host Clang instead of GCC cross
96                              compiler
97  --use-gcc-pipe              Build with GCC option -pipe. Speeds up the build
98                              process, but uses more memory.
99  --use-gcc-graphite          Build with GCC Graphite engine for loop
100                              optimizations. Only for gcc 4.
101  --use-32bit                 Use -m32 flag on 64bit host gcc compiler.
102  --use-xattr                 Use Linux xattr respectively *BSD extattr support
103                              for BeOS attribute emulation. Warning: Make sure
104                              your file system supports sufficient attribute
105                              sizes (4 KB per file for all attributes won't
106                              suffice).
107  --use-xattr-ref             Use the generic BeOS attribute emulation, but use
108                              Linux xattr respectively *BSD extattr support to
109                              make it more robust (i.e. attribute mix-ups become
110                              less likely).
111
112environment variables:
113  CC                          The host compiler. Defaults to "gcc".
114  HAIKU_AR_x86_gcc2           The static library archiver for x86_gcc2.
115                              Defaults to "ar".
116  HAIKU_CC_x86_gcc2           The x86_gcc2 compiler. Defaults to "gcc".
117  HAIKU_LD_x86_gcc2           The x86_gcc2 linker. Defaults to "ld".
118  HAIKU_OBJCOPY_x86_gcc2      The x86_gcc2 objcopy to be used. Defaults to
119                              "objcopy".
120  HAIKU_RANLIB_x86_gcc2       The static library indexer for x86_gcc2. Defaults
121                              to "ranlib".
122  HAIKU_STRIP_x86_gcc2        The x86_gcc2 strip command. Defaults to "strip".
123  HAIKU_NASM                  The nasm assembler (x86 and x86_64 only).
124  HAIKU_CPPFLAGS_<arch>       The preprocessor flags for target architecture
125                              <arch>. Defaults to "".
126  HAIKU_CCFLAGS_<arch>        The C flags for target architecture <arch>.
127                              Defaults to "".
128  HAIKU_CXXFLAGS_<arch>       The C++ flags for target architecture <arch>.
129                              Defaults to "".
130  HAIKU_LDFLAGS_<arch>        The linker flags for target architecture <arch>.
131                              Defaults to "".
132  HAIKU_ARFLAGS_<arch>        The flags passed to HAIKU_AR for target
133                              architecture <arch> for archiving. Defaults to
134                              "cru".
135  HAIKU_UNARFLAGS_<arch>      The flags passed to HAIKU_AR for target
136                              architecture <arch> for unarchiving. Defaults to
137                              "x".
138
139Non-default output directories:
140  By default all objects, build configuration, and other related files are
141  stored in /path/to/haiku_source/generated.  To store objects in a non-default
142  location, run "../../relative/path/to/haiku_source/configure <options>" from
143  within your non-default location.  "jam [ options ] targets" can then be run
144  directly inside your non-default location.  Another option is to invoke "jam
145  [ options ] targets" from within haiku_source.  This can be accomplished by
146  either "export HAIKU_OUTPUT_DIR=your non-default location" before invoking
147  jam or by creating a symlink of haiku_source/generated pointing to your
148  non-default location and running jam.
149
150
151EOF
152}
153
154# assertparam
155#
156# Checks whether at least one parameter is left.
157#
158assertparam()
159{
160	if [ $2 -lt 2 ]; then
161		echo $0: \`$1\': Parameter expected.
162		exit 1
163	fi
164}
165
166# assertparams
167#
168# Checks whether at least a certain number of parameters is left.
169#
170assertparams()
171{
172	if [ $3 -le $2 ]; then
173		echo $0: \`$1\': Not enough parameters.
174		exit 1
175	fi
176}
177
178# absolute_path
179#
180# returns the absolute path of a given path.
181#
182absolute_path()
183{
184	if [ "x$1" != "x${1#/}" ]; then
185		echo "$1"
186	else
187		echo "`pwd`/$1"
188	fi
189}
190
191# check_dir_exists
192#
193# check if a directory exists or not
194#
195check_dir_exists()
196{
197	if [ -d "$1" ]; then
198		return 0
199	else
200		return 1
201	fi
202}
203
204# check_file_exists
205#
206# check if a file exists or not
207#
208check_file_exists()
209{
210	if [ -f "$1" ]; then
211		return 0
212	else
213		return 1
214	fi
215}
216
217# real_path
218#
219# returns the realpath of a symbolic link.
220#
221real_path()
222{
223	perl -MCwd=realpath -e'print realpath($ARGV[0]), "\n"' "$1"
224}
225
226# standard_gcc_settings
227#
228# Sets the variables for a GCC platform.
229#
230standard_gcc_settings()
231{
232	local gcc=$1
233
234	if which greadlink > /dev/null 2>&1; then
235		readlink="greadlink -e"
236	elif which realpath > /dev/null 2>&1; then
237		readlink=realpath
238	elif readlink -e / > /dev/null 2>&1; then
239		readlink="readlink -e"
240	else
241		readlink=real_path
242	fi
243
244	# PLATFORM_LINKLIBS
245	local gcclib=`$gcc -print-libgcc-file-name`
246	local gccdir=`dirname ${gcclib}`
247
248	local gccRawVersion=`$gcc -dumpversion`
249	local gccMachine=`$gcc -dumpmachine`
250
251	# determine architecture from machine triple
252	case $gccMachine in
253		arm-*)		targetCpu=arm;;
254		i?86-*)		targetCpu=x86;;
255		m68k-*)		targetCpu=m68k;;
256		powerpc-*)	targetCpu=ppc;;
257		x86_64-*)	targetCpu=x86_64;;
258		*)
259			echo "Unsupported gcc target machine: $gccMachine" >&2
260			exit 1
261			;;
262	esac
263
264	local targetArch=$targetCpu
265
266	case $gccRawVersion in
267		2.9*)
268			# check for correct (most up-to-date) legacy compiler and complain
269			# if an older one is installed
270			if [ $gccRawVersion != $haikuRequiredLegacyGCCVersion ]; then
271				echo "GCC version $haikuRequiredLegacyGCCVersion is required!";
272				echo "Please download it from www.haiku-os.org...";
273				exit 1;
274			fi
275
276			targetArch=x86_gcc2
277			;;
278	esac
279
280	local bootLibgcc
281	local bootLibSupCxx
282	local bootCxxHeaders
283	case $gccMachine in
284		x86_64-*)
285			# Boot loader is 32-bit, need the 32-bit libs and c++ config
286			bootLibgcc=`$gcc -m32 -print-file-name=libgcc.a`
287			bootLibSupCxx=`$gcc -m32 -print-file-name=libsupc++.a`
288
289			local headersBase=$gccdir/../../../..
290			local headers=$headersBase/$gccMachine/include/c++/$gccRawVersion
291			if [ ! -d $headers ]; then
292				headers=$headersBase/include/c++/$gccRawVersion
293			fi
294			bootCxxHeaders="$headers/$gccMachine/32"
295			;;
296	esac
297
298	# determine whether graphite loop optimization should/can be used
299	local useGraphite=`get_variable HAIKU_USE_GCC_GRAPHITE_$targetCpu`
300	if [ -z "$useGraphite" ]; then
301		useGraphite=$useGccGraphiteDefault
302	fi
303
304	if [ "$useGraphite" != 0 ]; then
305		UNUSED=`echo "int main() {}" | $gcc -xc -c -floop-block - 2>&1`
306		if [ $? != 0 ]; then
307			echo "GCC Graphite loop optimizations cannot be used on $targetArch"
308			useGraphite=0
309		fi
310	fi
311
312	set_variable HAIKU_CPU_$targetArch $targetCpu
313
314	get_build_tool_path CC_$targetArch "$gcc"
315	if [ $useClang = 1 ]; then
316		# The get_build_tool_path above is needed to get the path to the rest
317		# of the build tools
318		local path=`dirname $(get_variable HAIKU_CC_$targetArch)`
319		set_variable HAIKU_CC_$targetArch \
320			"PATH=\\\"$path:\\\$PATH\\\" clang -target $gccMachine"
321		set_variable HAIKU_CC_IS_CLANG_$targetArch 1
322	else
323		set_variable HAIKU_CC_IS_CLANG_$targetArch 0
324	fi
325	set_variable HAIKU_GCC_RAW_VERSION_$targetArch $gccRawVersion
326	set_variable HAIKU_GCC_MACHINE_$targetArch $gccMachine
327	set_variable HAIKU_GCC_LIB_DIR_$targetArch $gccdir
328	set_variable HAIKU_BOOT_CXX_HEADERS_DIR_$targetArch "$bootCxxHeaders"
329	set_variable HAIKU_BOOT_LIBSUPCXX_$targetArch "$bootLibSupCxx"
330	set_variable HAIKU_BOOT_LIBGCC_$targetArch $bootLibgcc
331	set_variable HAIKU_USE_GCC_GRAPHITE_$targetArch $useGraphite
332
333	standard_gcc_settings_targetArch=$targetArch
334}
335
336# set_variable
337#
338# Set the value of a variable.
339#
340set_variable()
341{
342	eval "$1=\"$2\""
343}
344
345# get_variable
346#
347# Echo the value of a variable.
348#
349get_variable()
350{
351	eval "echo \${$1}"
352}
353
354# set_default_value
355#
356# Set the value for a variable, if no value is set yet.
357#
358set_default_value()
359{
360	eval "$1=\${$1-$2}"
361}
362
363# get_build_tool_path
364#
365# Gets a usable absolute path of a build tool.
366#
367get_build_tool_path()
368{
369	local var="HAIKU_$1"
370	local path=$2
371
372	if [ -f "$path" ]; then
373		# get absolute path
374		local oldPwd="`pwd`"
375		cd "`dirname "$path"`"
376		path="`pwd`/`basename "$path"`"
377		cd $oldPwd
378	else
379		which "$path" > /dev/null 2>&1 || {
380			echo "Build tool \"$path\" not found." >&2
381			exit 1
382		}
383	fi
384
385	eval "$var=$path"
386}
387
388is_in_list()
389{
390	local element
391	for element in $2; do
392		if [ "$1" = "$element" ]; then
393			return 0
394		fi
395	done
396	return 1
397}
398
399# check for no params, --help or -h and show usage immediately
400if [ -z "$1" ] || [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
401	usage; exit 0;
402fi
403
404
405# get cwd and the source directory
406currentDir=`pwd`
407cd `dirname "$0"`
408sourceDir=`pwd`
409cd "$currentDir"
410
411# backup the passed arguments
412configureArgs="$@"
413
414# internal default parameter values
415#
416platform=`uname`
417platformMachine=`uname  -m`
418targetArchs=
419buildCrossTools=
420buildCrossToolsScript="$sourceDir/build/scripts/build_cross_tools"
421buildCrossToolsJobs=
422useClang=0
423useGccGraphiteDefault=0
424unknownArchIndex=1
425haikuTargetArchs=
426
427if [ -z "$CC" ]; then
428	CC=gcc
429fi
430
431# exported (BuildSetup) default parameter values
432#
433HOST_GCC_RAW_VERSION=`$CC -dumpversion`
434HOST_GCC_MACHINE=`$CC -dumpmachine`
435HAIKU_INCLUDE_GPL_ADDONS=0
436HAIKU_INCLUDE_PATENTED_CODE=0
437HAIKU_INCLUDE_SOURCES=0
438HAIKU_INCLUDE_3RDPARTY=0
439HAIKU_ENABLE_MULTIUSER=0
440HAIKU_DISTRO_COMPATIBILITY=default
441TARGET_PLATFORM=haiku
442HAIKU_USE_GCC_PIPE=0
443HAIKU_HOST_USE_32BIT=0
444HAIKU_HOST_USE_XATTR=0
445HAIKU_HOST_USE_XATTR_REF=0
446HAIKU_HOST_BUILD_ONLY=0
447HOST_EXTENDED_REGEX_SED="sed -r"
448HOST_GCC_LD=`$CC -print-prog-name=ld`
449HOST_GCC_OBJCOPY=`$CC -print-prog-name=objcopy`
450HOST_SHA256=
451HOST_HAIKU_PORTER=
452HAIKU_PORTS=
453HAIKU_PORTS_CROSS=
454HAIKU_BOOT_BOARD=
455HAIKU_NO_DOWNLOADS=0
456
457HAIKU_PACKAGING_ARCHS=
458
459set_default_value HAIKU_NASM		nasm
460
461if sha256sum < /dev/null > /dev/null 2>&1; then
462	HOST_SHA256=sha256sum
463elif sha256 < /dev/null > /dev/null 2>&1; then
464	HOST_SHA256="sha256 -q"
465elif shasum < /dev/null > /dev/null 2>&1; then
466	HOST_SHA256="shasum -a 256"
467else
468	echo "Error: Neither sha256sum nor sha256 seem to be available!" >&2
469	exit 1
470fi
471
472haikuRequiredLegacyGCCVersion="2.95.3-haiku-2014_07_26"
473export haikuRequiredLegacyGCCVersion
474	# version of legacy gcc required to build haiku
475supportedTargetArchs="
476	arm
477	m68k
478	ppc
479	x86
480	x86_64
481	x86_gcc2
482	"
483supportedTargetBoards="
484	beagle
485	raspberry_pi
486	verdex
487	"
488
489# determine output directory
490if [ "$currentDir" = "$sourceDir" ]; then
491	outputDir=$currentDir/generated
492else
493	outputDir=$currentDir
494fi
495buildOutputDir="$outputDir/build"
496HAIKU_BUILD_ATTRIBUTES_DIR="$outputDir/attributes"
497buildConfigFile="$buildOutputDir/BuildConfig"
498
499# check for update request
500if [ "$1" = "--update" ]; then
501	if ! [ -e "$buildConfigFile" ]; then
502		echo $0 --update: \'$buildConfigFile\' not found - updating not possible.
503		exit 1
504	fi
505	if ! type perl >/dev/null 2>&1; then
506		echo $0 --update: \'perl\' not found - updating not possible.
507		exit 1
508	fi
509	# convert BuildConfig from jam format to shell format and evaluate it
510	shellConfigFile="${buildConfigFile}.shell"
511	perl "$sourceDir/build/scripts/convert_build_config_to_shell_format.pl" \
512		<"$buildConfigFile" >"$shellConfigFile"
513	. "$shellConfigFile"
514	rm "$shellConfigFile"
515	shift
516fi
517
518# parse parameters
519#
520while [ $# -gt 0 ] ; do
521	case "$1" in
522		--bootstrap)
523			assertparams "$1" 3 $#
524			HOST_HAIKU_PORTER="`absolute_path $2`"
525			HAIKU_PORTS_CROSS="`absolute_path $3`"
526			HAIKU_PORTS="`absolute_path $4`"
527			check_file_exists "$HOST_HAIKU_PORTER" || (
528				echo "Invalid path to haikuporter: $HOST_HAIKU_PORTER" >&2
529				exit 1
530			)
531			check_dir_exists "$HAIKU_PORTS" || (
532				echo "Non-existent directory $HAIKU_PORTS" >&2
533				exit 1
534			)
535			check_dir_exists "$HAIKU_PORTS_CROSS" || (
536				echo "Non-existent directory $HAIKU_PORTS_CROSS" >&2
537				exit 1
538			)
539			shift 4
540			;;
541		--build-cross-tools)
542			if [ -z "$buildCrossTools" ]; then
543				assertparams "$1" 2 $#
544				targetArch=$2
545				buildCrossTools=$3
546				shift 3
547			else
548				assertparam "$1" $#
549				targetArch=$2
550				shift 2
551			fi
552			case "$targetArch" in
553				x86_gcc2)	targetMachine=i586-pc-haiku;;
554				x86)		targetMachine=i586-pc-haiku;;
555				x86_64)		targetMachine=x86_64-unknown-haiku;;
556				ppc)		targetMachine=powerpc-apple-haiku;;
557				m68k)		targetMachine=m68k-unknown-haiku;;
558				arm)		targetMachine=arm-unknown-haiku;;
559				*)
560					echo "Unsupported target architecture: $2" >&2
561					exit 1
562					;;
563			esac
564			set_variable buildCrossToolsMachine_$targetArch $targetMachine
565			targetArchs="$targetArchs $targetArch"
566			HAIKU_PACKAGING_ARCHS=
567			;;
568		--cross-tools-prefix)
569			assertparam "$1" $#
570			targetArch=unknown${unknownArchIndex}
571			set_variable crossToolsPrefix_$targetArch "$2"
572			targetArchs="$targetArchs $targetArch"
573			HAIKU_PACKAGING_ARCHS=
574			unknownArchIndex=$(($unknownArchIndex + 1))
575			shift 2
576			;;
577		--distro-compatibility)
578			assertparam "$1" $#
579			HAIKU_DISTRO_COMPATIBILITY=$2
580			case "$HAIKU_DISTRO_COMPATIBILITY" in
581				official)	;;
582				compatible)	;;
583				default)	;;
584				*)			echo "Invalid distro compatibility" \
585								"level: $HAIKU_DISTRO_COMPATIBILITY"
586							exit 1;;
587			esac
588			shift 2
589			;;
590		--enable-multiuser)	HAIKU_ENABLE_MULTIUSER=1; shift 1;;
591		--host-only)	HAIKU_HOST_BUILD_ONLY=1; shift 1;;
592		--include-gpl-addons)	HAIKU_INCLUDE_GPL_ADDONS=1; shift 1;;
593		--include-patented-code)	HAIKU_INCLUDE_PATENTED_CODE=1; shift 1;;
594		--include-sources)	HAIKU_INCLUDE_SOURCES=1; shift 1;;
595		--include-3rdparty)	HAIKU_INCLUDE_3RDPARTY=1; shift 1;;
596        -j*)				buildCrossToolsJobs="$1"; shift 1;;
597		--no-downloads)	HAIKU_NO_DOWNLOADS=1; shift 1;;
598		--target=*)     TARGET_PLATFORM=`echo $1 | cut -d'=' -f2-`; shift 1;;
599		--target-arch)
600			assertparam "$1" $#
601			targetArch=$2
602			shift 2
603			if [ ! "$platform" = Haiku ]; then
604				echo "--target-arch can only be specified on Haiku." >&2
605				exit 1
606			fi
607			is_in_list "$targetArch" "$supportedTargetArchs" || (
608				echo "Unsupported target architecture: \"$targetArch\"" >&2
609				exit 1
610			)
611			haikuTargetArchs="$haikuTargetArchs $targetArch"
612			;;
613		--target-board)
614			assertparam "$1" $#
615			HAIKU_BOOT_BOARD=$2
616			is_in_list "$HAIKU_BOOT_BOARD" "$supportedTargetBoards" || (
617				echo "Unsupported target board: \"$HAIKU_BOOT_BOARD\"" >&2
618				exit 1
619			)
620			shift 2
621			;;
622		--use-clang) useClang=1; shift 1;;
623		--use-gcc-pipe)	HAIKU_USE_GCC_PIPE=1; shift 1;;
624		--use-gcc-graphite)	useGccGraphiteDefault=1; shift 1;;
625		--use-32bit)	HAIKU_HOST_USE_32BIT=1; shift 1;;
626		--use-xattr)	HAIKU_HOST_USE_XATTR=1; shift 1;;
627		--use-xattr-ref)	HAIKU_HOST_USE_XATTR_REF=1; shift 1;;
628		*)				echo Invalid argument: \`$1\'; exit 1;;
629	esac
630done
631
632# detect the build platform
633case "${platform}" in
634	Darwin)	HOST_PLATFORM=darwin ;;
635	FreeBSD)	HOST_PLATFORM=freebsd
636				if [ "$HAIKU_HOST_USE_32BIT" = 1 ] ; then
637					echo Unsupported platform: FreeBSD ${platformMachine}
638					exit 1
639				fi	;;
640	Haiku)	HOST_PLATFORM=haiku_host ;;
641	Linux)	HOST_PLATFORM=linux ;;
642	OpenBSD) HOST_PLATFORM=openbsd ;;
643	SunOS)	HOST_PLATFORM=sunos ;;
644	CYGWIN_NT-*) HOST_PLATFORM=cygwin ;;
645	*)		echo Unsupported platform: ${platform}
646			exit 1 ;;
647esac
648
649# check for case-sensitive filesystem
650mkdir haikuCaseTest 2>/dev/null
651mkdir haikucasetest 2>/dev/null
652caseInsensitive=$?
653rmdir haikuCaseTest haikucasetest 2>/dev/null
654if [ $caseInsensitive != 0 ]; then
655	echo "You need a case-sensitive file-system to build Haiku."
656	if [ $HOST_PLATFORM = "darwin" ]; then
657		echo "You can create a case-sensitive disk image using Disk Utility and use"
658		echo "it to store the Haiku sources on."
659	fi
660	exit 1
661fi
662
663# determine how to invoke sed with extended regexp support for non-GNU sed
664if [ $HOST_PLATFORM = "darwin" ]; then
665	HOST_EXTENDED_REGEX_SED="sed -E"
666fi
667
668# check if nasm can actually output ELF files
669# (the stock version in OSX can't)
670# XXX: should probably only test for x86* arch
671if [ "$("$HAIKU_NASM" -hf | grep -c ELF'[36][24]\s')" -ne "2" ]; then
672	echo "$HAIKU_NASM cannot generate ELF files. Please install a working version."
673	if [ $HOST_PLATFORM = "darwin" ]; then
674		echo "You can install it from Mac Ports."
675		echo "Mac Ports is available at: http://www.macports.org/"
676	fi
677	exit 1
678fi
679
680# create output directory
681mkdir -p "$buildOutputDir" || exit 1
682
683if [ "$HAIKU_HOST_BUILD_ONLY" = 1 ]; then
684	invalidCommand=$sourceDir/build/scripts/host_build_only
685	HAIKU_AR=$invalidCommand
686	HAIKU_CC=$invalidCommand
687	HAIKU_LD=$invalidCommand
688	HAIKU_OBJCOPY=$invalidCommand
689	HAIKU_RANLIB=$invalidCommand
690	HAIKU_ELFEDIT=$invalidCommand
691	HAIKU_NASM=$invalidCommand
692	HAIKU_STRIP=$invalidCommand
693else
694	if [ -n "$HAIKU_PACKAGING_ARCHS" ]; then
695		targetArchs="$HAIKU_PACKAGING_ARCHS"
696	fi
697	HAIKU_PACKAGING_ARCHS=
698
699	# On Haiku determine target architectures and tools automatically.
700	if [ -z "$targetArchs" ]; then
701		if [ $HOST_PLATFORM != haiku_host ]; then
702			echo "Please specify the build tools to use or build (via" \
703				"--cross-tools-prefix or --build-cross-tools) or specify a" \
704				"host-only build (--host-only)." >&2
705			exit 1
706		fi
707
708		# determine primary architecture
709		targetArch=`package list -i /system/packages/haiku-*.hpkg \
710			| sed '/^\s*architecture:/!d; s,^\s*architecture:\s*,,'`
711		is_in_list "$targetArch" "$supportedTargetArchs" || (
712			echo "Unsupported target architecture: \"$targetArch\"" >&2
713			exit 1
714		)
715		targetArchs=$targetArch
716
717		set_default_value HAIKU_AR_$targetArch			ar
718		set_default_value HAIKU_CC_$targetArch			gcc
719		set_default_value HAIKU_LD_$targetArch			ld
720		set_default_value HAIKU_OBJCOPY_$targetArch		objcopy
721		set_default_value HAIKU_RANLIB_$targetArch		ranlib
722		set_default_value HAIKU_ELFEDIT_$targetArch		elfedit
723		set_default_value HAIKU_STRIP_$targetArch		strip
724
725		# determine secondary architectures
726		for targetArch in $supportedTargetArchs; do
727			if [ -e /system/packages/haiku_$targetArch-*.hpkg ]; then
728				targetArchs="$targetArchs $targetArch"
729				set_default_value HAIKU_AR_$targetArch		ar-$targetArch
730				set_default_value HAIKU_CC_$targetArch		gcc-$targetArch
731				set_default_value HAIKU_LD_$targetArch		ld-$targetArch
732				set_default_value HAIKU_OBJCOPY_$targetArch	objcopy-$targetArch
733				set_default_value HAIKU_RANLIB_$targetArch	ranlib-$targetArch
734				set_default_value HAIKU_ELFEDIT_$targetArch	elfedit-$targetArch
735				set_default_value HAIKU_STRIP_$targetArch	strip-$targetArch
736			fi
737		done
738
739		# The target architectures might have been specified explicitly.
740		if [ -n "$haikuTargetArchs" ]; then
741			for targetArch in $haikuTargetArchs; do
742				is_in_list "$targetArch" "$targetArchs" || (
743					echo "Unsupported target architecture: \"$targetArch\"." \
744						"Only native architectures of the host platform can" \
745						"be specified." >&2
746					exit 1
747				)
748			done
749			targetArchs="$haikuTargetArchs"
750		fi
751	fi
752
753	isPrimaryArch=1
754	for targetArch in $targetArchs; do
755		# Note: targetArch is "unknown<n>" at this point, if a cross-tools
756		# prefix was specified. The standard_gcc_settings call below will get
757		# the actual architecture.
758
759		crossToolsPrefix=`get_variable crossToolsPrefix_$targetArch`
760
761		# build cross tools from sources
762		if [ -n "$buildCrossTools" -a -z "$crossToolsPrefix" ]; then
763			crossToolsDir="$outputDir/cross-tools-$targetArch"
764			targetMachine=`get_variable buildCrossToolsMachine_$targetArch`
765			script="$buildCrossToolsScript"
766			scriptArgs=
767			if [ $targetArch != x86_gcc2 ]; then
768				script="${script}_gcc4"
769				scriptArgs="$targetMachine"
770				set_default_value HAIKU_USE_GCC_GRAPHITE_$targetArch	\
771					$useGccGraphiteDefault
772			fi
773			secondaryArch=
774			if [ -z "$isPrimaryArch" ]; then
775				secondaryArch=$targetArch
776			fi
777
778			case $HOST_PLATFORM in
779				freebsd|openbsd)	MAKE=gmake;;
780				*)					MAKE=make;;
781			esac
782
783			MAKE=$MAKE \
784			SECONDARY_ARCH=$secondaryArch \
785			HAIKU_USE_GCC_GRAPHITE=`get_variable \
786				HAIKU_USE_GCC_GRAPHITE_$targetArch` \
787			HAIKU_USE_GCC_PIPE=$HAIKU_USE_GCC_PIPE \
788			"$script" $scriptArgs "$sourceDir" "$buildCrossTools" \
789				"$crossToolsDir" $buildCrossToolsJobs || exit 1
790			crossToolsPrefix="$crossToolsDir/bin/${targetMachine}-"
791		fi
792
793		# prepare gcc settings and get the actual target architecture
794		gcc="${crossToolsPrefix}gcc"
795		if [ -z "${crossToolsPrefix}" ]; then
796			gcc=`get_variable HAIKU_CC_$targetArch`
797		fi
798		standard_gcc_settings "$gcc"
799		targetArch=$standard_gcc_settings_targetArch
800
801		# set default values for flags
802		set_default_value HAIKU_CPPFLAGS_$targetArch	""
803		set_default_value HAIKU_CCFLAGS_$targetArch		""
804		set_default_value HAIKU_CXXFLAGS_$targetArch	""
805		set_default_value HAIKU_LDFLAGS_$targetArch		""
806		set_default_value HAIKU_ARFLAGS_$targetArch		cru
807		set_default_value HAIKU_UNARFLAGS_$targetArch	x
808
809		# Override the cross tools variables, if the tools were built or a
810		# prefix was specified.
811		if [ -n "$crossToolsPrefix" ]; then
812			get_build_tool_path AR_$targetArch ${crossToolsPrefix}ar
813			get_build_tool_path LD_$targetArch ${crossToolsPrefix}ld
814			get_build_tool_path OBJCOPY_$targetArch ${crossToolsPrefix}objcopy
815			get_build_tool_path RANLIB_$targetArch ${crossToolsPrefix}ranlib
816			get_build_tool_path STRIP_$targetArch ${crossToolsPrefix}strip
817
818			case `get_variable HAIKU_GCC_RAW_VERSION_$targetArch` in
819				4.*)
820					get_build_tool_path ELFEDIT_$targetArch \
821						${crossToolsPrefix}elfedit
822				;;
823			esac
824		fi
825
826		# check whether the Haiku compiler really targets Haiku
827		targetMachine=`get_variable HAIKU_GCC_MACHINE_$targetArch`
828		case "$targetMachine" in
829			*-*-haiku)	;;
830			*)
831				echo The compiler specified as Haiku target compiler is not a \
832				valid Haiku cross-compiler. Please see ReadMe.cross-compile. >&2
833				echo compiler: $HAIKU_CC
834				echo compiler is configured for target: $targetMachine
835				exit 1 ;;
836		esac
837
838		HAIKU_PACKAGING_ARCHS="$HAIKU_PACKAGING_ARCHS $targetArch"
839		isPrimaryArch=
840	done
841fi
842
843# Generate BuildConfig
844cat << EOF > "$buildConfigFile"
845# BuildConfig
846# Note: This file has been automatically generated by configure with the
847# following arguments:
848# ${configureArgs}
849
850TARGET_PLATFORM 			?= "${TARGET_PLATFORM}" ;
851HOST_PLATFORM				?= "${HOST_PLATFORM}" ;
852
853HAIKU_INCLUDE_GPL_ADDONS			?= "${HAIKU_INCLUDE_GPL_ADDONS}" ;
854HAIKU_INCLUDE_PATENTED_CODE			?= "${HAIKU_INCLUDE_PATENTED_CODE}" ;
855HAIKU_INCLUDE_SOURCES				?= "${HAIKU_INCLUDE_SOURCES}" ;
856HAIKU_INCLUDE_3RDPARTY				?= "${HAIKU_INCLUDE_3RDPARTY}" ;
857HAIKU_ENABLE_MULTIUSER				?= "${HAIKU_ENABLE_MULTIUSER}" ;
858HAIKU_DISTRO_COMPATIBILITY			?= "${HAIKU_DISTRO_COMPATIBILITY}" ;
859HAIKU_USE_GCC_PIPE					?= "${HAIKU_USE_GCC_PIPE}" ;
860HAIKU_HOST_USE_32BIT				?= "${HAIKU_HOST_USE_32BIT}" ;
861HAIKU_HOST_USE_XATTR				?= "${HAIKU_HOST_USE_XATTR}" ;
862HAIKU_HOST_USE_XATTR_REF			?= "${HAIKU_HOST_USE_XATTR_REF}" ;
863HAIKU_HOST_BUILD_ONLY				?= "${HAIKU_HOST_BUILD_ONLY}" ;
864
865HAIKU_PACKAGING_ARCHS		?= ${HAIKU_PACKAGING_ARCHS} ;
866
867HAIKU_NO_DOWNLOADS			?= "${HAIKU_NO_DOWNLOADS}" ;
868
869HAIKU_BUILD_ATTRIBUTES_DIR	?= ${HAIKU_BUILD_ATTRIBUTES_DIR} ;
870
871HAIKU_NASM					?= ${HAIKU_NASM} ;
872HAIKU_BOOT_BOARD			?= ${HAIKU_BOOT_BOARD} ;
873
874HOST_EXTENDED_REGEX_SED		?= ${HOST_EXTENDED_REGEX_SED} ;
875HOST_GCC_RAW_VERSION		?= ${HOST_GCC_RAW_VERSION} ;
876HOST_GCC_MACHINE			?= ${HOST_GCC_MACHINE} ;
877HOST_LD						?= ${HOST_GCC_LD} ;
878HOST_OBJCOPY				?= ${HOST_GCC_OBJCOPY} ;
879HOST_SHA256					?= ${HOST_SHA256} ;
880
881HOST_HAIKU_PORTER			?= ${HOST_HAIKU_PORTER} ;
882HAIKU_PORTS					?= ${HAIKU_PORTS} ;
883HAIKU_PORTS_CROSS			?= ${HAIKU_PORTS_CROSS} ;
884
885EOF
886
887for targetArch in $HAIKU_PACKAGING_ARCHS; do
888	variables="
889		HAIKU_GCC_RAW_VERSION		HAIKU_GCC_RAW_VERSION
890		HAIKU_GCC_MACHINE			HAIKU_GCC_MACHINE
891		HAIKU_GCC_LIB_DIR			HAIKU_GCC_LIB_DIR
892		HAIKU_CPU					HAIKU_CPU
893		HAIKU_BOOT_LIBGCC			HAIKU_BOOT_LIBGCC
894		HAIKU_BOOT_LIBSUPC++		HAIKU_BOOT_LIBSUPCXX
895		HAIKU_AR					HAIKU_AR
896		HAIKU_CC					HAIKU_CC
897		HAIKU_CC_IS_CLANG			HAIKU_CC_IS_CLANG
898		HAIKU_LD					HAIKU_LD
899		HAIKU_OBJCOPY				HAIKU_OBJCOPY
900		HAIKU_RANLIB				HAIKU_RANLIB
901		HAIKU_ELFEDIT				HAIKU_ELFEDIT
902		HAIKU_STRIP					HAIKU_STRIP
903		HAIKU_CPPFLAGS				HAIKU_CPPFLAGS
904		HAIKU_CCFLAGS				HAIKU_CCFLAGS
905		HAIKU_C++FLAGS				HAIKU_CXXFLAGS
906		HAIKU_LDFLAGS				HAIKU_LDFLAGS
907		HAIKU_ARFLAGS				HAIKU_ARFLAGS
908		HAIKU_UNARFLAGS				HAIKU_UNARFLAGS
909		HAIKU_USE_GCC_GRAPHITE		HAIKU_USE_GCC_GRAPHITE
910		"
911	set -- $variables
912	while [ $# -ge 2 ]; do
913		value=`get_variable ${2}_$targetArch`
914		echo "${1}_${targetArch} ?= $value ;" >> "$buildConfigFile"
915		shift 2
916	done
917
918	# For variables that may have long values, distribute them over multiple
919	# lines so that jam doesn't hit the maximum line length.
920	variables="
921		HAIKU_BOOT_C++_HEADERS_DIR	HAIKU_BOOT_CXX_HEADERS_DIR
922		"
923	set -- $variables
924	while [ $# -ge 2 ]; do
925		echo "${1}_${targetArch} ?= " >> "$buildConfigFile"
926		get_variable ${2}_$targetArch | xargs -n 1 echo "   " \
927			>> "$buildConfigFile"
928		echo "    ;" >> "$buildConfigFile"
929		shift 2
930	done
931done
932
933
934# Generate a boot strap Jamfile in the output directory.
935
936cat << EOF > $outputDir/Jamfile
937# automatically generated Jamfile
938
939HAIKU_TOP			= ${sourceDir} ;
940HAIKU_OUTPUT_DIR	= ${outputDir} ;
941
942include [ FDirName \$(HAIKU_TOP) Jamfile ] ;
943
944EOF
945